首页
论坛
专栏
课程

某软件的脱壳&爆破

2005-8-7 09:32 7663

某软件的脱壳&爆破

2005-8-7 09:32
7663
某软件的脱壳&爆破

一、脱壳

设置OD忽略所有异常,然后脱壳。

注意几点:一是bp VirtualAlloc 观察当EAX=3B0000时,分配内存块的大小,然后在原程序文件最后加个同样大小的区块,并记下其相对虚拟地址备用。
     二是再次载入程序,并bp VirtualAlloc 将返回值EAX改为前面记下的虚拟地址。这样就可以把有用的数据解压到可以DUMP的地址中。
     三是ALT+M打开内存镜像,在第二内存区下内存访问断点,断下后取消内存断点,再在第一内存区下内存访问断点,直到断在:

00371EBC    42              INC EDX
00371EBD    52              PUSH EDX
00371EBE    52              PUSH EDX
00371EBF    56              PUSH ESI
00371EC0    FF95 A4020000   CALL DWORD PTR SS:[EBP+2A4]
00371EC6    8907            MOV DWORD PTR DS:[EDI],EAX  ; ntdll.RtlDeleteCriticalSection///断在这里。
00371EC8    5A              POP EDX
00371EC9    0FB642 FF       MOVZX EAX,BYTE PTR DS:[EDX-1]
00371ECD    03D0            ADD EDX,EAX
00371ECF    42              INC EDX
00371ED0    83C7 04         ADD EDI,4
00371ED3    59              POP ECX
00371ED4  ^ E2 CA           LOOPD SHORT 00371EA0
00371ED6  ^ EB 93           JMP SHORT 00371E6B

这时EAX=77F38BB7 (ntdll.RtlDeleteCriticalSection) DS:[004F01B8]=00000000

其中004F01B8就是IAT地址所在地,从这里可以得知IAT的起始地址和大小。

然后往下找:

00371F27    FF95 A8020000   CALL DWORD PTR SS:[EBP+2A8]
00371F2D    85D2            TEST EDX,EDX
00371F2F    79 10           JNS SHORT 00371F41
00371F31    837A 08 FF      CMP DWORD PTR DS:[EDX+8],-1
00371F35    75 0A           JNZ SHORT 00371F41
00371F37    8B52 04         MOV EDX,DWORD PTR DS:[EDX+4]
00371F3A    C742 50 0010000>MOV DWORD PTR DS:[EDX+50],1000
00371F41    89AD 58020000   MOV DWORD PTR SS:[EBP+258],EBP
00371F47    8B85 C8020000   MOV EAX,DWORD PTR SS:[EBP+2C8]
00371F4D    0385 B4020000   ADD EAX,DWORD PTR SS:[EBP+2B4]
00371F53  - FFE0            JMP EAX     ; RealExtr.004E6FE0///跳向OEP
00371F55    50              PUSH EAX
00371F56    8BC4            MOV EAX,ESP
00371F58    60              PUSHAD
00371F59    8BD8            MOV EBX,EAX

004E6FE0    55              PUSH EBP///OEP
004E6FE1    8BEC            MOV EBP,ESP
004E6FE3    83C4 F0         ADD ESP,-10
004E6FE6    B8 F86A4E00     MOV EAX,4E6AF8
004E6FEB    E8 6CF5F1FF     CALL 0040655C                                    ; 0040655C
004E6FF0    A1 FCED4E00     MOV EAX,DWORD PTR DS:[4EEDFC]
004E6FF5    8B00            MOV EAX,DWORD PTR DS:[EAX]
004E6FF7    E8 E0FCF8FF     CALL 00476CDC

到OEP后就可以DUMP,并用ImportREC修复IAT了。

二、爆破

bp CreateFileA 当堆栈区中出现所加载的程序名时返回程序领空,再跟踪一段可以发现许多类似密码的数据,然后就可以发现关键的CALL 00404628 。这个CALL是爆破该程序的关键,注册验证全在里面。

