首页
社区
课程
招聘
[原创]Shrinker 3.3 轻松脱壳法
发表于: 2005-2-18 15:46 5258

[原创]Shrinker 3.3 轻松脱壳法

2005-2-18 15:46
5258
Shrinker 3.3 轻松脱壳法
[工具]:
Ollydbg,imprec,lordpe
[方法]:
1、忽略所有exception,ollydbg载入
2、查找二进制 FF75??FF75??FF75??FF55,下断点在查找到的call DWORD PTR SS:[EBP-??]上
3、F9,中断,F7进入oep,dump
4、查找iat位置及大小,imprec fix iat.

[例子]:
  Save-N-Sync: http://www.down8.cn/down.asp?id=10435&no=2
  依照上面的方法,我们忽略所有exception,ollydbg载入Save-N-Sync.exe
  

0056F3DA > 833D AC115600 00 CMP DWORD PTR DS:[5611AC],0 ;**poep**
0056F3E1 55 PUSH EBP
0056F3E2 8BEC MOV EBP,ESP
0056F3E4 56 PUSH ESI
0056F3E5 57 PUSH EDI
0056F3E6 75 65 JNZ SHORT Save-N-S.0056F44D
0056F3E8 68 00010000 PUSH 100
0056F3ED E8 D80A0000 CALL Save-N-S.0056FECA
0056F3F2 83C4 04 ADD ESP,4
0056F3F5 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
0056F3F8 A3 AC115600 MOV DWORD PTR DS:[5611AC],EAX
0056F3FD 85F6 TEST ESI,ESI
0056F3FF 74 1D JE SHORT Save-N-S.0056F41E
0056F401 68 FF000000 PUSH 0FF
0056F406 50 PUSH EAX
0056F407 56 PUSH ESI
0056F408 FF15 F4D15600 CALL DWORD PTR DS:[<&KERNEL32.GetModuleF>; kernel32.GetModuleFileNameA
0056F40E 85C0 TEST EAX,EAX
0056F410 74 0C JE SHORT Save-N-S.0056F41E
0056F412 C705 9CCF5600 01>MOV DWORD PTR DS:[56CF9C],1
0056F41C EB 32 JMP SHORT Save-N-S.0056F450
0056F41E 33FF XOR EDI,EDI
0056F420 57 PUSH EDI
0056F421 893D 9CCF5600 MOV DWORD PTR DS:[56CF9C],EDI
0056F427 FF15 80D25600 CALL DWORD PTR DS:[<&KERNEL32.GetModuleH>; kernel32.GetModuleHandleA
0056F42D 8BF0 MOV ESI,EAX
0056F42F 68 FF000000 PUSH 0FF
0056F434 A1 AC115600 MOV EAX,DWORD PTR DS:[5611AC]
0056F439 897D 10 MOV DWORD PTR SS:[EBP+10],EDI
0056F43C C745 0C 01000000 MOV DWORD PTR SS:[EBP+C],1
0056F443 50 PUSH EAX
0056F444 56 PUSH ESI
0056F445 FF15 F4D15600 CALL DWORD PTR DS:[<&KERNEL32.GetModuleF>; kernel32.GetModuleFileNameA
0056F44B EB 03 JMP SHORT Save-N-S.0056F450



查找二进制 FF75??FF75??FF75??FF55,


0056F4D6 FF75 10 PUSH DWORD PTR SS:[EBP+10]
0056F4D9 FF75 0C PUSH DWORD PTR SS:[EBP+C]
0056F4DC FF75 08 PUSH DWORD PTR SS:[EBP+8]
0056F4DF FF55 E0 CALL DWORD PTR SS:[EBP-20] ;***到oep的call***
0056F4E2 8945 E4 MOV DWORD PTR SS:[EBP-1C],EAX
0056F4E5 EB 07 JMP SHORT Save-N-S.0056F4EE
0056F4E7 C745 E4 01000000 MOV DWORD PTR SS:[EBP-1C],1
0056F4EE 85F6 TEST ESI,ESI
0056F4F0 74 29 JE SHORT Save-N-S.0056F51B
0056F4F2 837D 0C 00 CMP DWORD PTR SS:[EBP+C],0


我们在0056f4df上下断点,F9,然后F7进入

0050D514 55 DB 55 0050D515 8B DB 8B
0050D516 EC DB EC
0050D517 B9 DB B9
0050D518 09 DB 09
0050D519 00 DB 00
0050D51A 00 DB 00
0050D51B 00 DB 00
0050D51C 6A DB 6A
0050D51D 00 DB 00
0050D51E 6A DB 6A 0050D51F 00 DB 00
0050D520 49 DB 49 0050D521 75 DB 75

哦?怎么回事,呵呵。Ctrl+A让ollydbg分析一下。这就是我们的oep 0050d514了,快用lordpe dump吧。

0050D514 /. 55 PUSH EBP
0050D515 |. 8BEC MOV EBP,ESP
0050D517 |. B9 09000000 MOV ECX,9
0050D51C |> 6A 00 /PUSH 0
0050D51E |. 6A 00 |PUSH 0
0050D520 |. 49 |DEC ECX
0050D521 |.^75 F9 \JNZ SHORT Save-N-S.0050D51C
0050D523 |. 53 PUSH EBX
0050D524 |. 56 PUSH ESI
0050D525 |. 57 PUSH EDI
0050D526 |. B8 1CD15000 MOV EAX,Save-N-S.0050D11C
0050D52B |. E8 F499EFFF CALL Save-N-S.00406F24
0050D530 |. 8B1D 60115100 MOV EBX,DWORD PTR DS:[511160] ; Save-N-S.00513094
0050D536 |. 8B35 780E5100 MOV ESI,DWORD PTR DS:[510E78] ; Save-N-S.00512C18
0050D53C |. BF AC335100 MOV EDI,Save-N-S.005133AC
0050D541 |. 33C0 XOR EAX,EAX
0050D543 |. 55 PUSH EBP
0050D544 |. 68 5ADA5000 PUSH Save-N-S.0050DA5A
0050D549 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
0050D54C |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
0050D54F |. 68 04010000 PUSH 104 ; /BufSize = 104 (260.)
0050D554 |. 57 PUSH EDI ; |Buffer => Save-N-S.005133AC
0050D555 |. E8 5E9EEFFF CALL Save-N-S.004073B8 ; \GetSystemDirectoryA
0050D55A |. 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
0050D55D |. 8BD7 MOV EDX,EDI
0050D55F |. B9 05010000 MOV ECX,105
0050D564 |. E8 237FEFFF CALL Save-N-S.0040548C
0050D569 |. 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0050D56C |. 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]
0050D56F |. E8 2033F9FF CALL Save-N-S.004A0894
0050D574 |. 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14]
0050D577 |. A1 040A5100 MOV EAX,DWORD PTR DS:[510A04]
0050D57C |. E8 A37DEFFF CALL Save-N-S.00405324
0050D581 |. 68 04010000 PUSH 104 ; /BufSize = 104 (260.)
0050D586 |. 57 PUSH EDI ; |Buffer
0050D587 |. E8 749EEFFF CALL Save-N-S.00407400 ; \GetWindowsDirectoryA


我们看到下面有api调用的,0050d555处的CALL 004073B8,我们去看一下Ctrl+G,004073b8处

0040739E 8BC0 MOV EAX,EAX
004073A0 $-FF25 2C445100 JMP DWORD PTR DS:[51442C] ; kernel32.GetShortPathNameW
004073A6 8BC0 MOV EAX,EAX
004073A8 $-FF25 28445100 JMP DWORD PTR DS:[514428] ; kernel32.GetStdHandle
004073AE 8BC0 MOV EAX,EAX
004073B0 $-FF25 24445100 JMP DWORD PTR DS:[514424] ; kernel32.GetStringTypeExA
004073B6 8BC0 MOV EAX,EAX
004073B8 $-FF25 20445100 JMP DWORD PTR DS:[514420] ; kernel32.GetSystemDirectoryA
004073BE 8BC0 MOV EAX,EAX
004073C0 $-FF25 1C445100 JMP DWORD PTR DS:[51441C] ; kernel32.GetSystemInfo
004073C6 8BC0 MOV EAX,EAX
004073C8 $-FF25 18445100 JMP DWORD PTR DS:[514418] ; kernel32.GetTempPathA
004073CE 8BC0 MOV EAX,EAX
004073D0 $-FF25 14445100 JMP DWORD PTR DS:[514414] ; kernel32.GetThreadLocale
004073D6 8BC0 MOV EAX,EAX
004073D8 $-FF25 10445100 JMP DWORD PTR DS:[514410] ; kernel32.GetTickCount
004073DE 8BC0 MOV EAX,EAX
004073E0 $-FF25 0C445100 JMP DWORD PTR DS:[51440C] ; kernel32.GetUserDefaultLCID
004073E6 8BC0 MOV EAX,EAX
004073E8 $-FF25 08445100 JMP DWORD PTR DS:[514408] ; kernel32.GetVersion
004073EE 8BC0 MOV EAX,EAX
004073F0 $-FF25 04445100 JMP DWORD PTR DS:[514404] ; kernel32.GetVersionExA
004073F6 8BC0 MOV EAX,EAX
004073F8 $-FF25 00445100 JMP DWORD PTR DS:[514400] ; kernel32.GetVolumeInformationA
004073FE 8BC0 MOV EAX,EAX
00407400 $-FF25 FC435100 JMP DWORD PTR DS:[5143FC] ; kernel32.GetWindowsDirectoryA
00407406 8BC0 MOV EAX,EAX
00407408 $-FF25 F8435100 JMP DWORD PTR DS:[5143F8] ; kernel32.GlobalAddAtomA

原来是iat的重定位啊。我们到dump区域,514420看看

00514420 FC 1C E3 77 7B 3C E3 77 ?泖{<泖
00514428 D7 E7 E1 77 30 D8 E2 77 诅狩0剽w
00514430 70 AE E3 77 FB 2D E1 77 p?w?狩
00514438 30 45 E3 77 7E E9 E2 77 0E泖~殁w
00514440 D1 2C E1 77 4A A1 E1 77 ?狩J♂w
00514448 5E 8C E2 77 88 9B E1 77 ^?w?狩
00514450 73 31 E1 77 A5 5B F3 77 s1狩ホ篦
00514458 22 2D E1 77 BC E1 E1 77 "-狩坚狩
00514460 1B AF E2 77 49 65 E1 77 ?wIe狩
00514468 71 26 E1 77 7F 9A E1 77 q&狩?w
00514470 AF 4A E3 77 7F 38 E3 77 ?泖8泖

上下浏览我们根据经验可知iat的rva:5141e0,长度:8b7,快打开imprec,oep填10d514,rva:1141e0,大小:8b7,获取输入表,就有一个无法自动解析,rva:00114a94处,我们到ollydbg中查找JMP DWORD PTR DS:[514a94]可知是:kernel32.FindFirstChangeNotificationA,双击修改之,修复抓取文件。
完工。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 222
活跃值: (100)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
牛人,你真快阿。
二进制查找,是哪个菜单里的?为什么要查找FF75??FF75??FF75??FF55?

我用徒手的方法也跟到了目标,现在有几个问题想问:
1)为何要查找上面的二进制?
2)怎么知道50d514就是OEP?
3)我dump出来的东西,有三个函数没法解析(此问题已解决,我没有在oep用od来dump它)
4)8b7如何求出来的?
2005-2-18 15:54
0
雪    币: 93908
活跃值: (200199)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持下..
2005-2-18 16:19
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
4
Shrinker某些加壳有分段解码
加壳一个大点的程序看看
2005-2-18 16:23
0
雪    币: 215
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
可否传一吓附件呀
2005-2-18 16:26
0
雪    币: 255
活跃值: (207)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
6
下VirtualProtect跟踪几个回合就能到oep了.
我没找到Shrinker3.3,无法进一步分析.
2005-2-18 16:34
0
雪    币: 319
活跃值: (2404)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
7
用区段内存访问断点一下就到了!
2005-2-18 16:37
0
雪    币: 265
活跃值: (430)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
8
最初由 ghost_cracker 发布
牛人,你真快阿。
二进制查找,是哪个菜单里的?为什么要查找FF75??FF75??FF75??FF55?

我用徒手的方法也跟到了目标,现在有几个问题想问:
1)为何要查找上面的二进制?
........


这些也都是我想问的?
2005-2-18 17:12
0
雪    币: 107
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
用这个方法没有脱成功Shrinker 3.2 -> Blink Inc.谁能给我说说
2005-12-16 10:20
0
雪    币: 107
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
最初由 jackily 发布


这些也都是我想问的?


二进制查找你在代码处按右键然后选查看就知道了。
2005-12-16 10:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习一下
2005-12-16 20:16
0
游客
登录 | 注册 方可回帖
返回
//