脱壳存根
被加壳程序中的脱壳存根由操作系统加载,然后脱壳存根负载加载原始程序。对于加壳程序来说,可执行程序的入口点指向脱壳存根,而不是原始代码。原始程序通常存储在加壳程序的一个或多个附加节中。
脱壳存根执行了以下三步操作:
1. 将原始程序脱壳到内存中;
2. 解析原始可执行文件的所有导入函数;
3. 将可执行程序转移到原始的程序入口点(OEP)。
尾部跳转
一旦脱壳存根完成脱壳,他就必须转到OEP运行。转到OEP的指令通常被叫做尾部跳转指令(jmp、ret、call)。
书中对于脱壳过程图示如下:
Lab18-01.exe
首先利用peid进行查壳
可以看出这是一个被UPX加壳的文件。UPX是一个压缩壳,并不是一个加密壳。
在OD中打开Lab18-01.exe分析:
可以看出这并不是OEP,而是脱壳存根。为了进行脱壳,我们需要找到尾部跳转从而得到OEP。00409DC0处的指令为pushad,在脱壳存根中为了保持栈平衡,也一定会一个popad的命令。
PUSHAD 指令
本指令将EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 这8个32位通用寄存器依次压入堆栈,其中SP的值是在此条件指令未执行之前的值.压入堆栈之后,ESP-32–>ESP.
POPAD 指令
本指令依次弹出堆栈中的32位字到 EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX中,弹出堆栈之后,ESP+32–>ESP.
在OD中查找popad命令,在00409F43处看到jmp指令。
在IDA中定位到00409F43分析:
结果UPX压缩后,IDA不能识别处 00409F43处的有效地址,所以猜测该处的jmp就是尾部跳转指令。
另外在od中看到:
该地址后面一堆这样0000没有意义的代码!并且40154F和409F43的地址差异太大,也是疑点!
OD中在00409F43处下断点并step 下一条指令,看到下面这种奇怪的东西:
然后可以看到二进制数据了:
然后dump:
右键OEP后使用OllyDump插件脱壳:
“重建输入表”取消勾选后点击脱壳。
保持OD不退出, 然后使用ImportREC获取导入表
点击fixdump,修复转存文件
至此已完成脱壳,脱壳后的文件就是unpack_那个!
标签:脱壳,18,OEP,lab,加壳,存根,指令,恶意代码 From: https://www.cnblogs.com/bonelee/p/16758192.html