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

그야… 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


입니다.

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

흐~~내일 다시 봅시다.

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

흐~~



+ Recent posts