Ring3 Hook API

/*Ring3 Hook API 本进程内*/
#include<windows.h>
#include<stdio.h>

typedef (WINAPI *pMessageBoxDef)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);

char szOldMessageBox[5] = {0};
char szJmpMyMessageBox[5] = {(char)0xe9}; //0xe9为jmp指令

pMessageBoxDef  pMessageBox = NULL;

int WINAPI MyMessageBox(
  HWND hWnd,          // handle of owner window
  LPCTSTR lpText,     // address of text in message box
  LPCTSTR lpCaption,  // address of title of message box
  UINT uType          // style of message box
)
{

    printf("函数拦截成功,可以修改传进来的参数,做坏事啦,只是一个例子!\n");

    WriteProcessMemory((void*)-1, pMessageBox, szOldMessageBox, 5, NULL);

    MessageBoxW(hWnd, lpText, lpCaption, uType);

    WriteProcessMemory((void*)-1, pMessageBox, szJmpMyMessageBox, 5, NULL);
    
    return 0;
}

int main()
{
    DWORD dwJmpAddr = 0;//jmp指令jmp到的地址


    HMODULE hModule  = LoadLibrary("USER32.dll");
    

    pMessageBox = GetProcAddress(hModule, (LPCSTR)"MessageBoxW");
 
    dwJmpAddr = (DWORD)MyMessageBox - (DWORD)pMessageBox - 5;//MyMessageBox是函数入口地址 pMessageBox也是函数入口地址
    //pMessageBox(0,0,0,0);
    memcpy(szJmpMyMessageBox + 1, &dwJmpAddr, 4);//dwJmpAddr = 0x8869AACC(只是我机器上的,这个数值会变动)

    FreeLibrary(hModule);

     ReadProcessMemory((void*)-1, pMessageBox, szOldMessageBox, 5, NULL);//读出原来的前5个字节 在地址pMessageBox(0x77d66534)处:
                                                                         //8B FF 55 8B EC
    WriteProcessMemory((void*)-1, pMessageBox, szJmpMyMessageBox, 5, NULL);//写入我们处理后的5个字节 在地址pMessageBox(0x77d66534)处:
                                                                            //E9 CC AA 69 88 (jmp 0X8869AACC)


    MessageBoxW(GetForegroundWindow(), L"Inline Hook:MessageBox", L"HOOK API", MB_OK);

    MessageBoxW(GetForegroundWindow(), L"Hello World", L"Win32", MB_OK);

    return 0;
}

posted @ 2013-06-12 19:13  foo__hack  阅读(151)  评论(0)    收藏  举报