工具

查壳软件:Die、lordPE

分析软件:x32Dbg、OD

运行平台:Windows x64

目标壳:PESpin(1.32)

PESpin是一个Windows可执行文件的保护,压缩机用纯Win32ASM MASM的编码。它允许整个可执行文件压缩 -代码,数据和资源,使他们对修补和可执行文件和拆卸保护。

查壳

可以看到是PESpin(1.32)的壳

image.png

开搞

在之前就已经做好了功课,已经看过别的博客脱过一次了,在这里直接使用成功的方程式。使用最后一次调试法找到清除DBUG寄存器的代码nop掉,到达OEP进行脱壳,之后构建脚本进行自动修复IAT表。

<span style="color:#DC143C">如果设置之后一路通畅【可能是OD中插件的原因】,那么试一下原生OllDebug。</span>

关掉插件中 Strong中的跳过异常。

image.png

设置异常全关【除了第一个】。

image.png

其实这里我的OD有一点问题,出现这么多异常,但是没关系,操作的方法是一样的,找到跑飞之前之前的那个异常。

1:image.png

2:image.png

3:image.png

4:image.png

5:image.png

6:image.png

7:image.png跑飞

在第九次 SHIFT+F9 时跑飞

那么就在开始在每个异常中下硬件断点,如果本次硬件断点没断下就是上一个异常中清除了了DBUG寄存器。

<span style="color:#DC143C">注意在硬件断点断下,左下角会显示硬件断点信息,以此来确定是否触发。如果没找到可以通过日志窗口L进行查看</span>

image.png

发现在第三次的时候程序后下一个硬件断点,不会断下。

image.png

硬件断点没有触发,说明在这个异常中处理了硬件断点,那么我们就开始搞他。打开SEH链。找到处理函数。

image.png

如果修改DR寄存器,那么就得使用GetThreadContext获取线程上下文,重新设置就需要SetThreadContext, 可以在这里下一个硬件断点,这样每次进来前先把这些代码NOP掉。

image.png

也可以在IDA中观看,直接在这个结构体前脱壳。

image.png

image.png

image.png

image.png

image.png

双击添加、

image.pngimage.png

DR0-DR7详细

可以看到代码直接把DBUG寄存器清空了。顺便一提:Dr0-Dr3,4个寄存器用来设置硬件断点地址,Dr4保留。Dr6用来存储寄存器断下的状态信息,Dr7控制寄存器,设置前四个寄存器断下的大小,全局、范围等信息。

image.png

那么在这里下断点,提前把这些Nop掉即可,继续在下断点GetVersion 断点。如果大家的也出现这种情况那么就可以直接搜索命令 sub esp,0x58【特征】 来找到入口。

在断GetVersion的时候我的OD出现了BUG虽然断在GetVersion但是出现的位置却在其他地方,这里就不截图了。直接截取OEP 0x409486

image.png

在FF 15 CALL 后面的地址下硬件写入断点,来查看哪些对IAT进行了修改。

在inc edi断下,那么就需要ctrl+↑键单字节调试,来查看edi是哪里来的,往上单字节修正,看到al被放在EDI地址.单字节操作不太可能是函数操作。继续F9查看。0x43918A

image.png

获取了字符串并对第一个字节进行比对,0x4D 这个字节会改变,之前是47,之后会对字符串的加密信息判断,使其找到正确的API。

image.png

找到EAX获取了 一个API地址。0x438F9F

image.png

image.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

修复完成。image.png

开始修复IAT表。

image.png

image.png

脱壳完成

最后修改:2021 年 03 月 12 日 03 : 29 PM