PECompact壳研究与解密脱壳

[ 来源:http://www.91now.com/down/ | 作者: | 时间:2008-8-17 | 浏览: 人次 ]

来源:安全中国

因为PECompact有2种加壳方式,我也拜读了DiKeN的"PECompact的OEP的简易查找方法",于是想深入研究一下. 

 

这是98的Notepad.exe使用PECompact(JCALG1)压缩过的结果 

0040AB20 >EB 06            JMP SHORT NOTEPAD.0040AB28<==第一条指令 

0040AB22  68 CC100000      PUSH 10CC<======这就是程序的原始OEP的RVA地址 

 

这是这是98的Notepad.exe使用PECompact(aPLib)压缩过的结果 

0187:0040AB1F 68EB0668CC      PUSH    DWORD CC6806EB<==第一条指令 

0187:0040AB24 1000            ADC      [EAX],AL 

0187:0040AB26 00C3            ADD      BL,AL 

0187:0040AB28 9C              PUSHF  

0187:0040AB29 60              PUSHA  

这样就不能用DiKeN的"PECompact的OEP的简易查找方法"来找程序的OEP了. 

 

 

于是我手动跟踪了一下,并做了记录: 

Notepad.exe使用PECompact(JCALG1)压缩过 

0187:0040AAFF 65EB06          JMP      SHORT 0040AB08 

0187:0040AB02 68CC100000      PUSH    DWORD 10CC 

0187:0040AB07 C3              RET    

0187:0040AB08 9C              PUSHF  

0187:0040AB09 60              PUSHA  

0187:0040AB0A E802000000      CALL    0040AB11            //这里按F8继续. 

0187:0040AB0F 33C0            XOR      EAX,EAX 

0187:0040AB11 8BC4            MOV      EAX,ESP 

0187:0040AB13 83C004          ADD      EAX,BYTE +04 

...... 

按F12,到了这里 

0187:0040AB77 F3A5            REP MOVSD 

0187:0040AB79 8BFB            MOV      EDI,EBX 

0187:0040AB7B C3              RET                        //光标停在这里 

0187:0040AB7C BDCF400000      MOV      EBP,40CF 

0187:0040AB81 8BF7            MOV      ESI,EDI 

...... 

再按F12,到了这里 

0187:0040D551 68CC104000      PUSH    DWORD 004010CC 

0187:0040D556 C20400          RET      04                //返回OEP处了! 

0187:0040D559 8BB55B974000    MOV      ESI,[EBP+0040975B] 

到了OEP直接Makepe. 

 

Notepad.exe使用PECompact(aPLib)压缩 

0187:0040AB1F 68EB0668CC      PUSH    DWORD CC6806EB 

0187:0040AB24 1000            ADC      [EAX],AL 

0187:0040AB26 00C3            ADD      BL,AL 

0187:0040AB28 9C              PUSHF  

0187:0040AB29 60              PUSHA  

0187:0040AB2A E802000000      CALL    0040AB31            //F8进去后 

0187:0040AB2F 33C0            XOR      EAX,EAX 

0187:0040AB31 8BC4            MOV      EAX,ESP 

...... 

按F12 

0187:0040AB97 F3A5            REP MOVSD 

0187:0040AB99 8BFB            MOV      EDI,EBX 

0187:0040AB9B C3              RET                        //停在这里 

0187:0040AB9C BDCF400000      MOV      EBP,40CF 

...... 

再按F12 

0187:0040D54F 9D              POPF    

0187:0040D550 50              PUSH    EAX 

0187:0040D551 68CC104000      PUSH    DWORD 004010CC 

0187:0040D556 C20400          RET      04                //又返回OEP了,怎么这么简单? 

 

 

 

 

这里还有一点要说明,我发现使用PECompact压缩过的程序,用PROCDUMP或LordPE就算Dump出来还是不能使用 

对于Dump出来的程序必须要修改入口地址才可以 

记得以前在脱PECompact的壳时用PROCDUMP来Dump就非法,顺便用TRW跟了一下,有一点点体会如下: 

记得在TRW中输入Faults on,然后用PROCDUMP脱壳吧,然后TRW就跳出来了 

0187:004055C3 8B7D10          MOV      EDI,[EBP+10] 

0187:004055C6 56              PUSH    ESI 

0187:004055C7 51              PUSH    ECX 

0187:004055C8 AC              LODSB                  //停在这里,于是下断 bpx eip-1之后就F5 

0187:004055C9 AE              SCASB  

0187:004055CA 750B            JNZ      004055D7 

0187:004055CC 803F00          CMP      BYTE [EDI],00 

然后重新运行PROCDUMP,继续脱壳 

0187:004055C3 8B7D10          MOV      EDI,[EBP+10] 

0187:004055C6 56              PUSH    ESI 

0187:004055C7 51              PUSH    ECX            //断在这里 

让我们来修改吧 

a eip+1 

nop 

回车 

F5 

看看是不是正常脱壳了啊!当然也可以直接修改主程序,以后就不用这样反复修改了!查找8B 7D 10 56 51 AC AE,改为8B 7D 10 56 51 90 AE就可以了! 

不知道会不会有什么不对,还请高手指正! 

 

 

 

后记,其实我在跟踪的时候并不是上面写的时候那么容易,本来我是一步一步慢慢走的,后来跟了几遍,就发现了这个规律,所以没有详细写跟踪过程,只是把自己的总结写了出来,如果有什么不足或欠缺,还请多多指教,本人才疏学浅,还需要大家的帮助

 

修正一点错误 

关于Procdump的修改,当时没有发现,如果修改了主程序,使用脱壳脚本的时候会有问题,建议保留原来的备份.修改的程序作为专门脱用未修改程序脱壳时非法的工具

广告位