dll injector & keyboard hooking
Posted 2007. 7. 30. 09:28, Filed under: Study/Computer Science void DllInject(DWORD pid, char * path) // pid : 인젝션 하려는 Process id
// path : 인젝션 될 dll의 경로
{
HANDLE hProcess;
HMODULE hDll;
PTHREAD_START_ROUTINE pFunc;
DWORD nLen;
void * pMem;
HANDLE hThread;
// target process의 PID로 프로세스를 연다
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
// 내 프로세스에 있는 KERNEL32.DLL의 주소와 LoadLibrary의 주소를 구한다.
// kernel32.dll 모듈의 핸들값을 GetModuleHandle로 구한다.
hDll = GetModuleHandle("kernel32.dll");
// PTHREAD_START_ROUTINE은 미리 정의되어 있는 스레드 함수 모양의 함수 포인터
// LoadLibray 함수의 주소를 얻어옴
pFunc = (PTHREAD_START_ROUTINE)GetProcAddress(hDll, "LoadLibraryA");
// 계산기의 주소공간에 메모리를 할당하고, DLL의 경로를 복사해준다.
// VirtualAlloc은 가상 메모리를 할당하는 API이지만,
// Ex가 붙으면 다른 프로세스의 주소공간을 할당할 수 있다.
pMem = VirtualAllocEx(hProcess, 0, // 원하는 주소(0은 알아서 해달라)
strlen(path) + 1, // 크기
MEM_RESERVE | MEM_COMMIT, // 예약과 동시 확정
PAGE_READWRITE
);
// 이제 DLL의 경로를 담을 문자열 복사
// WriteProcessMemory()는 다른 프로세스 주소 공간에 무언가를 쓸 수 있다.
WriteProcessMemory(hProcess, pMem, path, strlen(path)+1, &nLen);
// 계산기에 새로운 스레드를 만든다.
// CreateRemoteThread는 다른 프로세스에 스레드를 생성시킨다.
hThread = CreateRemoteThread(hProcess, 0, 0, pFunc, pMem, 0, 0);
CloseHandle(hThread);
CloseHandle(hProcess);
}
void main(){
HWND hwnd;
DWORD pid;
DWORD tid;
hwnd = FindWindow(0, "계산기");
if( hwnd == 0 )
{
printf("\"계산기\"를 먼저 실행하여야 정상 동작합니다.\n");
return;
}
tid = GetWindowThreadProcessId(hwnd, &pid);
DllInject(pid, "C:\\Inject.dll");
}
#include <windows.h>
// 원래 계산기의 메세지 함수의 주소를 담을 변수
WNDPROC oldProc;
// 계산기의 메세지를 처리할 새로운 함수
LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
UINT cmdID;
switch( nMsg )
{
case WM_COMMAND:
cmdID = LOWORD(wParam);
if( cmdID >= 0x7C && cmdID <= 0x85 )
return CallWindowProc(oldProc, hWnd, nMsg, wParam + 1, lParam + 1);
break;
}
return CallWindowProc(oldProc, hWnd, nMsg, wParam, lParam);
}
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){
HWND hwnd;
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
hwnd = FindWindow(0, "계산기");
oldProc = (WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (LONG)WndProc);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
어제 운연이가 갑자기 물어봤던 키보드 메세지 후킹과 dll 인젝션-
하도 많이 듣고 자주 보던 것들이지만 막상 구현해놓은 소스를 보니까 없고 해서
어떤 식으로 하는지에 대해 관련 기법이랑 문서만 알려주고 말았는데
오늘 회사에서 전에 공부하던걸 찾아봤다.
구체적인 방법도 알고있는 거랑 해보는 거랑은 좀 다른 것 같다.
막연히 알고 있는데서 그치지 말고 실제로 내가 할 수 있는 나의 스킬로 만들어야겟다.
그래야 필요할 때 써먹지 ㅋ