首页
社区
课程
招聘
[讨论]第二阶段第三题
发表于: 2007-9-3 18:46 12827

[讨论]第二阶段第三题

ccfer 活跃值
16
2007-9-3 18:46
12827
收藏
免费
支持
分享
最新回复 (5)
雪    币: 8209
活跃值: (4559)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
2
说明说明:
un test.exe

脱壳成功后同目录下会生成test_un.exe
2007-9-3 18:52
0
雪    币: 8209
活跃值: (4559)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
3
修正一个输入表不加密时产生的oep计算bug
上传的附件:
2007-9-3 20:14
0
雪    币: 8209
活跃值: (4559)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
以petgui.exe本身为例,ollydbg载入停在入口点:
004E3046 > B8 00304E00      MOV EAX,petgui.004E3000      ;指向壳区段,用来读取一些加壳数据
004E304B   68 E3644100      PUSH petgui.004164E3        ;SEH处理入口
004E3050   64:FF35 00000000 PUSH DWORD PTR FS:[0]
004E3057   64:8925 00000000 MOV DWORD PTR FS:[0],ESP
004E305E   66:9C            PUSHFW
004E3060   60               PUSHAD
004E3061   50               PUSH EAX
004E3062   8BD8             MOV EBX,EAX
004E3064   0300             ADD EAX,DWORD PTR DS:[EAX]
004E3066   68 A4A50000      PUSH 0A5A4
004E306B   6A 00            PUSH 0
004E306D   FF50 1C          CALL DWORD PTR DS:[EAX+1C]          ;kernel32.GlobalAlloc
004E3070   8943 08          MOV DWORD PTR DS:[EBX+8],EAX    ;解压缩用的临时缓冲区
004E3073   68 00004000      PUSH petgui.00400000
004E3078   8B3C24           MOV EDI,DWORD PTR SS:[ESP]
004E307B   8B33             MOV ESI,DWORD PTR DS:[EBX]
004E307D   66:81C7 8007     ADD DI,780
004E3082   8D741E 08        LEA ESI,DWORD PTR DS:[ESI+EBX+8]
004E3086   893B             MOV DWORD PTR DS:[EBX],EDI
004E3088   53               PUSH EBX
004E3089   8B5E 10          MOV EBX,DWORD PTR DS:[ESI+10]
004E308C   B8 80080000      MOV EAX,880
004E3091   56               PUSH ESI
004E3092   6A 02            PUSH 2
004E3094   50               PUSH EAX
004E3095   57               PUSH EDI
004E3096   6A 15            PUSH 15
004E3098   6A 0A            PUSH 0A
004E309A   56               PUSH ESI
004E309B   6A 04            PUSH 4
004E309D   50               PUSH EAX
004E309E   57               PUSH EDI
004E309F   FFD3             CALL EBX                            ; kernel32.VirtualProtect
004E30A1   83EE 08          SUB ESI,8
004E30A4   59               POP ECX
004E30A5   F3:A5            REP MOVSD
004E30A7   59               POP ECX
004E30A8   66:83C7 58       ADD DI,58
004E30AC   81C6 02010000    ADD ESI,102
004E30B2   F3:A5            REP MOVSD               ;把输入表用到dll名字复制到PE头内某区域
004E30B4   FFD3             CALL EBX
004E30B6   58               POP EAX
004E30B7   8D90 A0010000    LEA EDX,DWORD PTR DS:[EAX+1A0]  ;获取压缩数据表
004E30BD   8B0A             MOV ECX,DWORD PTR DS:[EDX]      ;压缩数据RVA
004E30BF   83C2 14          ADD EDX,14
004E30C2   8B5A F0          MOV EBX,DWORD PTR DS:[EDX-10]   ;解压后的长度
004E30C5   85DB             TEST EBX,EBX
004E30C7  ^74 F4            JE SHORT petgui.004E30BD
004E30C9   8B0424           MOV EAX,DWORD PTR SS:[ESP]      ;IMAGEBASE
004E30CC   8D3401           LEA ESI,DWORD PTR DS:[ECX+EAX]  ;压缩数据VA
004E30CF   8B6C24 04        MOV EBP,DWORD PTR SS:[ESP+4]
004E30D3   8B6D 08          MOV EBP,DWORD PTR SS:[EBP+8]    ;临时缓冲区
004E30D6   8B4A FC          MOV ECX,DWORD PTR DS:[EDX-4]    ;压缩数据长度*4
004E30D9   8BFD             MOV EDI,EBP
004E30DB   52               PUSH EDX
004E30DC   F3:A5            REP MOVSD               ;把压缩数据拷贝到临时缓冲区
004E30DE   8BF5             MOV ESI,EBP
004E30E0   8B7A F4          MOV EDI,DWORD PTR DS:[EDX-C]    ;解压后的目的RVA
004E30E3   03F8             ADD EDI,EAX             ;解压后的目的VA
004E30E5   EB 28            JMP SHORT petgui.004E310F       ;跳转到解压缩函数
 