004BEEAD   .  8BC3          MOV EAX,EBX
004BEEAF   .  E8 44FBFFFF   CALL 004BE9F8                            ;  004BE9F8
004BEEB4   .  8B55 F0       MOV EDX,DWORD PTR SS:[EBP-10]
004BEEB7   .  58            POP EAX
004BEEB8   .  E8 6B57F4FF   CALL 00404628 ///注意这个CALL
004BEEBD   .  75 0E         JNZ SHORT 004BEECD                       ;  004BEECD
004BEEBF   .  8BC6          MOV EAX,ESI
004BEEC1   .  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
004BEEC4   .  E8 A753F4FF   CALL 00404270

1、解除10秒限制

这个程序当发现自己被修改后会在10秒后退出。

载入脱壳后的程序,然后bp SetTimer

几次后,堆栈区:

0012FD78   00434A9C  /CALL 到 SetTimer 来自 RealExtr.00434A97
0012FD7C   00AD012C  |hWnd = 00AD012C (class='TPUtilWindow')
0012FD80   00000001  |TimerID = 1
0012FD84   00002710  |Timeout = 10000. ms///10秒
0012FD88   00000000  \Timerproc = NULL

返回程序领空,跟踪来到:

004E263E   .  E8 19FDFFFF   CALL 004E235C                            ;  004E235C
004E2643   .  8B45 E8       MOV EAX,DWORD PTR SS:[EBP-18]
004E2646   .  8D55 EC       LEA EDX,DWORD PTR SS:[EBP-14]
004E2649   .  E8 96FCFFFF   CALL 004E22E4                            ;  004E22E4
004E264E   .  8B55 EC       MOV EDX,DWORD PTR SS:[EBP-14]
004E2651   .  58            POP EAX
004E2652   .  E8 D11FF2FF   CALL 00404628 ///注意这个CALL
004E2657   .  74 14         JE SHORT 004E266D ///跳过设置10秒限制的CALL,改为JMP
004E2659   .  A1 08ED4E00   MOV EAX,DWORD PTR DS:[4EED08]
004E265E   .  8B00          MOV EAX,DWORD PTR DS:[EAX]
004E2660   .  8B80 C4030000 MOV EAX,DWORD PTR DS:[EAX+3C4]
004E2666   .  B2 01         MOV DL,1
004E2668   .  E8 7724F5FF   CALL 00434AE4 ///设置10秒限制。
004E266D   >  33C0          XOR EAX,EAX
004E266F   .  5A            POP EDX
004E2670   .  59            POP ECX
004E2671   .  59            POP ECX
004E2672   .  64:8910       MOV DWORD PTR FS:[EAX],EDX

将004E2657处修改为JMP就可以取消10秒限制。

2、解除程序点击关键按钮时自动注销系统的限制

载入已经取消10秒限制的程序,F9运行,然后探索所有命令:CALL 00404628 并全部下断。点击“转换”按钮,直到断在:

004E2701   .  E8 DEFBFFFF   CALL 004E22E4                            ;  004E22E4
004E2706   .  8B55 EC       MOV EDX,DWORD PTR SS:[EBP-14]
004E2709   .  58            POP EAX
004E270A   .  E8 191FF2FF   CALL 00404628 ///断在这里。
004E270F   .  74 09         JE SHORT 004E271A ///跳过注销系统的CALL。改为JMP。
004E2711   .  6A 04         PUSH 4
004E2713   .  6A 04         PUSH 4
004E2715   .  E8 7647F2FF   CALL 00406E90 ///注销系统的CALL。
004E271A   >  33C0          XOR EAX,EAX
004E271C   .  5A            POP EDX
004E271D   .  59            POP ECX
004E271E   .  59            POP ECX

3、取消只能转换50%的限制

