史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   多媒體影音轉檔燒錄技術文件 (http://forum.slime.com.tw/f129.html)
-   -   菜鳥也脫殼Armadillo Cop II (http://forum.slime.com.tw/thread187011.html)

psac 2006-09-25 03:40 PM

菜鳥也脫殼Armadillo Cop II
 
菜鳥也脫Armadillo Cop II

【練手軟件下載位址】:http://count.skycn.com/softdownl ... fotobatch_setup.exe
【破 解 人】:BestChao
【除錯環境】:WinXP、OllyICE、LordPE、ImportREC
【作者聲明】:初學Crack,只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教!


一、準備工作

老規矩設置Ollydbg忽略所有異常,用IsDebug 1.4插件去掉Ollydbg的除錯器標誌。

1 偵殼:我用FI 4.01a 查一下 顯示為 Armadillo 4.00 {glue}

2 判斷工作行程:啟動程式。然後在 Windows 任務管理器或LordPE裡檢視是單工作行程的Armadillo還是雙工作行程的。

呵呵 是雙工作行程的,這裡介紹一個工具

ArmadilloFindProtected12 可以檢視 RAM的保護方式



二 、脫殼

1 OD載入

00747C43 > 55 PUSH EBP //停在這裡
00747C44 8BEC MOV EBP,ESP
00747C46 6A FF PUSH -1
00747C48 68 900F7700 PUSH fotobatc.00770F90
00747C4D 68 80797400 PUSH fotobatc.00747980
00747C52 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
00747C58 50 PUSH EAX
00747C59 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
00747C60 83EC 58 SUB ESP,58
00747C63 53 PUSH EBX
00747C64 56 PUSH ESI
00747C65 57 PUSH EDI

下中斷點
BP WaitForDebugEvent

中斷後取消中斷點,看堆疊:

0012DC8C 00737D86 /CALL 到 WaitForDebugEvent 來自 fotobatc.00737D80 // 反彙編視窗跟隨
0012DC90 0012ED7C |pDebugEvent = 0012ED7C //注意這裡
0012DC94 000003E8 \Timeout = 1000. ms
0012DC98 7C930738 ntdll.7C930738

在資料視窗定位到0012ED7C處,準備看OEP值

接著下斷:BP WriteProcessMemory

搜索命令:or eax,0FFFFFFF8

0073830A 83BD CCF5FFFF 0>CMP DWORD PTR SS:[EBP-A34],0
\\下斷,Shift+F9中斷下來 把[ebp-A34]=[0012CD7C]=000001B7清0 ★
0060FE4A 0F8C A8020000 jl 006100F8

00738311 0F8C A8020000 JL fotobatc.007385BF
00738317 8B8D CCF5FFFF MOV ECX,DWORD PTR SS:[EBP-A34] //修正檔1位址
0073831D 3B0D 88247700 CMP ECX,DWORD PTR DS:[772488]
// 修正檔2位址
00738323 0F8D 96020000 JGE fotobatc.007385BF
//解碼結束後跳轉00738323 在00738323 處下斷
00738329 8B95 40F6FFFF MOV EDX,DWORD PTR SS:[EBP-9C0]
0073832F 81E2 FF000000 AND EDX,0FF
00738335 85D2 TEST EDX,EDX
00738337 0F84 AD000000 JE fotobatc.007383EA
0073833D 6A 00 PUSH 0
0073833F 8BB5 CCF5FFFF MOV ESI,DWORD PTR SS:[EBP-A34]
00738345 C1E6 04 SHL ESI,4
00738348 8B85 CCF5FFFF MOV EAX,DWORD PTR SS:[EBP-A34]
0073834E 25 07000080 AND EAX,80000007
00738353 79 05 JNS SHORT fotobatc.0073835A
00738355 48 DEC EAX
00738356 83C8 F8 OR EAX,FFFFFFF8 //搜索找到這裡 ^-^
00738359 40 INC EAX
0073835A 33C9 XOR ECX,ECX
0073835C 8A88 08FE7600 MOV CL,BYTE PTR DS:[EAX+76FE08]
00738362 8B95 CCF5FFFF MOV EDX,DWORD PTR SS:[EBP-A34]
00738368 81E2 07000080 AND EDX,80000007
0073836E 79 05 JNS SHORT fotobatc.00738375
00738370 4A DEC EDX
00738371 83CA F8 OR EDX,FFFFFFF8
00738374 42 INC EDX
00738375 33C0 XOR EAX,EAX
00738377 8A82 09FE7600 MOV AL,BYTE PTR DS:[EDX+76FE09]
0073837D 8B3C8D 98B37600 MOV EDI,DWORD PTR DS:[ECX*4+76B398]
00738384 333C85 98B37600 XOR EDI,DWORD PTR DS:[EAX*4+76B398]
0073838B 8B8D CCF5FFFF MOV ECX,DWORD PTR SS:[EBP-A34]
00738391 81E1 07000080 AND ECX,80000007
00738397 79 05 JNS SHORT fotobatc.0073839E
00738399 49 DEC ECX
0073839A 83C9 F8 OR ECX,FFFFFFF8
0073839D 41 INC ECX
0073839E 33D2 XOR EDX,EDX
007383A0 8A91 0AFE7600 MOV DL,BYTE PTR DS:[ECX+76FE0A]
007383A6 333C95 98B37600 XOR EDI,DWORD PTR DS:[EDX*4+76B398]
007383AD 8B85 CCF5FFFF MOV EAX,DWORD PTR SS:[EBP-A34]
007383B3 99 CDQ
007383B4 B9 1C000000 MOV ECX,1C
007383B9 F7F9 IDIV ECX
007383BB 8BCA MOV ECX,EDX
007383BD D3EF SHR EDI,CL
007383BF 83E7 0F AND EDI,0F
007383C2 03F7 ADD ESI,EDI
007383C4 8B15 6C247700 MOV EDX,DWORD PTR DS:[77246C]
007383CA 8D04B2 LEA EAX,DWORD PTR DS:[EDX+ESI*4]
007383CD 50 PUSH EAX
007383CE 8B8D CCF5FFFF MOV ECX,DWORD PTR SS:[EBP-A34]
007383D4 51 PUSH ECX
007383D5 E8 68210000 CALL fotobatc.0073A542
007383DA 83C4 0C ADD ESP,0C
007383DD 25 FF000000 AND EAX,0FF //在這裡打修正檔
007383E2 85C0 TEST EAX,EAX
007383E4 0F84 D5010000 JE fotobatc.007385BF
007383EA 837D D8 00 CMP DWORD PTR SS:[EBP-28],0
007383EE 75 27 JNZ SHORT fotobatc.00738417


找到第一處在0073830A處,在其上cmp dword ptr ss:[ebp-A34],0處設置中斷點


Patch代碼:


inc dword ptr ss:[ebp-0A34] //修正檔1位址
mov dword ptr ds:[772488+4],1 //修正檔2位址
jmp 0073830A //跳轉清0的位址


看OEP


2AA02C


取消WriteProcessMemory處中斷點,繼續Shift+F9,中斷在007385bf 處
此時子工作行程代碼已經解開,執行LordPE,完全Dump出子工作行程

如何判斷父和子?選擇附加 紅色的 就是父 當然另外一個 就是子咯 :)
二、搞定輸入表


再次載入主程式FotoBatch.EXE
下斷:BP DebugActiveProcess 中斷後看堆疊:
0012DC90 00737BDA /CALL 到 DebugActiveProcess 來自 fotobatc.00737BD4
0012DC94 00000808 \ProcessId = 808 EDC
0012DC98 7C930738 ntdll.7C930738

新開一個OllyDbg,附加工作行程ID DEC的子工作行程
F9,再F12,會暫停在EP處

00747C43 >- EB FE JMP SHORT fotobatc.<ModuleEntryPoint>
//子工作行程在EP處死循環 恢復原來EP處的代碼:55 8B


切換單工作行程。BP OpenMutexA Shift+F9,中斷後看堆疊:

0012F798 007337B8 /CALL 到 OpenMutexA 來自 fotobatc.007337B2
0012F79C 001F0001 |Access = 1F0001
0012F7A0 00000000 |Inheritable = FALSE
0012F7A4 0012FDD8 \MutexName = "808::DACEE4B483" //注意 0012FDD8
0012F7A8 7C935F0B 返回到 ntdll.7C935F0B 來自 ntdll.bsearch

Ctrl+G:401000 鍵入以下分離代碼

00401000 60 PUSHAD
00401001 9C PUSHFD
00401002 68 D8FD1200 PUSH 12FDD8 ; ASCII "808::DACEE4B483"
00401007 33C0 XOR EAX,EAX
00401009 50 PUSH EAX
0040100A 50 PUSH EAX
0040100B E8 2FDB407C CALL kernel32.CreateMutexA
00401010 9D POPFD
00401011 61 POPAD
00401012 - E9 04DC407C JMP kernel32.OpenMutexA


60 9C 68 D8 FD 12 00 33 C0 50 50 E8 2F DB 40 7C 9D 61 E9 04 DC 40 7C


在401000處新增EIP,F9執行,再次中斷在OpenMutexA處。
返回401000處,「撤銷選擇」,清掉寫入的代碼。再取消OpenMutexA中斷點。

下斷:HE GetModuleHandleA Shift+F9,注意看堆疊:

0012EF24 77F45BD8 /CALL 到 GetModuleHandleA 來自 77F45BD2
0012EF28 77F4501C \pModule = "KERNEL32.DLL"
0012EF2C 00000001



0012F73C 007328F3 /CALL 到 GetModuleHandleA 來自 fotobatc.007328ED
0012F740 00000000 \pModule = NULL
0012F744 0012F750


00129528 01087105 /CALL 到 GetModuleHandleA 來自 010870FF
0012952C 0109BC1C \pModule = "kernel32.dll"
00129530 0109CEC4 ASCII "VirtualAlloc"

00129528 01087122 /CALL 到 GetModuleHandleA 來自 0108711C
0012952C 0109BC1C \pModule = "kernel32.dll"
00129530 0109CEB8 ASCII "VirtualFree"

0012928C 01075FC9 /CALL 到 GetModuleHandleA 來自 01075FC3
00129290 001293DC \pModule = "kernel32.dll" //ALT+F9返回


堆疊如上變化時,取消GetModuleHandleA處中斷點,Alt+F9返回

01075FC9 8B0D AC400A01 MOV ECX,DWORD PTR DS:[10A40AC] //返回到這裡
01075FCF 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
01075FD2 A1 AC400A01 MOV EAX,DWORD PTR DS:[10A40AC]
01075FD7 391C06 CMP DWORD PTR DS:[ESI+EAX],EBX
01075FDA 75 16 JNZ SHORT 01075FF2
01075FDC 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C]
01075FE2 50 PUSH EAX
01075FE3 FF15 BC620901 CALL DWORD PTR DS:[10962BC] ; kernel32.LoadLibraryA
01075FE9 8B0D AC400A01 MOV ECX,DWORD PTR DS:[10A40AC]
01075FEF 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
01075FF2 A1 AC400A01 MOV EAX,DWORD PTR DS:[10A40AC]
01075FF7 391C06 CMP DWORD PTR DS:[ESI+EAX],EBX
01075FFA 0F84 2F010000 JE 0107612F //改JE 為JMP 避開IAT加密保護 ^-^
01076000 33C9 XOR ECX,ECX
01076002 8B07 MOV EAX,DWORD PTR DS:[EDI]
01076004 3918 CMP DWORD PTR DS:[EAX],EBX
01076006 74 06 JE SHORT 0107600E
01076008 41 INC ECX
01076009 83C0 0C ADD EAX,0C
0107600C ^ EB F6 JMP SHORT 01076004
0107600E 8BD9 MOV EBX,ECX
01076010 C1E3 02 SHL EBX,2
01076013 53 PUSH EBX
01076014 E8 45F20100 CALL 0109525E ; JMP to msvcrt.??2@YAPAXI@Z
01076019 8B0D A4400A01 MOV ECX,DWORD PTR DS:[10A40A4]
0107601F 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
01076022 53 PUSH EBX
01076023 E8 36F20100 CALL 0109525E ; JMP to msvcrt.??2@YAPAXI@Z