解压缩函数:
004E310F   81FB 50C30000    CMP EBX,0C350
004E3115   73 0E            JNB SHORT petgui.004E3125
004E3117   6A 05            PUSH 5
004E3119   68 60C0FFFF      PUSH -3FA0
004E311E   68 60FCFFFF      PUSH -3A0
004E3123   EB 0C            JMP SHORT petgui.004E3131
004E3125   6A 08            PUSH 8
004E3127   68 0083FFFF      PUSH FFFF8300
004E312C   68 00FBFFFF      PUSH -500
004E3131   6A FF            PUSH -1
004E3133   33D2             XOR EDX,EDX
004E3135   33C9             XOR ECX,ECX
004E3137   A4               MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
004E3138   305F FF          XOR BYTE PTR DS:[EDI-1],BL
004E313B   4B               DEC EBX
004E313C  ^7E A9            JLE SHORT petgui.004E30E7
...
004E30E7   58               POP EAX
004E30E8   58               POP EAX
004E30E9   58               POP EAX
004E30EA   58               POP EAX
004E30EB   5A               POP EDX
004E30EC  ^74 CF            JE SHORT petgui.004E30BD        ;解压缩成功,则去继续解压缩下一块数据
004E30EE  ^E9 19FFFFFF      JMP petgui.004E300C         ;解压缩失败报告错误
 
我们发现上面的解压缩部分是个死循环,没有正常的出口,是直到解压异常后,进入到前面设置的SEH处理入口的:
004164E3   E8 4F000000      CALL petgui.00416537
...
00416537   33C0             XOR EAX,EAX
00416539   5E               POP ESI
0041653A   64:8B18          MOV EBX,DWORD PTR FS:[EAX]
0041653D   8B1B             MOV EBX,DWORD PTR DS:[EBX]
0041653F   8D63 D6          LEA ESP,DWORD PTR DS:[EBX-2A]
00416542   5D               POP EBP
00416543   8D8E CB020000    LEA ECX,DWORD PTR DS:[ESI+2CB]  ;004167B3
00416549   894B 04          MOV DWORD PTR DS:[EBX+4],ECX    ;设置新的SEH处理入口004167B3
0041654C   64:891D 00000000 MOV DWORD PTR FS:[0],EBX
00416553   8B3C24           MOV EDI,DWORD PTR SS:[ESP]
00416556   FF77 08          PUSH DWORD PTR DS:[EDI+8]       ;临时缓冲区地址
00416559   FF95 A0070000    CALL DWORD PTR SS:[EBP+7A0]         ;kernel32.GlobalFree,释放临时缓冲区
0041655F   81C7 3D000000    ADD EDI,3D
00416565   6A 0E            PUSH 0E
00416567   59               POP ECX
00416568   F3:A4            REP MOVSB               ;拷贝0Eh字节加密的数据,和以后的oep相关
0041656A   FF33             PUSH DWORD PTR DS:[EBX]
0041656C   56               PUSH ESI
0041656D   57               PUSH EDI
0041656E   8DB7 55010000    LEA ESI,DWORD PTR DS:[EDI+155]
00416574   8BCE             MOV ECX,ESI
00416576   2BCF             SUB ECX,EDI
00416578   F3:AA            REP STOS BYTE PTR ES:[EDI]      ;清除壳区段一些不用的数据
0041657A   60               PUSHAD
0041657B   FFE0             JMP EAX             ;跳到0地址去运行,会产生异常
 
