음...다시 새날이 밝았습니다.

안녕하세요..미친감자 김주생입니다.


오직 하나님께 미친고 예수님께 미치고 성령님께 미치면...됩니다.

할렐루야~!!


자...음..요즘 제가 갑자기.. CreateRemoteThread()를 요즘 씹어 먹고 있습니다.

흐~~





그러게요...왜이렇게 제가 당신에게 관심을 갖는 것일까요?

음…

그야… CreateRemoteThread()란 놈이 아주 특이하니께…

제가 관심을 갖죠…

왜? 자기 프로세스가 아닌 다른 프로세스에 스레드를 만들고 그러냐 이겁니다.

그게 아주 특이하니께...제가..관심을 갖는 것입니다.

그리고, DLL Injection 공격 방법으로도 사용되고 있으니..

미친감자가 관심을 갖을 수 밖에요…그렇지 않겠습니까요?


자...오늘은  말이죠…. 3번째...이야기가 되는 것인데…

저는 CreateRemoteThread()의 일반적인 사용방법에 대해서 알아볼까합니다.

공격말고~!


일반적인 사용법말입니다…

어떻게 하면 다른 프로세스에 스레드를 집어넣을 수 있을 까 말입니다.

디엘엘 인젝션(DLL Injection)말고 말입니다.


그래서 인터넷에서 찾아낸 소스가…

https://github.com/meizhitu/SimpleUI/blob/master/CreateRemoteThread.cpp ← 이 소스는 중국분께서 만드셨고...디엘엘 인젝션 이 아니고 순수하게 메모리를 할당하고 스레드를 만드는 방식이였습니다.

그런데, Windows 8에서 잘 안되는 것 같습니다. 어제 잠깐 테스트하는 동안 에러가 계속 발생합니다.


아..그리고, 다른 프로세스에 스레드를 만든것이 결코 쉬운일이 아닙니다….


흐..스레드 인젝션을 당한 쪽에서..계속 죽었습니다.

저는 크롬(Chrome)프로세스에 리모트 스레드를 만들었었죠...그랬더니

이렇게 되어 있었습니다…


웹페이지를 표시하는 동안 문제가 발생했구나…

내가 스레드를 만든건데...이런..

뭐가 문제일까요? 여러분~!


여러분~!...

그러게요~

뭐가 문제죠~!

다시 잘해보세요~미친감자~

뭔가 실수하신게 있을 수 있잖아요~!!

다른 프로세스를 선택해서 해보세요^^


이런~

스카이도 죽었습니다…

이런 왜그럴까요?

음...도대체...어떤 프로세스에...스레드가 생성되는 것일까요?


오늘은 여기까지..

계속..이야기는 지속됩니다.~~


오늘도 승리 승리 무조건 승리

만번을 외치자…~~

오직 예수 그리스도만 바라보자~~

바라봄의 법칙이 있다!


자~ 오늘은 무신이야기를 계속할까요~

그야… CreateRemteThread()라는 녀석에 대해서 더 이야기 해야겠죠…

칼을 꺼냈으니…

무우라도 잘라요죠…

그렇죠^^~!

무우를 주세요~!


대걸레를 들고..뭐하는 것일까?

정말 무우를 자르려고 하는가 보군요~!!


자…

이 전 이야기에서 저는 다른 프로세스에 스레드를 만드는 방법에 대해서

이야기를 시작했었요~~

기억 나시나요~


프로세스들은 모두다 독립된 메모리공간을 가지고 있기 때문에.

다른 프로세스의 메모리에 뭔가를 한다는 것이 이상한 것입니다.

하지만, 권한만 있다면, 이게 다 가능하다죠~~!!

ㅋ~


그게 다 ...OpenProcess()함수가 있기 때문에 가능한거죠~!

그렇죠?


HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);


기억 나시죠^^?

PID (Process ID)만 알고 있으면, 해당 프로세스의 핸들을 알아내고, 그 핸들을 이용하여 메모리를 할당 할 수 있는 것입니다.

