<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
前两天看Intel网站上贴了一篇关于设置HOOK的文章,讲到在多核CPU上,由于执行代码可能存在CPU CACHE里,因此当更改了函数起始6字节后,CPU CACHE里的对应内容并没有被修改,所以需要调用FlushInstructionCache()函数来更新CACHE。
更新后的代码如下,增加的代码以粗体标出了。
/**通过地址来设置某个函数的钩子函数
@paramHANDLE hApiHook - 由ApiHook_Init()函数生成的句柄
@paramDWORD dwSrcFuncAddr - 源函数地址
@paramDWORD dwNewFuncAddr - 钩子函数地址
@returnINT (by default) - -1表示失败,>=0表示在hook数组中的序号
*/
INT ApiHook_SetByAddr(HANDLE hApiHook, DWORD dwSrcFuncAddr, DWORD dwNewFuncAddr)
{
DWORDdwOldProtect;
DWORDdwNewProtect;
DWORD lpSrcFunc;
DWORD lppNewFunc;
UINT i;
INTnAlreadyFlag = 0;
APIHOOK*pApiHook = (APIHOOK *)hApiHook;
if ( NULL == hApiHook )
{
return -1;
}
lpSrcFunc = dwSrcFuncAddr;
/* 查找是否已被设置了钩子 */
for ( i = 0; i uMaxFunctions; i++ )
{
if ( pApiHook->pHookData[i].dwSrcFuncAddr == lpSrcFunc )
{
/* 如果已经被设置了钩子,仅仅改变. */
nAlreadyFlag = 1;
break;
}
}
/* 如果没有设置源函数的钩子函数,在表中找出一个可供记录的位置. */
if ( i == pApiHook->uMaxFunctions )
{
for ( i = 0; i uMaxFunctions; i++ )
{
if (pApiHook->pHookData[i].wFlag == 0 )
{
break;
}
}
if ( i == pApiHook->uMaxFunctions )
{
return -1;
}
}
/* 将新的钩子函数地址记录到表中 */
pApiHook->pHookData[i].dwNewFuncAddr = dwNewFuncAddr;
/* 以下这段代码将源函数头部6个字节保存到表中 */
lppNewFunc = (DWORD)(&(pApiHook->pHookData[i].dwNewFuncAddr) );
if ( !nAlreadyFlag )
{
/* 将源函数起始处6个字节保存到 byHeaderCode.中 */
memcpy( pApiHook->pHookData[i].byHeaderCode, (const void *)lpSrcFunc, 6);
}
/* 以下这段代码将源函数首部6个字节改成为一条跳转到新函数地址的指令 */
if ( VirtualProtect( (LPVOID)lpSrcFunc,
6,
PAGE_EXECUTE_READWRITE,
&dwOldProtect ) == 0 )
{
/*
* Failure.
*/
return -1;
}
*(unsigned char *)lpSrcFunc = (unsigned char)0xff;
*(((unsigned char *)lpSrcFunc)+1) = (unsigned char)0x25;
memcpy( (void *)(lpSrcFunc+2),
(const void *)&lppNewFunc,
4 ); /* address */
if ( VirtualProtect( (LPVOID)lpSrcFunc,
6,
dwOldProtect,
&dwNewProtect) == 0 ) {
/*
* Failure.
*/
return -1;
};
pApiHook->pHookData[i].wFlag = 1;
pApiHook->pHookData[i].dwSrcFuncAddr = lpSrcFunc;
/* 使用以下FlushInstructionCache调用来支持多核CPU上的CACAHE的更新,
* 上面的代码只更改了内存里的地址,没有更改CPU CACHE里的对应内容。
*/
FlushInstructionCache(GetCurrentProcess(), NULL, NULL);
return (INT)i;
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1209218
相关推荐
C++Hook发包函数核心代码 游戏辅助专用 不得不学 杀猪的
c++钩子函数:copy hook c++调用钩子函数监视复制文件操作
context[Object|opt]:目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1 methodName[String|opt]:匿名函数需显式传入目标函数名eg:this.Begin = function(){....}; } [bool]...
易语言HOOK跳转函数源码,HOOK跳转函数,MakeJmp,安装HOOK,卸载HOOK,MySleep,API_GetProcAddress,API_GetModuleHandle,API_CopyMemory,API_VirtualProtect,API_Sleep,API_MessageBox
给初学驱动的人的一个简单例子,Hook掉内核函数ZwSetValueKey,实现一个在IE或者注册表调用SetValueKey函数的时候附加了一个修改主页的操作。代码内还提供了一个简单的获取默认浏览器的功能,另外还有其他小惊喜
该实例实现了Hook函数任意地址的功能,并可以获取CPU寄存器的内容。
自己整理的相关代码,废话不多说,以代码说话,以后若有人需要hook系统其它进程的API再上传。。
hook任意函数,可用于防外挂等安全领域,是封号的代码,开源
hook函数的用法,可以很好的学习hook函数的原理
vc钩子hook 截获exe调用的任何函数.api拦截
易语言源码易语言HOOK跳转函数源码.rar
注入安卓服务或APK neweglSwapBuffers 用法: ...injector /system/bin/surfaceflinger /data/local/tmp/libmy64bit.so static EGLBoolean neweglSwapBuffers(EGLDisplay dpy, EGLSurface surf) { ...
简单的Hook程序,参考文章:http://blog.csdn.net/lonelyrains/article/details/25076115 照着楼主所说测试成功 VS2013+MFC+Win10
hook QQ函数 msgsave实现qq聊天信息获取,VC6.0编译通过!把生成的DLL注入到运行中的QQ即可,有聊天消息时,会弹出一个对话框提示聊天信息.
C++Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数)[收集].pdf
之前有转一篇关于回调函数的文章 钩子函数、注册函数、回调函数,他们的概念其实是一样的。 钩子函数,顾名思义,就是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上。 1. hook函数,就是我们自己实现的...
hook截获http发送的数据包 hook截获http发送的数据包 hook截获http发送的数据包
HOOK跳转函数.rar
这是一段hook代码,可在linux(cygwin)以及windows下使用,可用于软件单元测试时函数打桩设置。
用c# 调用win api函数 实现连发程序 主要用到 hook钩子函数