上面的代码异常后来到这里,主要完成解压缩后的数据修复还原:
004167B3   33C0             XOR EAX,EAX
004167B5   64:8B18          MOV EBX,DWORD PTR FS:[EAX]
004167B8   8B1B             MOV EBX,DWORD PTR DS:[EBX]
004167BA   8D63 AE          LEA ESP,DWORD PTR DS:[EBX-52]
004167BD   61               POPAD
004167BE   833E 00          CMP DWORD PTR DS:[ESI],0        ;指向压缩数据表
004167C1  ^0F84 B6FDFFFF    JE petgui.0041657D          ;处理结束跳到
004167C7   8B7E 08          MOV EDI,DWORD PTR DS:[ESI+8]    ;解压缩后的目的RVA
004167CA   03FD             ADD EDI,EBP             ;解压缩后的目的RVA
004167CC   8B4E 0C          MOV ECX,DWORD PTR DS:[ESI+C]    ;需要补充的0的个数
004167CF   D1F9             SAR ECX,1
004167D1   51               PUSH ECX
004167D2   72 15            JB SHORT petgui.004167E9        ;如果是代码段,要先还原优化代码
004167D4   037E 04          ADD EDI,DWORD PTR DS:[ESI+4]    ;解压缩后的长度
004167D7   C1F9 02          SAR ECX,2
004167DA   33C0             XOR EAX,EAX
004167DC   F3:AB            REP STOS DWORD PTR ES:[EDI]     ;补充0
004167DE   59               POP ECX
004167DF   83E1 03          AND ECX,3
004167E2   F3:AA            REP STOS BYTE PTR ES:[EDI]
004167E4   83C6 14          ADD ESI,14
004167E7  ^EB D5            JMP SHORT petgui.004167BE
004167E9   8B5E 04          MOV EBX,DWORD PTR DS:[ESI+4]    ;开始还原压缩优化代码
004167EC   83EB 06          SUB EBX,6
004167EF   33D2             XOR EDX,EDX
004167F1   3BD3             CMP EDX,EBX
004167F3  ^7D DF            JGE SHORT petgui.004167D4
004167F5   8A043A           MOV AL,BYTE PTR DS:[EDX+EDI]
004167F8   42               INC EDX
004167F9   3C E8            CMP AL,0E8              ;E8类型call
004167FB   74 12            JE SHORT petgui.0041680F
004167FD   3C E9            CMP AL,0E9              ;E9类型jmp
004167FF   74 0E            JE SHORT petgui.0041680F
00416801   3C 0F            CMP AL,0F               ;0F类型jcc
00416803  ^75 EC            JNZ SHORT petgui.004167F1
00416805   8A043A           MOV AL,BYTE PTR DS:[EDX+EDI]
00416808   24 F0            AND AL,0F0
0041680A   3C 80            CMP AL,80
0041680C  ^75 E3            JNZ SHORT petgui.004167F1
0041680E   42               INC EDX
0041680F   8B043A           MOV EAX,DWORD PTR DS:[EDX+EDI]
00416812   3C 0A            CMP AL,0A               ;标志字节
00416814  ^75 DB            JNZ SHORT petgui.004167F1
00416816   66:C1E8 08       SHR AX,8                ;对前面几种带相对DWORD偏移的代码进行偏移修复
0041681A   C1C0 10          ROL EAX,10
0041681D   86C4             XCHG AH,AL
0041681F   83C2 04          ADD EDX,4
00416822   2BC2             SUB EAX,EDX
00416824   89443A FC        MOV DWORD PTR DS:[EDX+EDI-4],EAX    ;写回修复值
00416828  ^EB C7            JMP SHORT petgui.004167F1
 
