Loading... # 工具 查壳软件:Die、lordPE 分析软件:x32Dbg、OD 运行平台:Windows x64 目标壳:PESpin(1.32) *PESpin*是一个Windows可执行文件的保护,压缩机用纯Win32ASM MASM的编码。它允许整个可执行文件压缩 -代码,数据和资源,使他们对修补和可执行文件和拆卸保护。 # 查壳 可以看到是PESpin(1.32)的壳 ![image.png](http://www.irohane.top/usr/uploads/2021/03/1264421616.png) # 开搞 在之前就已经做好了功课,已经看过别的博客脱过一次了,在这里直接使用成功的方程式。使用最后一次调试法找到清除DBUG寄存器的代码nop掉,到达OEP进行脱壳,之后构建脚本进行自动修复IAT表。 <span style="color:#DC143C">如果设置之后一路通畅【可能是OD中插件的原因】,那么试一下原生OllDebug。</span> 关掉插件中 Strong中的跳过异常。 ![image.png](http://www.irohane.top/usr/uploads/2021/03/3592786206.png) 设置异常全关【除了第一个】。 ![image.png](http://www.irohane.top/usr/uploads/2021/03/2845675551.png) 其实这里我的OD有一点问题,出现这么多异常,但是没关系,操作的方法是一样的,找到跑飞之前之前的那个异常。 1:![image.png](http://www.irohane.top/usr/uploads/2021/03/1230511838.png) 2:![image.png](http://www.irohane.top/usr/uploads/2021/03/3406934701.png) 3:![image.png](http://www.irohane.top/usr/uploads/2021/03/700034151.png) 4:![image.png](http://www.irohane.top/usr/uploads/2021/03/2886145541.png) 5:![image.png](http://www.irohane.top/usr/uploads/2021/03/1362425066.png) 6:![image.png](http://www.irohane.top/usr/uploads/2021/03/1568883331.png) 7:![image.png](http://www.irohane.top/usr/uploads/2021/03/4079301639.png)跑飞 在第九次 SHIFT+F9 时跑飞 那么就在开始在每个异常中下硬件断点,如果本次硬件断点没断下就是上一个异常中清除了了DBUG寄存器。 <span style="color:#DC143C">注意在硬件断点断下,左下角会显示硬件断点信息,以此来确定是否触发。如果没找到可以通过日志窗口L进行查看</span> ![image.png](http://www.irohane.top/usr/uploads/2021/03/3224741097.png) 发现在第三次的时候程序后下一个硬件断点,不会断下。 ![image.png](http://www.irohane.top/usr/uploads/2021/03/221890860.png) 硬件断点没有触发,说明在这个异常中处理了硬件断点,那么我们就开始搞他。打开SEH链。找到处理函数。 ![image.png](http://www.irohane.top/usr/uploads/2021/03/3554131068.png) 如果修改DR寄存器,那么就得使用GetThreadContext获取线程上下文,重新设置就需要SetThreadContext, 可以在这里下一个硬件断点,这样每次进来前先把这些代码NOP掉。 ![image.png](http://www.irohane.top/usr/uploads/2021/03/2282292875.png) 也可以在IDA中观看,直接在这个结构体前脱壳。 ![image.png](http://www.irohane.top/usr/uploads/2021/03/4068728215.png) ![image.png](http://www.irohane.top/usr/uploads/2021/03/2284023481.png) ![image.png](http://www.irohane.top/usr/uploads/2021/03/4242309940.png) ![image.png](http://www.irohane.top/usr/uploads/2021/03/31738140.png) ![image.png](http://www.irohane.top/usr/uploads/2021/03/2667361069.png) 双击添加、 ![image.png](http://www.irohane.top/usr/uploads/2021/03/1107244914.png)![image.png](http://www.irohane.top/usr/uploads/2021/03/1504784845.png) [DR0-DR7详细](https://www.cnblogs.com/suanguade/p/6392799.html "点击跳转") 可以看到代码直接把DBUG寄存器清空了。顺便一提:Dr0-Dr3,4个寄存器用来设置硬件断点地址,Dr4保留。Dr6用来存储寄存器断下的状态信息,Dr7控制寄存器,设置前四个寄存器断下的大小,全局、范围等信息。 ![image.png](http://www.irohane.top/usr/uploads/2021/03/688735113.png) 那么在这里下断点,提前把这些Nop掉即可,继续在下断点GetVersion 断点。如果大家的也出现这种情况那么就可以直接搜索命令 sub esp,0x58【特征】 来找到入口。 在断GetVersion的时候我的OD出现了BUG虽然断在GetVersion但是出现的位置却在其他地方,这里就不截图了。直接截取OEP 0x409486 ![image.png](http://www.irohane.top/usr/uploads/2021/03/242649116.png) 在FF 15 CALL 后面的地址下硬件写入断点,来查看哪些对IAT进行了修改。 在inc edi断下,那么就需要ctrl+↑键单字节调试,来查看edi是哪里来的,往上单字节修正,看到al被放在EDI地址.单字节操作不太可能是函数操作。继续F9查看。0x43918A ![image.png](http://www.irohane.top/usr/uploads/2021/03/3349036429.png) 获取了字符串并对第一个字节进行比对,0x4D 这个字节会改变,之前是47,之后会对字符串的加密信息判断,使其找到正确的API。 ![image.png](http://www.irohane.top/usr/uploads/2021/03/2835614914.png) 找到EAX获取了 一个API地址。0x438F9F ![image.png](http://www.irohane.top/usr/uploads/2021/03/577049482.png) ![image.png](http://www.irohane.top/usr/uploads/2021/03/707669851.png) 首先我们需要在异常中清除断点的地方,对其进行nop,之后找到获取API地址,并存储获取API的地址,然后找到填充IAT地址。在填充之后重新对地址重新覆盖。修复完成之后断在OEP中。进行脱壳,之后使用通用表修复工具对IAT进行修复。 ``` MOV vOEP,409486 // OEP地址 MOV vGetAPIAddr,438F9F // 获取API地址 MOV vWriteIATAddr,43918c // 写入IAT地址 MOV vHardwarePointAddr,0043AF51 // 异常中清除异常断点 MOV vAPIaddr,0 BPHWC // 清除所有硬件断点 BC // 清除所有软件断点 BPHWS vHardwarePointAddr,"x" // 清除硬件断点的地方 X = 执行断点 BPHWS vOEP,"x" // BPHWS vGetAPIAddr,"x" // BPHWS vWriteIATAddr,"x" // LOOP_1: RUN CMP eip,vHardwarePointAddr JNZ SIGN_1 fill vHardwarePointAddr,22,90 //NOP 总共的字节 SIGN_1: CMP eip,vGetAPIAddr JNZ SIGN_2 MOV vAPIaddr,eax SIGN_2: CMP eip,vWriteIATAddr JNZ SIGN_3 mov [edi], vAPIaddr SIGN_3: cmp eip,vOEP JE EXIT_1 JMP LOOP_1 EXIT_1: MSG "修复完毕" ``` 脚本之后,使用通用导入表修复工具对IAT修复。找到代码开始位置和结束位置。并使用新地址作为IAT表【最好先脱壳,如果修复后可能对代码有影响】。 ![image.png](http://www.irohane.top/usr/uploads/2021/03/2550489916.png) 修复完成。![image.png](http://www.irohane.top/usr/uploads/2021/03/1953239024.png) 开始修复IAT表。 ![image.png](http://www.irohane.top/usr/uploads/2021/03/1224499138.png) ![image.png](http://www.irohane.top/usr/uploads/2021/03/1216707711.png) 脱壳完成 最后修改:2021 年 03 月 12 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏
2 条评论
Σ(っ °Д °;)っ
(╯°A°)╯︵○○○