這個東東在處理輸入表的時候還有時間校驗,不處理的話會導致某些函數被加密保護
下斷:BP GetTickCount 中斷後取消中斷點返回


0108C318 8985 A4D4FFFF MOV DWORD PTR SS:[EBP-2B5C],EAX ; fotobatc.008218DE
// 返回到這裡 一片紅色海洋。。
0108C31E 6A 01 PUSH 1
0108C320 58 POP EAX
0108C321 85C0 TEST EAX,EAX
0108C323 0F84 A8030000 JE 0108C6D1
0108C329 8B85 84D9FFFF MOV EAX,DWORD PTR SS:[EBP-267C]
0108C32F 66:8B00 MOV AX,WORD PTR DS:[EAX]
0108C332 66:8985 64C2FFF>MOV WORD PTR SS:[EBP-3D9C],AX
0108C339 8B85 84D9FFFF MOV EAX,DWORD PTR SS:[EBP-267C]
0108C33F 40 INC EAX
0108C340 40 INC EAX
0108C341 8985 84D9FFFF MOV DWORD PTR SS:[EBP-267C],EAX
0108C347 0FB785 64C2FFFF MOVZX EAX,WORD PTR SS:[EBP-3D9C]
0108C34E 50 PUSH EAX
0108C34F FFB5 84D9FFFF PUSH DWORD PTR SS:[EBP-267C]
0108C355 8D85 70CAFFFF LEA EAX,DWORD PTR SS:[EBP-3590]
0108C35B 50 PUSH EAX
0108C35C E8 F78E0000 CALL 01095258 ; JMP to msvcrt.memcpy



