hook api (push xxxxretn)

    技术2024-07-17  57

    #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_p(              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_push(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)=0x68;         dwordc=(PDWORD)((DWORD)handle+1);         *(dwordc)=(DWORD)lpfunc;         *(bytec+5)=0xc3;         FlushInstructionCache(GetCurrentProcess(), handle, pSize);                 //'确保执行更改         VirtualProtect(handle, pSize, oldpoint, &oldpoint);                    // '恢复原来的属性     }     else         return 0;     return 1; } bool unhookapi_p(LPVOID *NextHook)//NextHook的地址 {     BYTE bytec;     LPVOID lOldAddrs;     int pSize;     unsigned long oldpoint;         pSize = SizeOfHook_push(*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_p("user32.dll","MessageBoxA",(PDWORD)myMessageBox,(LPVOID*)&pMessageBox);     MessageBoxA(NULL,"4","3",MB_OK);     unhookapi_p((LPVOID*)&pMessageBox);     MessageBoxA(NULL,"4","3",MB_OK); } /********************************** 连城制作 注意版权哦。 QQ:173661967 **********************************/

    最新回复(0)