修复结束来到这里:
0041657D   5B               POP EBX
0041657E   5A               POP EDX
0041657F   64:8F05 00000000 POP DWORD PTR FS:[0]
00416586   58               POP EAX
00416587   6A 03            PUSH 3              ;初始输入表加密常数
00416589   53               PUSH EBX
0041658A   33DB             XOR EBX,EBX
0041658C   68 3E030000      PUSH 33E                ;校验长度
00416591   8B0C24           MOV ECX,DWORD PTR SS:[ESP]
00416594   0FBAE3 00        BT EBX,0
00416598   72 16            JB SHORT petgui.004165B0
0041659A   64:8B35 1C000000 MOV ESI,DWORD PTR FS:[1C]
004165A1   0FBAF6 00        BTR ESI,0
004165A5   64:0335 22000000 ADD ESI,DWORD PTR FS:[22]
004165AC   46               INC ESI
004165AD   66:33DE          XOR BX,SI
004165B0   321C11           XOR BL,BYTE PTR DS:[ECX+EDX]    ;计算一段壳处理代码的校验值
004165B3   C1C3 0F          ROL EBX,0F
004165B6   49               DEC ECX
004165B7  ^7D DB            JGE SHORT petgui.00416594
004165B9   8D48 3B          LEA ECX,DWORD PTR DS:[EAX+3B]   ;用前面校验值去解码4个DWORD
004165BC   3119             XOR DWORD PTR DS:[ECX],EBX
004165BE   3159 04          XOR DWORD PTR DS:[ECX+4],EBX
004165C1   3159 08          XOR DWORD PTR DS:[ECX+8],EBX
004165C4   3159 0C          XOR DWORD PTR DS:[ECX+C],EBX
004165C7   59               POP ECX
004165C8   315C11 01        XOR DWORD PTR DS:[ECX+EDX+1],EBX
004165CC   33DB             XOR EBX,EBX
004165CE   8BF2             MOV ESI,EDX
004165D0   81BA 769BFEFF 46>CMP DWORD [EDX+FFFE9B76],0E3046  ;Virus detection之检查程序的入口点
004165DA   75 21            JNZ SHORT petgui.004165FD
004165DC   81EE B2640100    SUB ESI,164B2
004165E2   0FB64E 06        MOVZX ECX,BYTE PTR DS:[ESI+6]
004165E6   6BC9 0A          IMUL ECX,ECX,0A
004165E9   66:81C1 3E00     ADD CX,3E
004165EE   331E             XOR EBX,DWORD PTR DS:[ESI]
004165F0   D3C3             ROL EBX,CL
004165F2   83C6 04          ADD ESI,4
004165F5   49               DEC ECX
004165F6  ^75 F6            JNZ SHORT petgui.004165EE
004165F8   3958 04          CMP DWORD PTR DS:[EAX+4],EBX    ;Virus detection之检查PE头
004165FB   74 08            JE SHORT petgui.00416605
004165FD   83C4 2A          ADD ESP,2A
00416600  -E9 14CA0C00      JMP petgui.004E3019
00416605   8DB5 CC590100    LEA ESI,DWORD PTR SS:[EBP+159CC]    ;开始处理输入表
0041660B   8D8D 00080000    LEA ECX,DWORD PTR SS:[EBP+800]  ;输入表用的dll名字
00416611   8BD8             MOV EBX,EAX
00416613   833E 00          CMP DWORD PTR DS:[ESI],0
00416616   0F84 0E020000    JE petgui.0041682A          ;输入表处理结束则跳到0041682A
0041661C   51               PUSH ECX
0041661D   51               PUSH ECX
0041661E   FF95 A4070000    CALL DWORD PTR SS:[EBP+7A4]     ;GetModuleHandleA
00416624   85C0             TEST EAX,EAX
00416626   75 11            JNZ SHORT petgui.00416639
00416628   83EC 04          SUB ESP,4
0041662B   FF95 90070000    CALL DWORD PTR SS:[EBP+790]     ;LoadLibraryA
00416631   85C0             TEST EAX,EAX
00416633   0F84 DF000000    JE petgui.00416718
00416639   8BF8             MOV EDI,EAX             ;模块基地址
0041663B   0340 3C          ADD EAX,DWORD PTR DS:[EAX+3C]   ;PE
0041663E   8B40 78          MOV EAX,DWORD PTR DS:[EAX+78]   ;export rva
00416641   FF7438 18        PUSH DWORD PTR DS:[EAX+EDI+18]  ;export数目
00416645   8B4C38 24        MOV ECX,DWORD PTR DS:[EAX+EDI+24]
00416649   03CF             ADD ECX,EDI
0041664B   51               PUSH ECX
0041664C   8B4C38 20        MOV ECX,DWORD PTR DS:[EAX+EDI+20]
00416650   03CF             ADD ECX,EDI
00416652   51               PUSH ECX
00416653   FF7438 10        PUSH DWORD PTR DS:[EAX+EDI+10]  ;export ord最小值
00416657   FF7438 14        PUSH DWORD PTR DS:[EAX+EDI+14]  ;export ord最大值
0041665B   8B4438 1C        MOV EAX,DWORD PTR DS:[EAX+EDI+1C]   ;export函数表
0041665F   03C7             ADD EAX,EDI
00416661   50               PUSH EAX
00416662   56               PUSH ESI
00416663   8B36             MOV ESI,DWORD PTR DS:[ESI]
00416665   03F5             ADD ESI,EBP
00416667   8B06             MOV EAX,DWORD PTR DS:[ESI]
00416669   85C0             TEST EAX,EAX
0041666B   0F84 81000000    JE petgui.004166F2          ;本模块结束则跳到004166F2
00416671   79 2F            JNS SHORT petgui.004166A2       ;是否为序号方式
00416673   0FBAE0 1E        BT EAX,1E
00416677   72 29            JB SHORT petgui.004166A2
00416679   0FB7C0           MOVZX EAX,AX            ;通过序号直接去函数地址
0041667C   2B4424 0C        SUB EAX,DWORD PTR SS:[ESP+C]
00416680   0F82 AB000000    JB petgui.00416731
00416686   3B4424 08        CMP EAX,DWORD PTR SS:[ESP+8]
0041668A   0F83 A1000000    JNB petgui.00416731
00416690   C1E0 02          SHL EAX,2
00416693   034424 04        ADD EAX,DWORD PTR SS:[ESP+4]
00416697   8B00             MOV EAX,DWORD PTR DS:[EAX]
00416699   03C7             ADD EAX,EDI
0041669B   8906             MOV DWORD PTR DS:[ESI],EAX      ;取得的函数地址写到输入表
0041669D   83C6 04          ADD ESI,4
004166A0  ^EB C5            JMP SHORT petgui.00416667
004166A2   03C6             ADD EAX,ESI             ;Name方式取函数地址
004166A4   50               PUSH EAX
004166A5   50               PUSH EAX
004166A6   57               PUSH EDI
004166A7   FF95 94070000    CALL DWORD PTR SS:[EBP+794]     ;GetProcAddress
004166AD   85C0             TEST EAX,EAX
004166AF   74 7F            JE SHORT petgui.00416730
004166B1   FF4C24 28        DEC DWORD PTR SS:[ESP+28]       ;下面一段是输入表加密选择处理部分
004166B5   7D 1F            JGE SHORT petgui.004166D6
004166B7   8B5424 24        MOV EDX,DWORD PTR SS:[ESP+24]   ;满足条件进行加密
004166BB   C602 E9          MOV BYTE PTR DS:[EDX],0E9       ;写JMP指令
004166BE   2BC2             SUB EAX,EDX
004166C0   83E8 05          SUB EAX,5
004166C3   8942 01          MOV DWORD PTR DS:[EDX+1],EAX    ;写JMP到API的相对偏移
004166C6   8BC2             MOV EAX,EDX
004166C8   83C2 05          ADD EDX,5
004166CB   895424 24        MOV DWORD PTR SS:[ESP+24],EDX
004166CF   83E2 07          AND EDX,7
004166D2   895424 28        MOV DWORD PTR SS:[ESP+28],EDX   ;调整输入表加密常数
004166D6   8906             MOV DWORD PTR DS:[ESI],EAX      ;函数地址写到输入表
004166D8   873C24           XCHG DWORD PTR SS:[ESP],EDI
004166DB   83C9 FF          OR ECX,FFFFFFFF
004166DE   33C0             XOR EAX,EAX
004166E0   F2:AE            REPNE SCAS BYTE PTR ES:[EDI]
004166E2   FD               STD
004166E3   F7D1             NOT ECX
004166E5   4F               DEC EDI
004166E6   F3:AA            REP STOS BYTE PTR ES:[EDI]      ;销毁函数名
004166E8   5F               POP EDI
004166E9   FC               CLD
004166EA   83C6 04          ADD ESI,4
004166ED  ^E9 75FFFFFF      JMP petgui.00416667         ;去处理下一个函数
004166F2   5E               POP ESI             ;一个模块处理结束
004166F3   83C4 18          ADD ESP,18
004166F6   8B16             MOV EDX,DWORD PTR DS:[ESI]
004166F8   03D5             ADD EDX,EBP
004166FA   8D43 47          LEA EAX,DWORD PTR DS:[EBX+47]
004166FD   8B4C24 04        MOV ECX,DWORD PTR SS:[ESP+4]
00416701   833A 00          CMP DWORD PTR DS:[EDX],0        ;遍历本模块生成的函数地址
00416704   74 12            JE SHORT petgui.00416718        ;本模块处理完成则跳去处理下一模块
00416706   3B1A             CMP EBX,DWORD PTR DS:[EDX]      ;下面一段代码根据函数加密情况去解码OEP
00416708   8318 00          SBB DWORD PTR DS:[EAX],0        ;没加密会减1,加密会减2,最后ror 3位
0041670B   390A             CMP DWORD PTR DS:[EDX],ECX
0041670D   8318 00          SBB DWORD PTR DS:[EAX],0
00416710   83C2 04          ADD EDX,4
00416713   C108 03          ROR DWORD PTR DS:[EAX],3
00416716  ^EB E9            JMP SHORT petgui.00416701
00416718   C706 00000000    MOV DWORD PTR DS:[ESI],0
0041671E   5F               POP EDI
0041671F   83C9 FF          OR ECX,FFFFFFFF
00416722   33C0             XOR EAX,EAX
00416724   F2:AE            REPNE SCAS BYTE PTR ES:[EDI]    ;指向下一模块名字
00416726   8BCF             MOV ECX,EDI
00416728   83C6 04          ADD ESI,4
0041672B  ^E9 E3FEFFFF      JMP petgui.00416613         ;跳去处理下一模块
 