下面還有一處GetTickCount取時間

0108C6AD /73 1D JNB SHORT 0108C6CC
0108C6AF |8B85 10D9FFFF MOV EAX,DWORD PTR SS:[EBP-26F0]
0108C6B5 |8B8D 68CAFFFF MOV ECX,DWORD PTR SS:[EBP-3598]
0108C6BB |8908 MOV DWORD PTR DS:[EAX],ECX
0108C6BD |8B85 10D9FFFF MOV EAX,DWORD PTR SS:[EBP-26F0]
0108C6C3 |83C0 04 ADD EAX,4
0108C6C6 |8985 10D9FFFF MOV DWORD PTR SS:[EBP-26F0],EAX
0108C6CC ^\E9 4DFCFFFF JMP 0108C31E
0108C6D1 FF15 7C620901 CALL DWORD PTR DS:[109627C] ; kernel32.GetTickCount
// 找到這個註釋 kernel32.GetTickCount
0108C6D7 2B85 A4D4FFFF SUB EAX,DWORD PTR SS:[EBP-2B5C]
0108C6DD 8B8D A8D4FFFF MOV ECX,DWORD PTR SS:[EBP-2B58]
0108C6E3 6BC9 32 IMUL ECX,ECX,32
0108C6E6 81C1 D0070000 ADD ECX,7D0
0108C6EC 3BC1 CMP EAX,ECX //時間效驗
0108C6EE 76 07 JBE SHORT 0108C6F7 //改JBE為 JMP
0108C6F0 C685 34D9FFFF 0>MOV BYTE PTR SS:[EBP-26CC],1
0108C6F7 83BD E4D7FFFF 0>CMP DWORD PTR SS:[EBP-281C],0
0108C6FE 0F85 8A000000 JNZ 0108C78E //在這裡跟隨 然後在下面一行中斷後輸入表處理完畢
0108C704 0FB685 94D4FFFF MOVZX EAX,BYTE PTR SS:[EBP-2B6C]
0108C70B 85C0 TEST EAX,EAX
0108C70D 74 7F JE SHORT 0108C78E


