C域 发表于 2014-7-11 16:47:45

HOOK API 技术谁能给个实例


メ㊣逆ご帅☆ 发表于 2014-7-11 16:47:46

本帖最后由 メ㊣逆ご帅☆ 于 2014-7-12 14:29 编辑

代码给你
由于MessageBox是user32.dll的函数。模块地址一般情况下不变。所以直接获取自己进程的MessageBoxA地址作为目标进程的地址
。代码写的比较挫。参考下未点击前



点击后






至于你要的看目标是否调用指定API的。那个你自己在接管函数搞个计数器就行





メ㊣逆ご帅☆ 发表于 2014-7-11 20:45:04

本帖最后由 メ㊣逆ご帅☆ 于 2014-7-11 20:47 编辑

首先从OD的手动HOOK开始。程序自动HOOK如果需要的话可以告诉我(练手用的附件在下面)

这是我以前fishc不知道给谁下载的win32asm记事本程序。可以看到点击帮助的时候会有MessageBox的调用
OD载入该程序
暂时不清楚是调用ASCII版的MessageBoxA还是Unicode的MessageBoxW
所以先尝试F2下断A版的


再次点击帮助按钮


断下了
OK,确定是这里了
。开始hook。(HOOK有好几种手法。比如IATHOOK是改IAT表的数据。INLINE HOOK是直接改机器码,还有虚表HOOK等这里自行了解)
这里采用最常用简单的方式INLINE HOOK(其实其他几种方法也不复杂只要你有概念就行)
HOOK前先考虑要怎么HOOK
看看MeessageBox的参数情况,如图


这里可以看到ESP+C处的标题参数为NULL,这里把他HOOK改成了和Text一样好了
首先决定HOOK位置
INLINE HOOK在长跳转的情况下需要5个字节。短跳转需要2个字节(汇编的知识)
这里需要找一个数据全为0的空白地址(也可以自己申请空白地址)


MessageBox 77D507E和00401a00相差73D367E
这不是1个字节能装下的位移。所以需要5个字节来HOOK



这里选择开头的5个字节来HOOK
OD改写指令jmp 00401a00


可以看到前三条指令被覆盖了
现在来到00401a00处
首先确定目的是
改写esp+c处的参数


00401A00       8B4424 08               mov eax,dword ptr ss://取出Text参数
00401A04       894424 0C               mov dword ptr ss:,eax//覆盖esp+c的title参数
00401A08       8BFF                      mov edi,edi//重新模拟一遍被覆盖的指令
00401A0A       55                        push ebp//重新模拟一遍被覆盖的指令
00401A0B       8BEC                      mov ebp,esp//重新模拟一遍被覆盖的指令
00401A0D   - E9 DDED9477               jmp user32.77D507EF//跳回去继续执行


这里选择利用EAX寄存器来传输内容。因为EAX寄存器这里内容被破坏是无所谓的

如果利用了其他寄存器的值。要记得还原寄存器的内容。避免出现崩溃等情况。具体要自己调试
这样就HOOK完了
运行起来试试看


可以看到标题不是“错误”了



青玄 发表于 2014-7-11 22:10:33

这里有小甲鱼转载的一个关于HOOK的一段话你可以看一下:
http://bbs.fishc.com/forum.php?m ... p;page=1#pid1290919

焚寂云霄 发表于 2014-7-11 22:22:18

表示看不懂,求教该学哪些内容?

C域 发表于 2014-7-12 10:10:50

メ㊣逆ご帅☆ 发表于 2014-7-11 20:45
首先从OD的手动HOOK开始。程序自动HOOK如果需要的话可以告诉我(练手用的附件在下面)

这是我以前fishc不 ...

其實 這個我知道
我想用VC 代碼 实现
比如當我指定某個进程他在調用 MessageBox API 时 我要知道他触发了该函数的调用

C域 发表于 2014-7-12 10:13:32

青玄 发表于 2014-7-11 22:11
哎!还是给你发上来吧!

论坛里有关于HOOK API的贴子, 但其实现在方式显示得麻烦, 其实现在拦截API一 ...

版主 有VC 实现的方法吗???

C域 发表于 2014-7-12 15:30:04

メ㊣逆ご帅☆ 发表于 2014-7-12 14:27
代码给你
由于MessageBox是user32.dll的函数。模块地址一般情况下不变。所以直接获取自己进程的MessageBox ...

谢谢 能留个联系方式吗? HOOK API的问题以后可以请教一下你
请容我 叫一声 师傅{:7_174:}

メ㊣逆ご帅☆ 发表于 2014-7-12 15:35:44

C域 发表于 2014-7-12 15:30
谢谢 能留个联系方式吗? HOOK API的问题以后可以请教一下你
请容我 叫一声 师傅

864388942
我要去游泳。有事晚上说

C域 发表于 2014-7-14 11:48:30

メ㊣逆ご帅☆ 发表于 2014-7-11 16:47
代码给你
由于MessageBox是user32.dll的函数。模块地址一般情况下不变。所以直接获取自己进程的MessageBox ...

组建时有错误

青玄 发表于 2014-7-15 10:33:27

C域 发表于 2014-7-12 10:13
版主 有VC 实现的方法吗???

哦! 这应该是delphi的语法,vc实现的方法可以的, 但是我想只要把原理掌握的话,vc实现照着delphi的原理实现也是可以的! 呵呵! 其实这篇文章也是我转载别人的,嗯....,你可以试一下!

chenxr36 发表于 2018-8-19 18:30:51

https://fishc.com.cn/forum.php?mod=viewthread&tid=66176&highlight=HOOK
页: [1]
查看完整版本: HOOK API 技术谁能给个实例