博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ring3 Hook API
阅读量:7259 次
发布时间:2019-06-29

本文共 2390 字,大约阅读时间需要 7 分钟。

 

 hook  计算机里面一般是指 挂钩某函数, 就是替换掉原来的函数。

inline hook ,  是直接在以前的函数替里面修改指令,用一个跳转或者其他指令来达到挂钩的目的。
                这是相对普通的hook来说,因为普通的hook只是修改函数的调用地址,而不是在原来的函数体里面做修改。
一般来说 普通的hook比较稳定使用。 inline hook 更加高级一点,一般也跟难以被发现。所以很多人比如病毒制作者都比较推崇inline hook。

 

 

1 /*Ring3 inline Hook API 本进程内*/ 2 #include
3 #include
4 5 typedef (WINAPI *pMessageBoxDef)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType); 6 7 char szOldMessageBox[5] = {
0}; 8 char szJmpMyMessageBox[5] = {(char)0xe9}; //0xe9为jmp指令 9 10 pMessageBoxDef pMessageBox = NULL;11 12 int WINAPI MyMessageBox(13 HWND hWnd, // handle of owner window14 LPCTSTR lpText, // address of text in message box15 LPCTSTR lpCaption, // address of title of message box16 UINT uType // style of message box17 )18 {19 20 printf("函数拦截成功,可以修改传进来的参数,做坏事啦,只是一个例子!\n");21 22 WriteProcessMemory((void*)-1, pMessageBox, szOldMessageBox, 5, NULL);23 24 MessageBoxW(hWnd, lpText, lpCaption, uType);25 26 WriteProcessMemory((void*)-1, pMessageBox, szJmpMyMessageBox, 5, NULL);27 28 return 0;29 }30 31 int main()32 {33 DWORD dwJmpAddr = 0;//jmp指令jmp到的地址(机器码表示)34 35 36 HMODULE hModule = LoadLibrary("USER32.dll");37 38 39 pMessageBox = GetProcAddress(hModule, (LPCSTR)"MessageBoxW");40 // 0xE9 (code) -> code = 目标地址(就是你hook函数所在地址) - 源地址(就是被hook地方地址) - 541 dwJmpAddr = (DWORD)MyMessageBox - (DWORD)pMessageBox - 5;//MyMessageBox是函数入口地址 pMessageBox也是函数入口地址42 //pMessageBox(0,0,0,0);43 memcpy(szJmpMyMessageBox + 1, &dwJmpAddr, 4);//dwJmpAddr = 0x8869AACC(只是我机器上的,这个数值会变动)44 45 FreeLibrary(hModule);46 47 ReadProcessMemory((void*)-1, pMessageBox, szOldMessageBox, 5, NULL);//读出原来的前5个字节 在地址pMessageBox(0x77d66534)处:48 //8B FF 55 8B EC49 WriteProcessMemory((void*)-1, pMessageBox, szJmpMyMessageBox, 5, NULL);//写入我们处理后的5个字节 在地址pMessageBox(0x77d66534)处:50 //E9 CC AA 69 88 (jmp XXXXXX)51 52 53 MessageBoxW(GetForegroundWindow(), L"Inline Hook:MessageBox", L"HOOK API", MB_OK);54 55 MessageBoxW(GetForegroundWindow(), L"Hello World", L"Win32", MB_OK);56 57 return 0;58 }

 

 

详情参考:

http://bbs.pediy.com/archive/index.php?t-67311.html

 

转载于:https://www.cnblogs.com/foohack/archive/2013/06/12/3132976.html

你可能感兴趣的文章
内核驱动模块如何在/dev文件下自动创建设备
查看>>
【three.js练习程序】旋转物体自身
查看>>
『原创』设置SQL Server 2005自动备份——数据库邮件设置(图文)
查看>>
判断一个字符串在另一个字符串中出现的次数 .
查看>>
在.Net Framework中调用Python的脚本方法 (以VB和C#为例)
查看>>
MVP 模式实例解析
查看>>
Hadoop添加删除节点
查看>>
Linux下串口操作之数据拼接
查看>>
Junit使用教程(四)
查看>>
家族(并查集)
查看>>
返回顶部的代码
查看>>
testng 失败自动截图
查看>>
Java 发送邮件
查看>>
Ant十五大最佳实践
查看>>
26/02/2009 ECONOMICS REPORT - Obama Proposes $3.5 Trillion Budget for 2010
查看>>
教你如何拍好人像摄影
查看>>
UML 类图介绍
查看>>
从另外一个角度看微信支付
查看>>
ASP.NET Web API实践系列04,通过Route等特性设置路由
查看>>
【将门创投】商汤徐立:计算机视觉的完整链条,从成像到早期视觉再到识别理解...
查看>>