[for newbabie] PECompact v2.79 loader分析.By winndy
1.WHY?
   PECompact是一款压缩壳,要脱很容易,但我的感觉是脱完了,啥感觉都没有,
到达OEP之间,沿途的风景都看不到。勿在浮砂筑高台。于是用IDA详细分析了一下loader。
最好自己打开idb文件取看看,教材不可能那么详细。
   分析到这个样子之后,后来我发现居然有PECompact的loader sdk,于是没兴趣分析下去了。
原本还打算做个静态脱壳机的,有时间了也许再对照loader sdk,拿来当编程的例子练手。
   这个loader分析我也没参考其他人的分析,后来在论坛搜了一把,发现berglob也有个分析。
我是自己学习才这样分析一遍的。

2. HOW?
2.1  

入口处:



SEH handler:0043897C



0043897C-0043899E处的代码将0043899F处的代码为 
Mov    eax,0F0437701h
并将修改00401016处的代码为:
00401016  - E9 84790300     jmp     0043899F
将流程转到0043899F,然后卸载SHE handler。

然后分配一块内存,并解压loader的代码,解压算法为aplib。分配内存的大小和待解压代码的RVA在
_aP_depack_asm和SEH handler之间,见注释。



aP_depack_asm是根据源码对照识别出来的。

Loader用aplib解压出来后,然后去执行(call edi),将主程序再用LZMA算法解压出来,并进行一些修复工作
和填充IAT等的工作。最后算出OEP,返回,用 jmp eax,调到OEP。




2.2 解压出来的loader

Loader的代码如下:(call edi ,edi=003C09F0进入)

003C0000的代码部分dump出来之后,也用IDA进行分析,只要将载入偏移量设为003C0000进行了。



loader的主要代码如下:



最后对解压出来得区段设置相应的内存属性:



值得注意的是,后来我PECompact发现有loader SDK,那些函数名都是自己定义的,不是很确切。但在loader SDK中是没有aplib和LZMA的解压部分的。


调用LZMA解压的代码片段为:



循环取_LZMADecode_Section的地址,保存在eax中,然后call eax进行调用。
抽出来的_LZMA_Decode的asm代码我没能与c代码对应起来。


还有比较有意思的一段代码,FixCalls_E8F1_Jmps:
扫描call 32bit,jmp 32bits,因为call和jmp之后的地址是加密了的,需要解密出来。


上面的11F1常数取自:


补上E8F1的代码片段为:FixCalls_E8F1


3.Summary

尽管后来找到loader sdk,但loader SDK却没有aplib和lzma的解压函数,这个PECompact是不是在忽悠纳税人啊!
不过这也是第一次这样分析一款压缩壳,收获颇多。
详细的分析大家还是看idb去。要写静态脱壳机,还需要仔细对照sdk看,还有很多情况要考虑。
高手不要笑啊!

IDB和抽出来的LZMA_Decode_ASM.asm

PECompact v2.79 loader分析.By.winndy.zip