未注册版本只能转换50%。载入经过上述破解的程序,F9运行,选择一个视频文件进行压缩操作。在点“转换”前探索所有命令:CALL 00404628 并在所有找到的CALL上下断,再点“转换”。程序断下:

第一次:

004BED30   .  E8 F358F4FF   CALL 00404628 ///断下后取消断点。
004BED35   .  75 0E         JNZ SHORT 004BED45                       ;  004BED45
004BED37   .  8BC6          MOV EAX,ESI
004BED39   .  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
004BED3C   .  E8 2F55F4FF   CALL 00404270                            ;  00404270
004BED41   .  B3 01         MOV BL,1

第二次:

004E2701   .  E8 DEFBFFFF   CALL 004E22E4                            ;  004E22E4
004E2706   .  8B55 EC       MOV EDX,DWORD PTR SS:[EBP-14]
004E2709   .  58            POP EAX
004E270A   .  E8 191FF2FF   CALL 00404628 ///断下后取消断点。
004E270F     /EB 09         JMP SHORT 004E271A ///这里已经改了。
004E2711   .  6A 04         PUSH 4
004E2713   .  6A 04         PUSH 4
004E2715   .  E8 7647F2FF   CALL 00406E90                            ;  00406E90
004E271A   >  33C0          XOR EAX,EAX
004E271C   .  5A            POP EDX
004E271D   .  59            POP ECX
004E271E   .  59            POP ECX
004E271F   .  64:8910       MOV DWORD PTR FS:[EAX],EDX

第三次:

00456C7C  |.  E8 A7D9FAFF   CALL 00404628  ///断下后取消断点。
00456C81  |.  74 10         JE SHORT 00456C93                        ;  00456C93
00456C83  |.  8BC6          MOV EAX,ESI
00456C85  |.  E8 52DAFAFF   CALL 004046DC                            ;  004046DC
00456C8A  |.  8BD0          MOV EDX,EAX
00456C8C  |.  8BC3          MOV EAX,EBX

第四次:

004E1C50  |.  E8 D329F2FF   CALL 00404628  ///断下后取消断点。
004E1C55  |.  75 0A         JNZ SHORT 004E1C61                       ;  004E1C61
004E1C57  |.  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]
004E1C5A  |.  E8 69E3FFFF   CALL 004DFFC8                            ;  004DFFC8
004E1C5F  |.  EB 08         JMP SHORT 004E1C69 ///下面会发现许多类似密码的数据。

第五次:

004E29A7   .  E8 7C1CF2FF   CALL 00404628 ///断下后取消断点。
004E29AC   .  75 02         JNZ SHORT 004E29B0
004E29AE   .  B3 01         MOV BL,1
004E29B0   >  33C0          XOR EAX,EAX
004E29B2   .  5A            POP EDX
004E29B3   .  59            POP ECX

堆栈区:
0012FB2C   00B08800  ASCII "B3C8"
0012FB30   00B087DC  ASCII "2E"
0012FB34   00B087EC  ASCII "142E"
0012FB38   00B087C8  ASCII "7BFC"

一路F8来到:

