授人以鱼不如授人以渔●(hook api的概念及应用 hook篇一)

授人以鱼不如授人以渔●(hook api的概念及应用 hook篇一)

ID:15608013

大小:849.50 KB

页数:108页

时间:2018-08-04

授人以鱼不如授人以渔●(hook api的概念及应用 hook篇一)_第1页
授人以鱼不如授人以渔●(hook api的概念及应用 hook篇一)_第2页
授人以鱼不如授人以渔●(hook api的概念及应用 hook篇一)_第3页
授人以鱼不如授人以渔●(hook api的概念及应用 hook篇一)_第4页
授人以鱼不如授人以渔●(hook api的概念及应用 hook篇一)_第5页
资源描述:

《授人以鱼不如授人以渔●(hook api的概念及应用 hook篇一)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、07授人以鱼不如授人以渔●(HOOKAPI的概念及应用HOOK篇一)前言:让程序按照自己的代码来走,这是个很有意思的事情。HOOK其实是一个很有意思的东西,他能让你在枯燥的外挂学习中感受到一丝乐趣HOOK的原理:修改函数的首地址跳转到你想执行的代码然后返回。这就好比正常的程序就像一个汽车在公路上行驶(代码正常运行),而这个时候警察在半路设下了一个路障(修改原始地址JMP我们的代码地址),要求汽车靠边停靠(修改原始程序代码,JMP地址 跳转到我们的代码区),这个时候汽车过来了,看到路障并且停靠在右边(

2、跳转到我们的代码区了)并且接受检查(执行我们的代码),恢复路面(将修改的代码复原),检查完毕后(比如说代码执行了数据拷贝,或者一些特殊功能 比如说send 恢复代码后可以直接执行,也可以拦截不发也可以修改数据在发送。),汽车继续行驶。HOOK的方法有很多,修改CALL的代码跳转到我们的程序执行完我们的代码后,复原CALL然后在调用。或者直接在函数头跳转。HOOK的方法有很多种,但万变不离其中~封包助手是一款类似于WPE截包的软件,今天我们来看看他是如何HOOKsend封包函数的.此次的目标还是前几天

3、我们用到的模拟器我们先来看一下正常的send函数头部.按下CTRL+G  输入 send  回车(打开OD第一次需要找2次应该是ODBUG)好了跳转到如下地址 然后我们来看下 用封包助手加载程序后代码的变化 movedi,edipush ebppushebp,esp这三句话 修改成了JMPPACKASSI.13148F88这句汇编指令的意思就是 强行跳转到 13148f88 这个地址去(开始设置路障)好了我们下bp send 然后按模拟器进入或加血让程序断下然后按F8 单步运行, 这个时候强行跳转到

4、了封包助手设置的位置.(汽车靠边了) 这里就是我们跳转的地方了.也就是说封包助手处理数据的地方. 这里有3个CALL 我们来看看都有什么功能.我们进入第一个CALL里面  看到OD分析出几个CALL的函数 getsockname()获取一个套接口的IP和端口ntoa() 将网络IP地址转换"."格式的字符串形式ntohs() 将一个无符号短整形数从网络字节顺序转换为主机字节顺序。 看来这一层是封包函数处理一些封包数据的地方.    (检查完毕后)我们来看看第二层CALL第二层CALL压入堆栈的数据跟

5、send一样 我们看看他跳转到何处 这里我们发现pushebpmov ebp,esp一般函数头部都有这2句然后我们继续往下JMPWS2_32.71A24C2C这里跟函数头部是不是很近?呵呵我们继续跳转看看他到哪里. 程序跳转到刚刚修改过的下面那句.我们连起来就是相当于运行pushebpmov ebp,espsub esp,10............这里就相当于运行原来的 send发包功能.因为封包数据我们已经拿到手了.(恢复路面)第三个CALL 压入的参数跟send 一样,我们进入到CALL内部看

6、一下  这是里面的2个被OD标出来的函数第一个用于查找窗口句柄第二个用于向窗口发送消息根据findwindow 压入堆栈的标题来看应该是给封包助手主窗口发送消息这个CALL应该是处理 DLL跟封包助手进程之间的数据通信, 因为封包助手要HOOKsend必须把检测代码注入到目标进程,这个时候获得数据的是注入进目标的DLL而不是封包助手主程序.那么封包助手如何获取拦截的封包数据并显示呢, 这里可以用sendmessage()来达到目的.看来第三个CALL是应用于DLL与主程序之间的数据传递.好了下面我们

7、来写下sendmessage() 这个CALL,欺骗一下封包助手.我们先来看看中断在CALL的位置时 堆栈的情况 这个是CALL sendmessage时候的堆栈状况.我们现在来看看CALL的时候有没有用到哪个寄存器我们进入到sendmessage 的内部.(要经过一个跳转) 好了到了内部了如何找CALL有没有调用寄存器呢? 一般CALL调用的寄存器是(EAX,EBX,ECX,EDX)这4个看看代码中有没有 类似于mov esi,eax push ebx这种需要从寄存器读取数据的之类 这里我们没有找

8、到任何读取这4个寄存器的指令好了这样的话我们只需要写入堆栈就可以了 按照堆栈的顺序写入到CALL注入器里 OK~调用成功了, 因为我们没有往堆栈地址写入数据(为什么要说数据在堆栈地址呢,在上一层中这个CALL所压入的堆栈中的数据和send发送的数据一样,其实我们应该调用上面那一层的).好了我们试试写上面那一层的 CALL看看 这个CALL跟上面那个一样我就不多说了,这个时候在数据里就可以显示了. 将长度和套接字改变了下 封包助手接收到的数据也随之而改变.后记:HOOK

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。