Hook Api 以MessageBoxA为例 利用PowerBasic论坛的4n85大哥的PB代码转化过来的。 经测试,没有问题 复制请回帖,下回为您提供更好的代码。 #define WIN32_LEAN_AND_MEAN #include<windows.h> #include"LDasm.c" int (_stdcall * pMessageBox)(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType); int _stdcall myMessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType) { lpText="hello"; return (*pMessageBox)(hWnd,lpText,lpCaption,uType); } bool hookapi( LPCTSTR dll,//dll的名称 LPCSTR api,//API的名称 DWORD *lpfunc,//自己函数的地址 LPVOID *NextHook//NextHook的地址 ) { FARPROC handle; PBYTE bytec; PDWORD dwordc; int pSize; unsigned long oldpoint; handle=GetProcAddress(LoadLibrary(dll),api); if(!handle) return 0; if (*((PUCHAR)handle)==0xe8) return 0; pSize = SizeOfHook(handle); if (VirtualProtect(handle,pSize,PAGE_EXECUTE_READWRITE,&oldpoint))//开启可写属性 { *NextHook = VirtualAlloc(NULL,0x1000, MEM_COMMIT,PAGE_EXECUTE_READWRITE); //'申请内存空间 //将原函数 前pSize个字节复制到NextHook中 CopyMemory ((PVOID)*NextHook,handle,pSize); //读取n字节保存 //再已复制的字节后添加 跳转至 原函数+pSize bytec=(PBYTE)(*NextHook); *(bytec+pSize)=0xe9; dwordc=(PDWORD)((DWORD)*NextHook+pSize+1); *(dwordc)=(DWORD)handle-(DWORD)*NextHook-5; // '保存被Hook API函数的地址 dwordc=(PDWORD)((DWORD)*NextHook+pSize+5); *(dwordc)=(DWORD)handle; //将原函数修改为跳转 到指定的函数 bytec=(PBYTE)(handle); *(bytec)=0xE9; dwordc=(PDWORD)((DWORD)handle+1); *(dwordc)=(DWORD)lpfunc-(DWORD)handle-5; FlushInstructionCache(GetCurrentProcess(), handle, pSize); //'确保执行更改 VirtualProtect(handle, pSize, oldpoint, &oldpoint); // '恢复原来的属性 } else return 0; return 1; } bool unhookapi(LPVOID *NextHook)//NextHook的地址 { BYTE bytec; LPVOID lOldAddrs; int pSize; unsigned long oldpoint; pSize = SizeOfHook(*NextHook); if (NextHook) { bytec=(BYTE)*((PBYTE)*NextHook+pSize); if (bytec==0xe9) { lOldAddrs=(LPVOID)*(PDWORD)((DWORD)*NextHook+pSize+5); VirtualProtect(lOldAddrs, pSize, PAGE_EXECUTE_READWRITE, &oldpoint); // '修改内存属性页为可写 CopyMemory ((PVOID)lOldAddrs,*NextHook,pSize); FlushInstructionCache(GetCurrentProcess(), lOldAddrs, pSize); //'确保执行更改 VirtualProtect(*NextHook, pSize, oldpoint, &oldpoint); // '恢复原来的属性 if(VirtualFree(*NextHook, NULL, MEM_RELEASE)) // '释放内存空间 *NextHook = NULL; // '把自己函数地址设为NULL } else return 0; } else return 0; return 1; } //void main() //{ // MessageBoxA(NULL,"1","2",MB_OK); // hookapi("user32.dll","MessageBoxA",(PDWORD)myMessageBox,(LPVOID*)&pMessageBox); // MessageBoxA(NULL,"4","3",MB_OK); // unhookapi((LPVOID*)&pMessageBox); // MessageBoxA(NULL,"4","3",MB_OK); //} /********************************** 连城制作 注意版权哦。 QQ:173661967 **********************************/