VirtualAllocEx()함수를 이용해서 말이죠~!!



//1. OpenProcess로 프로세스를 오픈한다.

HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);


//2. 오픈된 프로세스에 가상메모리를 할당한다.

void* pRemoteThread = VirtualAllocEx(hTargetProcess,

0,

dwThreadSize,

MEM_COMMIT | MEM_RESERVE,

PAGE_EXECUTE_READWRITE);



자~ Now~

VirtualAllocEx()함수를 이용하여 할당한 메모리에 이번에는 WriteProcessMemory()함수를 이용하여 스레드 함수를  복사해 봅시다.


//3. 새로 추가한 메모리에 스레드 함수를 복사한다.

WriteProcessMemory( hTargetProcess,

    pRemoteThread,

                   &threadProc,

                   dwThreadSize,

                   0);




새로 할당한 메모리 pRemoteThread에, 스레드 함수 threadProc()을 복사하는 것입니다.~

알겠죠~

dwThreadSize 만큼요~!


알겠죠~!


그런데, 요 시점에서~~

스레드함수를 알아봐야 겠죠~!

스레드 함수...라는 것은 뭐냐?

스레드를 만들때 사용되는 함수입니다.


뭐시기? 스레드를 만든때 사용하는 함수?

그냥 아무것나 사용하면 안되는 것여^^?




그렇습니다. 스레드를 만들 때는 무조건…

다음 형태의 함수이어야 합니다.


잘보세요~~!


DWORD WINAPI ThreadProc(
 _In_  LPVOID lpParameter
);


그렇습니다. 인자는 한개의 LPVOID 형 ...리턴값은..DWORD

함수 호출 방식은 WINAPI 즉~ __stdcall 방식이고요~~


#define WINAPI      __stdcall


입니다.

흐….오늘도 멀리 가지 못했군요…

흐~~내일 다시 봅시다.

물방울로 바위를 뚤을것입니다.

흐~~



7개의 인자를 채워 넣어줘야 한다.

이중에서 제일 중요한 것은 제 생각엔~

lpStartAddress가 제일 중요한것 같다…왜냐하면, 함수가 있어야 스레드를 만들 수 있으니까!!!


다른 프로세스에 스레드를 만들기 위해서는 스레드용 함수가 있어야 한다.

그런데, CreateRemoteThread()에 전달해줘야할 스레드 함수 주소는 다른 프로세스에 있는 함수 주소이어야 한다고 한다.(이게 무슨 말인인지 이해가 가는가?)

즉, CrateRemoteThread()함수를 호출 하는 프로세스의 함수를 전달해서는 안되는 것이다.


자. 프로세스라는 녀석들은 각자 독립된 메모리 공간을 가진다.




자~ 그런데 어떻게 다른 주소공간에 있는 함수주소를 알아내어서 그 함수를 스레드로 만들 수 있는 것일까요~!


궁굼하시죠~!

자~

방법이 있습니다~!

다른 프로세스에 메모리를 할당하고 그 메모리에 함수를 복사하고 그 복사된 함수를 호출해주면 된다.

이해할 수 있겠는가?



  1. 다른 프로세스에 메모리를 할당한다.

  2. 그 메모리에 내 주소 공간에 있는 함수를 복사한다.

  3. 복사된 함수를 CreateRemoteThread()함수에 전달한다.




자~

다른 프로세스에 메모리를 할당하는 방법은 다음과 같습니다.


  1. 다른 프로세스의 PID(Process ID)값을 알아낸다.

  2. PID를 이용하여 OpenProcess()하여 핸들을 알아낸다.

  3. VirtualAllocEx()함수를 이용하여 PID의 프로세스에 메모리를 할당한다.



HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);


void* pRemoteThread = VirtualAllocEx(hTargetProcess,

0,

dwThreadSize,

MEM_COMMIT | MEM_RESERVE,

PAGE_EXECUTE_READWRITE);



오늘은 여기까지..

내일은..

함수 복사하고, 스레드 만들고 까지 해보죠~!



+ Recent posts