dll injection 조사 1

자료조사/리버싱, 시스템 2015. 7. 22. 23:16

1.CreateRemoteThread를 이용한 방법.


dll을 로드시키기 위해 LoadLibrary를 사용할 수 없어서 CreateRemoteThread를 이용하는 방법이다.

windows에서는 API를 호출하도록 하는 API 제공하지 않는다고 한다.

그래서 새로운 스레드를 생성하면서 스레드 함수 주소로 LoadLibrary함수의 주소를 전달하고 그 파라미터 값으로 injection 하려는 dll파일의 경로를 전달하는 방식이다.


전체적인 진행은 대략 이러하다.


1. dwPID를 이용하여 대상 프로세스의 핸들을 구한다.

2. 대상 프로세스의 메모리에 dll의 경로를 넣기 위한 공간을 할당한다.

3. 할당받은 공간에 dll의 경로를 입력시킨다.

4. LoadLibraryA함수의 주소를 구한다.

5. CreateRemoteThread 함수를 사용하여 LoadLibraryA함수를 실행시킨다.


특이점: 

- 다른 프로세스의 메모리 공간에 접근하기 위해서는 Debug API에서 제공하는 함수들을 사용하면 된다.

  VirtualAllocEx(), VirtualFreeEx(), WriteProcessMemory(), ReadProcessMemory 등이 있다.

- 내가 이해한게 맞다면 LoadLibraryA()함수는 kernel32.dll에 들어있는 듯 하다. 그리고 이 dll은 모든 프로세스  에서 같은 주소에 위치하기 때문에 이를 이용해서 LoadLibraryA()함수의 주소를 구할 수 있다.

- 구한 API의 주소를 가지고 직접 호출시키는 API를 윈도우에서 제공하지 않으므로 새로운 스레드를 생성하면  서 스레드 함수 시작주소로 LoadLibraryA()함수의 주소를 전달하고 파라미터 주소로 inject하려는 dll의 주소를   전달한다.


--------------------------------예제-----------------------------------

from:revercore.com


#include "stdio.h"

#include "windows.h"

#include "tlhelp32.h"


#define DEF_PROC_NAME ("notepad.exe")

#define DEF_DLL_PATH ("c:\\work\\myhack.dll")


DWORD FindProcessID(LPCTSTR szProcessName);

BOOL InjectDll(DWORD dwPID, LPCTSTR szDllName);


int main(int argc, char* argv[])

{

DWORD dwPID = 0xFFFFFFFF;

// find process

dwPID = FindProcessID(DEF_PROC_NAME);

if( dwPID == 0xFFFFFFFF )

{

printf("There is no <%s> process!\n", DEF_PROC_NAME);

return 1;

}


// inject dll

InjectDll(dwPID, DEF_DLL_PATH);


return 0;

}


DWORD FindProcessID(LPCTSTR szProcessName)

{

DWORD dwPID = 0xFFFFFFFF;

HANDLE hSnapShot = INVALID_HANDLE_VALUE;

PROCESSENTRY32 pe;


// Get the snapshot of the system

pe.dwSize = sizeof( PROCESSENTRY32 ); // 296d (128h)

hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPALL, NULL ); // ProcessID = 0


// find process

Process32First(hSnapShot, &pe);

do

{

if(!_stricmp(szProcessName, pe.szExeFile))

{

dwPID = pe.th32ProcessID;

break;

}

}

while(Process32Next(hSnapShot, &pe));


CloseHandle(hSnapShot);


return dwPID;

}


BOOL InjectDll(DWORD dwPID, LPCTSTR szDllName)

{

HANDLE hProcess, hThread;

LPVOID pRemoteBuf;

DWORD dwBufSize = lstrlen(szDllName) + 1;

LPTHREAD_START_ROUTINE pThreadProc;


if ( !(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) )

return FALSE;


pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);


WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szDllName, dwBufSize, NULL);


pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

hThread = CreateRemoteThread(hProcess, NULL, 0, pThreadProc, pRemoteBuf, 0, NULL);

WaitForSingleObject(hThread, INFINITE);


CloseHandle(hThread);

CloseHandle(hProcess);


return TRUE;

'자료조사 > 리버싱, 시스템' 카테고리의 다른 글

dll injection 추가  (0) 2015.07.25
dll injection 조사 3.  (0) 2015.07.23
dll injection 조사 2  (0) 2015.07.23
Win api를 이용한 gui 개발  (0) 2015.07.16
Tags
Social