지뢰찾기 핵

hooking 2009. 11. 1. 18:01 |
somma 님이 만든 지뢰찾기 핵이다. thread injection이라는 기법을 사용하여 원격의 프로세스에 원하는 코드를 실행시킨다고 한다.
http://somma.egloos.com/2881725

기존 소스에서 프로세스를 찾아주는 코드와
증분링크테이블(ILT)체크를 위한 조건을 추가하였다.(http://hongyver.pe.kr/ttblog/entry/증분링크)

================================================================================================
__declspec( naked )
DWORD __stdcall injetor_stub(void* pBlock)
{
    __asm      /* prolog */
    {
        push   ebp
        mov      ebp, esp
        sub      esp, __LOCAL_SIZE
    }
    __asm
    {
        mov   eax, 0x0A
        push  eax
        mov   eax, 0x01002F80
        call  eax
    }
    __asm      /* epilog */
    {
        xor eax, eax          // always return 0 (33 C0)
        mov esp, ebp
        pop ebp
        /* epilog signature */
        xor eax, eax
        xor eax, eax
        ret 4             // 0xC3
    }
}

int main(int argc, char* argv[])
{
    HWND hwnd;
    DWORD dwPid;
    hwnd = FindWindow(0, "지뢰 찾기");
    //지뢰찾기게임이 열려있을경우 윈도우 핸들러를 얻는다.

    GetWindowThreadProcessId(hwnd, &dwPid);
    //알아낸 핸들러 값을 통해 지뢰찾기 프로세스ID를 얻는다.

    HANDLE hProc = OpenProcess(
        PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION |
        PROCESS_VM_WRITE | PROCESS_VM_READ,
        FALSE,
        dwPid);
    //지뢰찾기 프로세스에 대한 핸들을 얻는다.
   
    DWORD FunctionRVA = (DWORD)injetor_stub;
    if (FunctionRVA < 0x80000000 && *(PBYTE)FunctionRVA == 0xE9)
    {
        FunctionRVA = ((DWORD)(FunctionRVA) + (*(DWORD *)((PBYTE)FunctionRVA+1)) + 5);
    }
    //삽입할 함수(injetor_stub)의 주소값을 구한다.
    //컴파일시 증분링크 테이블이 존재하면 injetor_stub은 증분링크 주소를 나타내기 때문에
    //정확하게 함수가 정의된 주소를 알려주기 위한 코드이다.

    int proc_size = 51;
    // 삽입할 코드사이즈(대충;;)

    char* proc_buf = (char *) VirtualAllocEx( hProc,
        0,
        proc_size,
        MEM_COMMIT,
        PAGE_EXECUTE_READWRITE);
    // 지뢰찾기 프로세스에 51만큼 메모리공간을 할당한다.

    if (hProc == NULL)
    {
        printf("openprocess error");
    }

    DWORD dwBytesWritten = 0;

    if (0 == WriteProcessMemory(hProc,
        proc_buf,
        (char *)FunctionRVA,
        proc_size,
        &dwBytesWritten))
    {
        printf("writeprocessmemory error");
    }
    // 할당한 메모리영역에 삽입할 코드를 입력한다.

    DWORD dwTid = 0;
    HANDLE hThread = CreateRemoteThread( hProc,
        NULL,
        0,
        (LPTHREAD_START_ROUTINE)proc_buf,
        NULL,
        CREATE_SUSPENDED,
        &dwTid);
    if(hThread==0)
    {
        printf("createremotethread error");
    }
    //지뢰찾기 프로세스에 스레드생성    

    ResumeThread(hThread);
   
    WaitForSingleObject(hThread, INFINITE);
   
    CloseHandle(hThread); hThread = NULL;
    VirtualFreeEx(hProc, proc_buf, proc_size, MEM_RELEASE);
    proc_buf = NULL;
   
    CloseHandle(hProc); hProc = NULL;
   
    return 0;
}


================================================================================================



'hooking' 카테고리의 다른 글

outputdebugstring사용  (0) 2011.06.25
[펌]메시지훅 예제  (0) 2009.11.02
hooking_study_1  (0) 2009.10.23
DLL Injector  (0) 2009.10.02
Posted by applicationlayer
:

DbgView

tips 2009. 10. 23. 14:29 |

windows.h인클루드


사용법
OutputDebugString("졸려");

Dbgview.exe


'tips' 카테고리의 다른 글

Apache DefaultCharset  (0) 2009.12.04
IE 8.0에서 세션공유기능 해제  (0) 2009.11.17
Microsoft Network Monitor  (0) 2009.10.02
WireShark의 부가기능  (0) 2009.10.01
Open Command Line on this Location  (0) 2009.09.30
Posted by applicationlayer
:

hooking_study_1

hooking 2009. 10. 23. 13:39 |
dll injection을 통해 crackme인증우회(메모리 변경)




=============인젝션할 dll=========================================
#include <stdio.h>

#include <windows.h>

#define EXPORT extern "C" __declspec(dllexport)

// DLL을 로드한 곳에서 EXPORT한 함수명을 쓸수있게 함



BOOL Change()
{
    BYTE *pJumpAddr; //조건분기문 주소 포인터
    DWORD dwOldProtect;
    DWORD dw;
    pJumpAddr = (BYTE *)0x00401160; //조건분기문위치
    //GetProcAddress 필요없음
    VirtualProtect(pJumpAddr, 2, PAGE_WRITECOPY, &dwOldProtect);
   
    *pJumpAddr = 0x90; //nop
    *(pJumpAddr + 1) = 0x90; //nop
    VirtualProtect(pJumpAddr, 2, dwOldProtect, &dw);
    return TRUE;
}

BOOL APIENTRY DllMain(HANDLE hModule,

                      DWORD ul_reason_for_call,

                      LPVOID lpReserved)

{
    switch(ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:


        Change();
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;

}

'hooking' 카테고리의 다른 글

outputdebugstring사용  (0) 2011.06.25
[펌]메시지훅 예제  (0) 2009.11.02
지뢰찾기 핵  (0) 2009.11.01
DLL Injector  (0) 2009.10.02
Posted by applicationlayer
: