脱壳 !EP(EXE PACK)1.2

0x1 查壳

将程序拖入!Exeinfo PE显示如下。
脱壳 !EP(EXE PACK)1.2
程序拖入OD
脱壳 !EP(EXE PACK)1.2
看到第一行有pushad指令,利用ESP定律,执行一步F8。ESP定律是典型的堆栈平衡,因为只要保存了所有寄存器的值都是要开始解密操作,等到解密完成后一般都会将所有初始化的寄存器值进行还原,即popad。所以我们只要在esp堆栈压入的最后一个数据那里设置硬件断点(因为堆栈式先进后出原则,esp现在指向的是压栈的最后的数据,还原时肯定会先从这块数据还原),当执行popad还原寄存器时的位置,一般这个指令位置都是解密后的数据。
所以我们右键选择数据窗口跟随
脱壳 !EP(EXE PACK)1.2
在esp指向的内存处设置硬件访问断点
脱壳 !EP(EXE PACK)1.2
让程序继续执行,发现断到popad下一条指令位置,可以清楚的看到mov edx,0x004271b0这条指令。这很明显是进入了用户进程的代码段了,按常理说就应该是个教大距离跳转,这往往就是程序从加密壳区段跳转到解密后的代码段的过程,跳转到用户进程的OEP。
脱壳 !EP(EXE PACK)1.2
继续向下执行,执行jmp edx指令,基本断定该处为OEP。
脱壳 !EP(EXE PACK)1.2
确定了OEP为0x4271b0后,接下来该进行内存Dump
脱壳 !EP(EXE PACK)1.2
接下来检查要Dump的内存OEP是否和目前OEP值相等,相等就点击脱壳按钮
脱壳 !EP(EXE PACK)1.2
Dump完成后接下来修复导入表
脱壳 !EP(EXE PACK)1.2
选择当前正在运行的程序
脱壳 !EP(EXE PACK)1.2
修改解密后的OEP
脱壳 !EP(EXE PACK)1.2
点击自动查询IAT表,也就是导入地址表。
脱壳 !EP(EXE PACK)1.2
接下来获取导入函数
脱壳 !EP(EXE PACK)1.2
转储导入函数表
脱壳 !EP(EXE PACK)1.2
脱壳 !EP(EXE PACK)1.2
转储之后会新生成一个脱壳文件,运行转储后的脱壳文件。脱壳成功。
脱壳 !EP(EXE PACK)1.2