[原创]Shrinker 3.3 轻松脱壳法
发表于:
2005-2-18 15:46
5463
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:
37aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3c8G2N6$3^5^5i4K6u0W2j5$3&6Q4x3V1k6V1L8%4N6F1i4K6u0W2j5i4y4H3i4K6y4r3K9h3c8Q4x3@1b7I4x3o6b7K6y4g2)9J5y4X3&6G2i4K6y4p5x3R3`.`.
依照上面的方法,我们忽略所有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,双击修改之,修复抓取文件。
完工。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!