所有输入表处理完成以后来到这里:
0041682A   59               POP ECX
0041682B   5E               POP ESI
0041682C   FD               STD
0041682D   33C0             XOR EAX,EAX
0041682F   B9 57030000      MOV ECX,357
00416834   E8 04C80C00      CALL petgui.004E303D
再来到这里:
004E303D   5F               POP EDI
004E303E   F3:AA            REP STOS BYTE PTR ES:[EDI]      ;销毁壳处理代码
004E3040   61               POPAD
004E3041   66:9D            POPFW
004E3043   83C4 08          ADD ESP,8
004E3046  -E9 8CA0F2FF      JMP petgui.0040D0D7         ;跳到OEP
 
 
前面是level1~9的exe的情况,level0的入口稍有不同:
1000E10F > B8 00E00010      MOV EAX,b0.1000E000
1000E114   6A 00            PUSH 0              ;level这里多push一个0
1000E116   68 F67B0010      PUSH b0.10007BF6
 
level0的解压算法也是特殊的:
1000E1A4   50               PUSH EAX
1000E1A5   800424 0C        ADD BYTE PTR SS:[ESP],0C        ;解压参数8
1000E1A9   50               PUSH EAX
1000E1AA   800424 46        ADD BYTE PTR SS:[ESP],46        ;解压参数7
1000E1AE   50               PUSH EAX
1000E1AF   800424 65        ADD BYTE PTR SS:[ESP],65        ;解压参数6
1000E1B3   50               PUSH EAX
1000E1B4   800424 A1        ADD BYTE PTR SS:[ESP],0A1       ;解压参数5
1000E1B8   50               PUSH EAX
1000E1B9   800424 BF        ADD BYTE PTR SS:[ESP],0BF       ;解压参数4
1000E1BD   8B0B             MOV ECX,DWORD PTR DS:[EBX]
1000E1BF   83C3 14          ADD EBX,14
1000E1C2   8B53 F0          MOV EDX,DWORD PTR DS:[EBX-10]
1000E1C5   85D2             TEST EDX,EDX
1000E1C7  ^74 F4            JE SHORT b0.1000E1BD
1000E1C9   8B4424 18        MOV EAX,DWORD PTR SS:[ESP+18]
1000E1CD   8D3401           LEA ESI,DWORD PTR DS:[ECX+EAX]
1000E1D0   8B6C24 1C        MOV EBP,DWORD PTR SS:[ESP+1C]
1000E1D4   8B6D 08          MOV EBP,DWORD PTR SS:[EBP+8]
1000E1D7   8B4B FC          MOV ECX,DWORD PTR DS:[EBX-4]
1000E1DA   8BFD             MOV EDI,EBP
1000E1DC   F3:A5            REP MOVSD
1000E1DE   8BF5             MOV ESI,EBP
1000E1E0   8B7B F4          MOV EDI,DWORD PTR DS:[EBX-C]
1000E1E3   03F8             ADD EDI,EAX
1000E1E5   53               PUSH EBX                ;解压参数3
1000E1E6   52               PUSH EDX                ;解压参数2
1000E1E7   57               PUSH EDI                ;解压参数1
1000E1E8   55               PUSH EBP                ;解压参数0
1000E1E9   E8 2D000000      CALL b0.1000E21B            ;解压函数,函数比较长,不贴代码了
1000E1EE   85C0             TEST EAX,EAX
1000E1F0  ^0F84 DCFEFFFF    JE b0.1000E0D2
1000E1F6   5A               POP EDX
1000E1F7   59               POP ECX
1000E1F8   59               POP ECX
1000E1F9   5B               POP EBX
1000E1FA  ^EB C1            JMP SHORT b0.1000E1BD
 
