www.pudn.com > API_VC_HOOK-.rar > Unhook.c
#if _MSC_VER > 1000 #pragma once #endif #define WIN32_LEAN_AND_MEAN #include#include "ApiHooks.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }; ADDR_CONTENTS AddrAndValue[3]; API_UNHOOK UnhookGetVersion = {3,0,AddrAndValue}; void __stdcall UnhookApi(PAPI_UNHOOK unhook) { UINT i; ULONG OldAttr; for(i = 0; i < unhook->CurNoAddr; ++i) if(VirtualProtect(unhook->WhereWhat[i].ReturnWhere, sizeof(DWORD), PAGE_READWRITE, &OldAttr)) { *unhook->WhereWhat[i].ReturnWhere = unhook->WhereWhat[i].ReturnWhat; VirtualProtect(unhook->WhereWhat[i].ReturnWhere, sizeof(DWORD), OldAttr, &OldAttr); }; } DWORD WINAPI NewGetVersion(void) { static counter = 0; if(++counter > 10) MessageBox(NULL, "Not Unhooked!", "Unhook", MB_OK); else if (counter == 10) { UnhookApi(&UnhookGetVersion); MessageBox(NULL, "Unhooked?", "Unhook", MB_OK); } return (GetVersion()); } __declspec(dllexport) API_HOOK ApiHookChain[2] = { {"KERNEL32.DLL","GetVersion", HOOK_ALL, ALL_MODULES, &UnhookGetVersion, NewGetVersion}, {HOOKS_END} };