BOOL Mhook_Unhook(PVOID * ppHookedFunctionP) { Mhook_MyInit(); if(ppHookedFunctionP==NULL) return FALSE; PVOID ppHookedFunction=(void*)(*ppHookedFunctionP); if(ppHookedFunction==NULL) return FALSE; int i; void * src=NULL; if(ppHookedFunction!=NULL) { for(i = 0; i < mhooks_subhooks_count; i++) { if(mhooks_subhooks[i]==NULL) { continue; } src=(void*)subhook_get_src(mhooks_subhooks[i]); if(src==ppHookedFunction) { *ppHookedFunctionP=(void*)src; subhook_remove(mhooks_subhooks[i]); subhook_free(mhooks_subhooks[i]); mhooks_subhooks[i]=NULL; if(i+1==mhooks_subhooks_count) { mhooks_subhooks_count--; } return TRUE; } } return FALSE; } else { i = mhooks_subhooks_count - 1; if(i<0) { return FALSE; } if(mhooks_subhooks[i]==NULL) return FALSE; src=(void*)subhook_get_src(mhooks_subhooks[i]); *ppHookedFunctionP=(void*)src; subhook_remove(mhooks_subhooks[i]); subhook_free(mhooks_subhooks[i]); mhooks_subhooks[i]=NULL; mhooks_subhooks_count--; return TRUE; } return FALSE; }
int main() { hfoo = subhook_new((void *)foo, (void *)foo_hook); subhook_install(hfoo); foo(); subhook_remove(hfoo); foo(); subhook_install(hfoo); foo(); subhook_remove(hfoo); foo(); subhook_free(hfoo); }
BOOL Mhook_SetHook(PVOID * ppSystemFunctionP, PVOID pHookFunction) { Mhook_MyInit(); if(ppSystemFunctionP==NULL||pHookFunction==NULL) { return FALSE; } PVOID ppSystemFunction=(void*)(*ppSystemFunctionP); if(ppSystemFunction==NULL) return FALSE; if(mhooks_subhooks_count>=MHOOKS_MAX_SUPPORTED_HOOKS) { return FALSE; } else if(mhooks_subhooks_count<0) { mhooks_subhooks_count=0; } mhooks_subhooks[mhooks_subhooks_count]=subhook_new(ppSystemFunction, pHookFunction); if(mhooks_subhooks[mhooks_subhooks_count]==NULL) { return FALSE; } subhook_install(mhooks_subhooks[mhooks_subhooks_count]); if(subhook_is_installed(mhooks_subhooks[mhooks_subhooks_count])) { void * rr= subhook_get_trampoline(mhooks_subhooks[mhooks_subhooks_count]); if(rr==NULL) { subhook_remove(mhooks_subhooks[mhooks_subhooks_count]); subhook_free(mhooks_subhooks[mhooks_subhooks_count]); mhooks_subhooks[mhooks_subhooks_count]=NULL; return FALSE; } *ppSystemFunctionP=(void*)rr; } mhooks_subhooks_count++; return TRUE; }