对于dll在输入表处理结束后,会有一段重定位表的处理代码:
10007F4C   8D8D 00D00000    LEA ECX,DWORD PTR SS:[EBP+D000] ;指向加密的reloc表
10007F52   8BF9             MOV EDI,ECX
10007F54   8BD5             MOV EDX,EBP
10007F56   8B01             MOV EAX,DWORD PTR DS:[ECX]
10007F58   85C0             TEST EAX,EAX
10007F5A   74 1A            JE SHORT b0.10007F76        ;0结束标志
10007F5C   3C FF            CMP AL,0FF
10007F5E   75 0A            JNZ SHORT b0.10007F6A
10007F60   C1E8 08          SHR EAX,8               ;如果是0FFh表示长地址跨越
10007F63   03D0             ADD EDX,EAX             ;
10007F65   83C1 04          ADD ECX,4               ;包括前面的0FFh一共占用4字节
10007F68  ^EB EC            JMP SHORT b0.10007F56
10007F6A   41               INC ECX             ;不是0FF的,怎只用单字节表示一项
10007F6B   25 FF000000      AND EAX,0FF             ;表示和前一项重定位地址的差
10007F70   03D0             ADD EDX,EAX             ;累加差值得到地址
10007F72   012A             ADD DWORD PTR DS:[EDX],EBP      ;修复重定位
10007F74  ^EB E0            JMP SHORT b0.10007F56
 
