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