能力值:
( LV9,RANK:210 )
|
-
-
2 楼
一, petite 2.3的Loader主要流程
1: 节数据处理
1) 根据数据描述, 对数据进行解压缩; 最后一次异常跳到下一步;
2) 修改SEH链, 部分数据拷贝; 异常跳到下一步
3) 节数据填充以及修复E8,E9,0F 8x指令;
4) 文件校验以及计算Key去解密伪入口;
2: 导入表处理
5) 处理导入表; 并解密伪入口指令;
6) 跳到伪入口;
二, 两个Loader的说明
1: Loader1 - 针对压缩Level = 1 - 9的选项
该Loader, 分配一块内存作为临时缓冲区, 然后根据数据描述进行解压缩;
压缩算法使用变形过的aPLib(至少这个我不知道和哪个官方版本对应); 由于算法很简单, 可以直接逆向过来;
(这个算法中间有些和aPLib不一样的地方, 或者说这个算法是有问题的, 或者故意这样设置的?)
2:Loader2-针对压缩Level=0的选项
该Loader分配两块内存, 一块作为临时缓冲区, 一块作为算法核心数据区; 根据数据描述进行解压缩;
压缩算法使用变形过的zLib(估计是1.13, 用PEiD也能识别出来; 仔细看汇编也能识别出算法; 仔细对比汇编代码和
源代码可以看出有些什么变化), 稍作修改, 直接使用原始算法库了;)
3:公共部分
Loader1, Loader2除了数据解压缩部分有一定区别, 其他处理基本完全一致; 但一些偏移或者说相对偏移
不一致而已.
三, 壳的一些小技巧, 只会对新手有一点点障碍, 对于老手完全忽略不计
1. 利用异常跳到下一个处理点;
2. 直接修改SEH's Handler;
四, 手动脱壳
1. 忽略所有异常;
2. bp GetModuleHandleA
3. 返回到用户空间, 看上面的指令
0044C778 833E 00 cmp dword ptr [esi], 0
0044C77B 0F84 15020000 je 0044C996
跳转过去看到
0044C996 59 pop ecx
0044C997 5E pop esi
0044C998 FD std
0044C999 33C0 xor eax, eax
0044C99B B9 66030000 mov ecx, 366
0044C9A0 E8 61470000 call 00451106
接着跳过去看到
00451106 5F pop edi
00451107 F3:AA rep stos byte ptr es:[edi]
00451109 61 popad
0045110A 66:9D popfw
0045110C 83C4 0C add esp, 0C
0045110F >- E9 093BD19C jmp 9D164C1D
好了, 在这儿设断点bp 0045110F(或者直接搜索指令序列#5FF3AA61669D83C40CE9#)
4. 单步到达OEP, Dump&Rebuid Import.(记得使用Trace Level1(Disasm)哦)
|
能力值:
(RANK:170 )
|
-
-
3 楼
样本序号 执行结果 原始大小 解压大小
1 pass 20480 28672
2 failed
3 failed
4 failed
5 pass 24567 36864
6 failed
7 failed
8 failed
ID 起始时间 结束时间 做题时间 脱壳成功文件数 解压比例 提交次数
DiKeN 2007-9-2 12:00 2007-9-5 7:58 4078 2 0.932623594 1
得分:34.96650613
|