외규장각 도서 환수 모금 캠페인

dll injector & keyboard hooking

Posted 2007. 7. 30. 09:28, Filed under: Study/Computer Science
// DLL Inject : 다른 프로세스의 주소 공간에 특정 DLL을 넣는다.

 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 인젝션-
하도 많이 듣고 자주 보던 것들이지만 막상 구현해놓은 소스를 보니까 없고 해서
어떤 식으로 하는지에 대해 관련 기법이랑 문서만 알려주고 말았는데
오늘 회사에서 전에 공부하던걸 찾아봤다.
구체적인 방법도 알고있는 거랑 해보는 거랑은 좀 다른 것 같다.

막연히 알고 있는데서 그치지 말고 실제로 내가 할 수 있는 나의 스킬로 만들어야겟다.
그래야 필요할 때 써먹지 ㅋ
Response : ,


Recent Posts

Recent Comments

Recent Trackbacks

Total hit (Today , Yesterday )

Admin Write Post