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;
}
示例#2
0
文件: test_prog.c 项目: Pottus/SKY
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;
}