728x90

자, 아래의 예제에는, 두개의 함수가 있어요. FindProcessID, DLLInjection

각, 하는 일을 말씀드릴께요. FindProcessID 같은경우.

해당 프로세스명 ( 예제에서 사용된 프로세스명 : winmine.exe [지뢰찾기]) 을 입력받아 그 프로세스명의 ProcessID를 얻어냅니다.

DLL Injection 같은경우, 말 그대로, 이번강좌에서 가장많이 거론하게 될 DLL INJECTION 을 해주는 함수입니다.

자, 그럼 DLL INJECTION 이라는 기법 을 배우기전에. DLL INJECTION 은 뭐하는건지부터 알아 봐야겠지요.

DLL INJECTION 이란, 실행되어있는 프로세스에. 제작된 DLL을 강제로 주입시키는 기법이에요.

에- 그럼, 우리는 대체 아무허락없이 어느 프로세스에 DLL을 강제주입시키겠다는거지요?

윈도우즈 기본게임인 지뢰찾기의 지뢰를 찾아주는 버그를 제작해보도록 할거랍니다.

요새 N사의 fps 게임 S****N A****K 이라는 게임에.이 기법으로 안좋은 버그프로그램들이 자주 생성되고있어요.

N사의 게임 SA은, 하루빨리 쉘값 +- 원리로 제작된 DLL 을 INJECTION 당하지않게 빠른패치를 바래요.

에- 얘기가 한강으로 흘러갔네요. 다시 주워담아. 강좌를 시작하도록해요.

뭔가 프로세스에 강제로 제작된 DLL을 강제로 주입시킨다.. 뭔가 대단해보이지않아요?

영어 단어발음도 대단하잖아요. 인젝션. 뭔가 있어보여요 !

자. DLL INJECTION 의 매우 긴 서론은 집어치우고 어서빨리 FindProcessID 라는 함수를 파헤쳐봐요.

다음 강좌인 2부강좌에서는 실제로 DLL INJECTION 이라는 기법을 이용하기위해 어떤 코딩을하는지 DLLInjection 함수를 파헤쳐보기로해요.

메인에서 첫번째인수를 통해 FindProcessID이라는 함수를 접속(?) 합니다. 그 첫번째인수 받은걸 PathDLL 이라는

FindProcessID 만의 첫번째 인수로 등록되어 char* 이라는 자료형으로 접속합니다.

첫번째 줄을 봅시다.DWORD dwPID = 0xFFFFFFFF;
0xFFFFFFFF 이건 16진수로 표기되어, -1 이라는 같은소리입니다. 즉, 우리가 초기화를 0으로 하듯. dwPID도 -1로 설정하는것이지요.


HANDLE hSnapShot = INVALID_HANDLE_VALUE;
이건 짧게설명하겠습니다. hSnapShot이라는 변수를 핸들값을 저장하기위해 HANDLE로 선언하고 내용을 빈공간으로 채웁니다.

PROCESSENTRY32 pe;

처음보는 PROCESSENTRY32 이지요?

PROCESSENTRY32 은 프로세스와 관련구조체입니다.

typedef struct tagPROCESSENTRY32{

DWORD dwSize;

DWORD cntUsage;

DWORD th32ProcessID;

ULONG_PTR th32DefaultHeapID;

DWORD th32ModuleID;

DWORD CntThreads;

DWORD th32ParentProcessID;

LONG pcPriClassBase;

DWORD dwFlags;

TCHAR szExeFile[MAX_PATH];

} PROCESSENTRY32,

*PROCESSENTRY32;

해당 구조체의 본모습입니다. 더이상 알게되면 혼동되니 여기서 마치겠습니다.

본격적인 코딩에 들어갑니다.

pe.dwSize = sizeof( PROCESSENTRY32 );

pe.dwSize 에 PROCESSENTRY32 의 사이즈를 넣어줍니다.

hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPALL, NULL );
여기서 잠깐. CreateToolhelp32Snapshot 이라는 API는 뭐하는 API인가요?

프로세스 주소안의 리스트를 저장하는 API입니다,

결론적으로 해당 소스코드는 스냅샷이 되었을때, hSnapShot에 저장합니다.

Process32First(hSnapShot, &pe);

해당 Process32First API는 Process32Next와 같이 사용되는 API입니다.

딱히 평균이상으로 혼자 사용되지 않는 API로써, 설명은 하지 않겠습니다.

do ~while 을 돌면서 if(!_stricmp(szProcessName, pe.szExeFile)) 해당구문으로 stricmp 로 pe.szExeFile 에 저장된

프로세스들과 첫번째 인수인 szProcessName이 맞는지 체크합니다.


만약에 맞으면, dwPID이라는 변수에 구조체 안의 th32ProcessID 를 대입합니다.

그리고 loop를 빠져나옵니다.

빠져나온뒤로 hSnapShot을 닫아준뒤,

PID값을 리턴합니다.

후. 이정도로 FindProcessID를 하나하나 쪼개보았는데요. 역시 다른 API에비해 어려운 기법이다보니

내용이 상당이 많이 길어진거같군요. 이해될때까지 확인해주시면 되겠습니다.

다음 강좌에서는 DLL INJECTION 마지막 강좌, 즉 API에서 강좌는 나중에 다시 작성할예정이며,

투표결과대로 알고리즘강좌를 다다음 강좌부터 소개하도록 하겠습니다.

아래에있는 예제는 해당 강좌가 끝이날때까지 제공됩니다.

#include <cstdio>
#include <Windows.h>
#include <TlHelp32.h>

DWORD FindProcessID(LPCTSTR szProcessName);
bool DLLInjection(DWORD PID, char* PathDLL);

int main()
{
DLLInjection(FindProcessID("winmine.exe"), "C:\\showmine.dll");
}

DWORD FindProcessID(LPCTSTR szProcessName)
{
DWORD dwPID = 0xFFFFFFFF;
HANDLE hSnapShot = INVALID_HANDLE_VALUE;
PROCESSENTRY32 pe;

pe.dwSize = sizeof( PROCESSENTRY32 );
hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPALL, NULL );

Process32First(hSnapShot, &pe);

do{
if(!_stricmp(szProcessName, pe.szExeFile)){
dwPID = pe.th32ProcessID;
break;
}
}
while(Process32Next(hSnapShot, &pe));

CloseHandle(hSnapShot);

return dwPID;
}

bool DLLInjection(DWORD PID, char* PathDLL)

{
HANDLE hProcess, hThread;
HMODULE hMod;
LPVOID pRemoteBuf;
DWORD dwBufSize = lstrlen(PathDLL) + 1;
LPTHREAD_START_ROUTINE pThreadProc;

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);

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

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

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

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

CloseHandle(hThread);
CloseHandle(hProcess);

return TRUE;
}

출처 : http://cafe.naver.com/funcc.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=4490&


728x90

'Algorithm' 카테고리의 다른 글

재귀 없는 퀵소트 (non recursive quick sort)  (0) 2013.04.07
DFS  (0) 2012.07.29
DLL INJECTION - 2  (0) 2012.07.29
DFS ; Depth-First-Search  (0) 2012.07.29
그래프 탐색 알고리즘  (3) 2012.07.29

+ Recent posts