-
-
[原创] [for newbabie] PECompact v2.79 loader分析.By winndy
-
发表于: 2007-10-6 15:56 8007
-
[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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)