#include <windows.h>
#include <iostream>
#include <iomanip>
using namespace std;
IMAGE_IMPORT_DESCRIPTOR* GetImportDesc(HMODULE);
typedef int (_stdcall *PFNMESSAGEBOX)(HWND,LPCTSTR,LPCTSTR,UINT);
PROC g_orgProc=(PROC)MessageBoxA;
int _stdcall MyMessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType )
{
return ((PFNMESSAGEBOX)g_orgProc)(hWnd,"LHook",lpCaption,uType);
}
bool SetHook(HMODULE hMod);
void main()
{
::MessageBox(NULL,"PreHook","IAT",MB_OK);
HMODULE hMod=::GetModuleHandle(NULL);
if(SetHook(hMod)
 ::MessageBox(NULL,"PreHook","IAT",MB_OK);}
IMAGE_IMPORT_DESCRIPTOR* GetImportDesc(HMODULE hMod)
{
IMAGE_DOS_HEADER* pDosHeader=(IMAGE_DOS_HEADER*)hMod;
    IMAGE_NT_HEADERS* pNtHeader=(IMAGE_NT_HEADERS*)((BYTE*)hMod+pDosHeader->e_lfanew);
    IMAGE_OPTIONAL_HEADER* pOptHeader=(IMAGE_OPTIONAL_HEADER*)((BYTE*)hMod+pDosHeader->e_lfanew+24);
    IMAGE_IMPORT_DESCRIPTOR* pImportDesc=(IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)hMod+pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
return pImportDesc;
    
}bool SetHook(HMODULE hMod)
{
IMAGE_IMPORT_DESCRIPTOR* pImportDesc=GetImportDesc(hMod);
while(pImportDesc->FirstThunk)
{
char* pszName=(char*)((BYTE*)hMod+pImportDesc->Name);
if(lstrcmpiA(pszName,"User32.dll")==0)
     break;
pImportDesc++;
}
if(pImportDesc->FirstThunk)
{
IMAGE_THUNK_DATA* pThunk=(IMAGE_THUNK_DATA*)((BYTE*)hMod+pImportDesc->FirstThunk);
    while(pThunk->u1.Function)
{
DWORD* lpAddr=(DWORD*)&(pThunk->u1.Function);
if(*lpAddr==(DWORD)g_orgProc)
{
DWORD* lpNewProc=(DWORD*)MyMessageBox;
MEMORY_BASIC_INFORMATION mbi;
DWORD dwOld;
memset(&mbi,   0,   sizeof(MEMORY_BASIC_INFORMATION));   
::VirtualQuery(lpAddr,&mbi,sizeof(mbi));
::VirtualProtect(lpAddr,sizeof(DWORD),PAGE_READWRITE,&dwOld);
::WriteProcessMemory(::GetCurrentProcess(),
lpAddr,&lpNewProc,sizeof(DWORD),NULL);
::VirtualProtect(lpAddr,sizeof(DWORD),dwOld,0);
return true;
}
}
}
return false;}
DEBUG运行是可以看到MessageBoxA已经被HOOK了,但在Release下可以运行并且SetHook也是返回true,但结果是MessageBoxA没被HOOK掉,
这里已经调用了
::VirtualQuery(lpAddr,&mbi,sizeof(mbi));
::VirtualProtect(lpAddr,sizeof(DWORD),PAGE_READWRITE,&dwOld);
::WriteProcessMemory(::GetCurrentProcess(),
lpAddr,&lpNewProc,sizeof(DWORD),NULL);
::VirtualProtect(lpAddr,sizeof(DWORD),dwOld,0);
改变内存属性了,为什么啊,怎么解决???

解决方案 »

  1.   

    用下面的这个例程再试试程序描述:HOOK API Console程序
    http://blog.donews.com/dukejoe/archive/2007/03/26/1144903.aspx
      

  2.   

    输出表HOOK API!
    我不用这种方法,
    我用JMP的方法
      

  3.   

    我给你发的程序也不行吗?你要HOOK哪个API?
      

  4.   

    楼上的
    就MessageBoxA把,简单点,就用main把,谢谢
    [email protected]
      

  5.   

    to jn0115,我给你发的程序正好就是用MessageBoxA来做的演示,也是用的Console程序,main只有六条语句,够简单了。