OEP 2AA02C
RAV 2E7280
大小 940

今天的重點 就是熟悉COMPY2的3個修正檔位置和手動定位RAV和大小


謝謝各位高人看玩小人這篇破文^-^

ps:
黑软基地脱壳全集(共11集)

第一课:http://qzone2006.vip1.4888.net/脱壳全集/unB-pack01.rar
第二课:http://qzone2006.vip1.4888.net/脱壳全集/unB-pack02.rar
第三课:http://qzone2006.vip1.4888.net/脱壳全集/unB-pack03.rar
第四课:http://qzone2006.vip1.4888.net/脱壳全集/unB-pack04.rar
第五课:http://qzone2006.vip1.4888.net/脱壳全集/unB-pack05.rar
第六课:http://qzone2006.vip1.4888.net/脱壳全集/unB-pack06.rar
第七课:http://qzone2006.vip1.4888.net/脱壳全集/unB-pack07.rar
第八课:http://qzone2006.vip1.4888.net/脱壳全集/unB-pack08.rar
第九课:http://qzone2006.vip1.4888.net/脱壳全集/unB-pack09.rar
第十课:http://qzone2006.vip1.4888.net/脱壳全集/unB-pack10.rar
第十一课:http://qzone2006.vip1.4888.net/脱壳全集/unB-pack11.rar


所有時間均為台北時間。現在的時間是 02:17 AM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1