-
-
[分享]脱壳一个不知名文件
-
发表于:
2020-6-8 16:57
18963
-
检测一个软件话不多说,查看编程语言,C/C++
查看区段,发现多了一个区段
导入OD,MSG提示,有壳
进入OEP,看到这个直接ESP定理
我这里下了一个硬件断点
结果发现什么都没发生直接跑飞
估计有断点检测,查看日志
用最后一次异常法, 0x0047108E, 成功到达OEP
但是它是如何处理硬件断点的呢?若是我想用硬件断点呢?所以我决定查看它的反硬件断点的实现
一般反调试技术都是写在SEH,或者hook 系统API, 其中最常见的就是HOOK KiUserExceptionDispatcher 异常分发函数
对其下CC断点, 再对ESP定律下硬件访问断点
成功断下, 查看 [ESP + 0x4] 处, 其是储存硬件访问断点地址的结构体
发现当其运行指定CALL后,硬件断点的地址被清空
那么知道情况就好办了,我们可以编写OD脚本来实现越过检测
在这里需要知道, 在 KiUserExceptionDispatcher 函数入口处:
[ESP + 0x4] 地址内容开始后5个4字节是一个结构体, 其中后4个4字节存储的是硬件断点的地址
[ESP + 0x14] 存储的是当前异常的地址
[ESP + 0x4] + 0xB8 地址里存储的是异常处理完毕后要返回的用户空间代码地址
成功到达OEP
然后, 其实仔细的看下就会发现存在OEP窃取的情况
所以为了恢复OEP,我们需要寻找原始OEP的代码,在最后一次异常处对壳代码下内存访问断点
成功断下
在OEP处设置硬件执行断点
接下来我们利用Run跟踪来记录到达OEP之前的代码
(1)添加记录文件
(2)勾上所有异常忽略
(3)打开Run跟踪
(4)跟踪步入
等待3~4分钟, 到达OEP,数了一下将近一万行代码,我们搜索关键OEP字段:push ebp
或者手动排查,去除pushad/popad无用的花指令代码段
找到原OEP代码
获取硬编码, 将其粘贴到现OEP
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-6-8 17:26
被灵幻空间编辑
,原因: 排版