004E500A   . /EB 3C         JMP SHORT 004E5048
004E500C   > |A1 D4FF4E00   MOV EAX,DWORD PTR DS:[4EFFD4]
004E5011   . |E8 4A9AFFFF   CALL 004DEA60
004E5016   . |8945 C4       MOV DWORD PTR SS:[EBP-3C],EAX
004E5019   . |DB45 C4       FILD DWORD PTR SS:[EBP-3C]
004E501C   . |D835 04534E00 FDIV DWORD PTR DS:[4E5304] ///视频长度除以2,NOP掉。
004E5022   . |E8 B5DBF1FF   CALL 00402BDC
004E5027   . |8945 D4       MOV DWORD PTR SS:[EBP-2C],EAX
004E502A   . |A1 D4FF4E00   MOV EAX,DWORD PTR DS:[4EFFD4]
004E502F   . |E8 7099FFFF   CALL 004DE9A4
004E5034   . |8945 C4       MOV DWORD PTR SS:[EBP-3C],EAX
004E5037   . |DB45 C4       FILD DWORD PTR SS:[EBP-3C]
004E503A   . |D835 04534E00 FDIV DWORD PTR DS:[4E5304] ///音频长度除以2,NOP掉。
004E5040   . |E8 97DBF1FF   CALL 00402BDC
004E5045   . |8945 D0       MOV DWORD PTR SS:[EBP-30],EAX
004E5048   > \83CA FF       OR EDX,FFFFFFFF
004E504B   .  A1 D8FF4E00   MOV EAX,DWORD PTR DS:[4EFFD8]
004E5050   .  E8 CF97FFFF   CALL 004DE824
004E5055   .  83CA FF       OR EDX,FFFFFFFF
004E5058   .  A1 D8FF4E00   MOV EAX,DWORD PTR DS:[4EFFD8]
004E505D   .  E8 A699FFFF   CALL 004DEA08

将上述2处NOP掉就可以转换完整的电影文件了。还有一个方法就是把4E5304处的浮点数值

004E5304   .  00000040      DD FLOAT 2.000000

改为:

004E5304   .  0000803F      DD FLOAT 1.000000

这样就可以不NOP掉上述代码了。

该软件作者写的几个系列程序一般都可以用上述方法破解。

[公告]看雪20周年会 | 感恩有你,一路同行

最新回复 (20)
闪电狼 2005-8-7 09:56
2
0
精彩
hmimys 2 2005-8-7 10:00
3
0
学习一下,PF一下!分析的清楚
pendan2001 4 2005-8-7 10:14
4
0
kyc 19 2005-8-7 14:33
5
0
linhanshi 2005-8-7 14:39
6
0
学习的说
ljy3282393 1 2005-8-7 18:27
7
0
楼主:你脱的是什么软件是什么壳啊?如果不方便说明是什么软件,总可以说明是什么壳吧!
cater 5 2005-8-7 18:42
8
0
没听到他说某人啊~
某人有时厉害
某人有时又不利害
某人有时喜欢写某人某个软件的文章规~
Mr.R 2005-8-7 19:04
9
0
呵...学习学习...
LOVE 2005-8-7 19:59
10
0
学习的说 不知道软件名字。。
baby2008 28 2005-8-7 20:18
11
0
Real压缩快车
csjwaman 24 2005-8-7 20:35
12
0
我虽然说是某软件,其实文章中可以看出是什么软件的。
Saver 2005-8-7 21:11
13
0
学习..原来可以这样啊
yunfeng 1 2005-8-7 22:36
14
0
最初由 baby2008 发布
Real压缩快车

厉害,一眼就能看出来,佩服!
clide2000 7 2005-8-7 23:20
15
0
辛苦,支持
dfui 2005-8-8 09:36
16
0
现在破解水平的提高直接影响软件作者反盗技术狂加载。软件变的暗然无趣了…………
yunfeng 1 2005-8-9 07:49
17
0
这时EAX=77F38BB7 (ntdll.RtlDeleteCriticalSection) DS:[004F01B8]=00000000

其中004F01B8就是IAT地址所在地,从这里可以得知IAT的起始地址和大小。
请解释一下,我不太明白,如何从这里可以得知IAT的起始地址和大小。
csjwaman 24 2005-8-9 10:16
18
0
到入口后再看004F01B8处的数据,你就会明白了。
yunfeng 1 2005-8-9 12:32
19
0
最初由 csjwaman 发布
到入口后再看004F01B8处的数据,你就会明白了。

谢谢指点,我明白了。
pendan2001 4 2005-8-9 17:37
20
0
游侠201 2005-8-10 22:47
21
0
学习一下,PF一下!
游客
登录 | 注册 方可回帖
返回