RE套路/从EASYHOOK学inline hook
本文通过攻防世界Reverse答题进阶区的一道EASYHOOK,大致了解一下inline hook的流程。
P.S. 查了一下wp大多是直接动态调试看的= =,感觉并不能很深刻地理解hook。看流程其实有两个方法,除了动态识别流程以外,还可以静态分析流程(虽然比较麻烦但能更容易理解?实战的时候还是直接动调吧)。
P.S.S. 本文并非wp,只是记录关键hook部分罢了。
例题:EASYHOOK
环境及工具:win10 + IDA pro
IDA打开,查看主函数流程。
(这里sub_401370可以猜测是输出函数,改名为itsPrint)。
流程大致是:判断输入字符串Buffer长度是否为19,然后走sub_401220(),一路走下来,最后要令NumberOfBytesWritten==1,那么输入就是flag。
一般静态看的话很容易忽略前面的处理函数直接去看sub_401240(),然后发现一无所获(sub_401240()是个烟雾弹函数hhh)。
回头,从sub_401220()看起,发现另有乾坤。
我们可以关注到这个dword_40C9C4和lpAddress
实际上是用来存储WriteFile()的地址,就是即将被hook的函数地址(主函数中这个函数在烟雾弹函数sub_401240()前面一行)。
然后看到下面
-23转成十六进制是0xE9,敏感地注意到这个为jmp的机器码。
而dword_40C9BD的计算方式跟jmp偏移地址的计算方式十分类似。
即偏移地址=目标地址-当前地址-5。(5为E9 xxxxxxxx这条指令的长度)
同时!这两个关键变量在内存上还是连续的!
这说明这里很有可能存放着用来hook的跳板指令,用于跳转到sub_401080()。
我们将这里改成aHook1和aHook2。
继续往下走,是return语句调用的sub_4010D0()函数。
在这里我们可以看到,对lpAddress所存储的地址处进行了5字节的权限修改操作,先改成读写再往此处写入以aHook1开头的5个字节(即上面的跳板指令),最后恢复权限,完成修改。
现在程序流程就很明朗了,粗略来看程序流程是CreateFileA->(lpAddress里存的指令)WriteFile->sub_401240,但是在经过sub_401220()的处理以后,变成了CreateFileA->(lpAddress里存的指令)sub_401080->sub_401240。
所以!真正的加密函数,其实是——sub_401080()!
于是exp就可以写出来啦
只看加密函数的话第一位其实是被丢失了的(。),可能是在哪里有保存吧没看到,不过很容易猜到是'f'啦。
__EOF__

本文链接:https://www.cnblogs.com/c10udlnk/p/14214057.html
关于博主:欢迎关注我的个人博客-> https://c10udlnk.top/
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)