如果加壳选项没选Mangle imports则输入表加密部分的处理代码会是一些nop字节
2007-9-4 22:10
0
雪    币: 8209
活跃值: (4559)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
5
脱壳机实现原理:
1. 以SEC_IMAGE方式CreateFileMapping,得到展开的PE映象,并复制到一块新分配的内存
2. 通过入口点简单判断,取得第一处的SEH处理地址和压缩数据表
3. 根据后面的一些代码特征判断一下压缩算法是哪种
4. 用相对应的解压算法根据压缩数据表完成解压缩
5. 以前面的SEH处理地址为入口,从已解压的壳处理代码中得到一些关键数据和加密常量
6. 修复E8,E9,和0F 8?三种类型代码的偏移值
7. 修复输入表,并同时完成OEP的解码
8. 如果有重定位表则修复重定位表
9. 修复PE头,做些简单优化,以减小体积
10.把内存中的数据逐块写到输出文件,完成脱壳
2007-9-4 22:32
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
6
样本序号 执行结果 原始大小 解压大小
1              pass   20,480    13,312
2              pass   20,480    13,312
3              pass   368,128  370,688
4              pass   368,128  370,688
5              pass   24,576    17,408
6           fail
7           fail
8              pass   24,576    11,776  

name        起始时间        结束时间        做题时间        脱壳成功文件数        解压比例        提交次数       

ccfer        2007-9-2 12:00        2007-9-3 20:13        1933        6        1        2

得分107.4895123
2007-9-10 11:02
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册