某软件的脱壳&爆破
一、脱壳
设置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掉上述代码了。
该软件作者写的几个系列程序一般都可以用上述方法破解。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课