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