(Beta) Unpack Armadillo - Standard protection only
Author : Benina
Target........: FlashFavorite v1.4.5
Website......: http://www.pipisoft.com/
Protection..: ARMADiLLO + Standard protection only
Difficulty....: For Newbie
Tools Needed:
1.) Olly Debug v1.10 or better
2.) LordPE Deluxe
3.) Import Reconstructor v1.6 Final
Step 1: Find OEP
Load file FashFavorite.exe inOlly, xuất hiện một thông điệp :
Nhấn button “NO”.
Armadillo's Entry Point sẽ là :
0044D000 > 60 PUSHAD
0044D001 E8 00000000 CALL FlashFav.0044D006
0044D006 5D POP EBP
0044D007 50 PUSH EAX
0044D008 51 PUSH ECX
0044D009 0FCA BSWAP EDX
0044D00B F7D2 NOT EDX
0044D00D 9C PUSHFD
0044D00E F7D2 NOT EDX
0044D010 0FCA BSWAP EDX
0044D012 EB 0F JMP SHORT FlashFav.0044D023
0044D014 B9 EB0FB8EB MOV ECX,EBB80FEB
0044D019 07 POP ES ; Modification of segment register
0044D01A B9 EB0F90EB MOV ECX,EB900FEB
0044D01F 08FD OR CH,BH
0044D021 EB 0B JMP SHORT FlashFav.0044D02E
0044D023 F2: PREFIX REPNE: ; Superfluous prefix
0044D024 ^ EB F5 JMP SHORT FlashFav.0044D01B
0044D026 ^ EB F6 JMP SHORT FlashFav.0044D01E
0044D028 F2: PREFIX REPNE: ; Superfluous prefix
0044D029 EB 08 JMP SHORT FlashFav.0044D033
0044D02B FD STD
0044D02C ^ EB E9 JMP SHORT FlashFav.0044D017
0044D02E F3: PREFIX REP: ; Superfluous prefix
0044D02F ^ EB E4 JMP SHORT FlashFav.0044D015
0044D031 FC CLD
0044D032 - E9 9D0FC98B JMP 8C0DDFD4
Trước tiên, trong Olly, chúng ta chọn menu Options/Debugging options như hình dưới đây:
Và chọn các Options of Plugins HideDebugger :
Armadillo sẽ giải nén và giải mã dữ liệu rồi chép vào section .text, sau đó cho thực thi các chỉ thị trong section .text. Section này chứa code của chương trình gốc. Vì vậy OEP sẽ sẽ nằm trong section này. Do đó, chúng ta sẽ set break-on-access trên section này. Mục đích để chương trình truy xuất bất cứ dữ liệu nào trong section này sẽ bị break
Trong Olly, open window [Memory map] (Alt+M), click vào section .text và nhấn F2 để đặt bp như hình:
bây giờ, Press Shift+F9 , và nó sẽ dừng lại tại đây
004154A2 55 PUSH EBP
004154A3 8BEC MOV EBP,ESP
004154A5 6A FF PUSH -1
004154A7 68 38934100 PUSH FlashFav.00419338
004154AC 68 06564100 PUSH FlashFav.00415606 ; JMP to msvcrt._except_handler3
004154B1 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
004154B7 50 PUSH EAX
004154B8 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
004154BF 83EC 68 SUB ESP,68
004154C2 53 PUSH EBX
004154C3 56 PUSH ESI
004154C4 57 PUSH EDI
004154C5 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP
004154C8 33DB XOR EBX,EBX
004154CA 895D FC MOV DWORD PTR SS:[EBP-4],EBX
004154CD 6A 02 PUSH 2
004154CF FF15 50754100 CALL DWORD PTR DS:[417550] ; msvcrt.__set_app_type
Trong thanh state chúng ta thấy “Break-on-access when executing [004154A2]” , đồng thời section .text có thông tin như sau:
Address=00401000
Size=00016000 (90112.)
Ta thấy address 004154A2 nằm trong section .text. Vì vậy
Address [004154A2] chính là OEP của chương trình
Step 2: Tìm một địa chí bất kỳ của hàm API của chương trình gốc đã giải nén vào section .text, sau đó set bp tại địa chỉ này:
Armadillo trộn lẫn IAT của chương trình gốc. Vì vậy, chúng ta sẽ tìm 1 địa chỉ của 1 hàm API bất kỳ trong bảng IAT của chương trình gốc để set bp Hardware, on write tại address đó. Mục đích của chúng ta là : khi Armadillo write các bytes vào bảng IAT (mà cụ thể là viết vào địa chỉ chúng ta đã set bp), thì Olly sẽ dừng lại để chúng ta tìm đọan code mà Olly trộn lẫn bảng IAT.
Chúng ta thấy trong window CPU of Olly tại addr 004154CF như sau:
004154CF FF15 50754100 CALL DWORD PTR DS:[417550] ; msvcrt.__set_app_type
Vì vậy address [417550] là 1 addr nằm trong bảng IAT của chương trình gốc.
Bây giờ chúng ta sẽ dump nó trong window dump of Olly.Click phải chuột trên 004154CF, Chọn Folow in dump/Memory address như hình.
Trong window dump of Olly,chúng ta click chọn 4 bytes tại 00417550 và set breakpiont Hardware, on write / Dword tại địa chỉ address 00417550 như hình sau:
Bây giờ chúng ta đóng Olly lại
Step 3: Tìm đọan code trộn lẫn IAT của Armadillo.
Load file FashFavorite.exe inOlly một lần nữa . RUN bằng Shift+F9. Dừng lại tại breakpoint mà chúng ta đã set set breakpiont Hardware, on write / Dword. Chúng ta sẽ thấy như hình sau:
77C42F43 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
77C42F45 FF2495 5830C477 JMP DWORD PTR DS:[EDX*4+77C43058]
77C42F4C 8BC7 MOV EAX,EDI
77C42F4E BA 03000000 MOV EDX,3
77C42F53 83E9 04 SUB ECX,4
77C42F56 72 0C JB SHORT msvcrt.77C42F64
77C42F58 83E0 03 AND EAX,3
77C42F5B 03C8 ADD ECX,EAX
77C42F5D FF2485 702FC477 JMP DWORD PTR DS:[EAX*4+77C42F70]
77C42F64 FF248D 6830C477 JMP DWORD PTR DS:[ECX*4+77C43068]
77C42F6B 90 NOP
77C42F6C FF248D EC2FC477 JMP DWORD PTR DS:[ECX*4+77C42FEC]
77C42F73 90 NOP
77C42F74 802F C4 SUB BYTE PTR DS:[EDI],0C4
77C42F77 ^ 77 AC JA SHORT msvcrt.77C42F25
Trong window dump, chúng ta goto đến address 00417550 mà chúng ta đã set breakpoint ở bước 2.
Click vào window dump, Ctrl+G, gõ địa chỉ vào “00417550” như hình dưới đây :
Press OK.
Trong window dump ta thấy:
00417550 46 BC 01 00 38 BC 01 00 F¼.8¼.
00417558 28 BC 01 00 18 BC 01 00 (¼.¼.
00417560 00 00 00 00 00 00 00 00 ........
00417568 00 00 00 00 00 00 00 00 ........
Vì giá trị tại 00417550 ko phải là 1 địa chỉ của hàm API ( giá trị của nó =0001BC46 , thường các địa chỉ hàm API như dạng sau 77xxxxxx), Do đó chúng ta press F9 để run tiếp tục .Nó dừng lại tại chỉ thị sau :
003C70B3 8B85 04C8FFFF MOV EAX,DWORD PTR SS:[EBP-37FC] ; FlashFav.00417550
003C70B9 83C0 04 ADD EAX,4
003C70BC 8985 04C8FFFF MOV DWORD PTR SS:[EBP-37FC],EAX
003C70C2 ^ E9 CEFCFFFF JMP 003C6D95
003C70C7 FF15 9C023D00 CALL DWORD PTR DS:[3D029C] ; kernel32.GetTickCount
Nhìn vào window dump chúng ta thấy:
00417550 32 36 C3 77 38 BC 01 00 26Ãw8¼.
00417558 28 BC 01 00 18 BC 01 00 (¼.¼.
00417560 04 BC 01 00 F8 BB 01 00
¼.ø».
Giá trị [77C33632] tại address 00417550 chính là địa chỉ của 1 hàm API . Vì vậy, Vùng code này là vùng code mà Armadillo sau khi đã trộn lẫn chép vào IAT của chương trình gốc, đây là vùng code chúng ta cần tìm:
003C70B3 8B85 04C8FFFF MOV EAX,DWORD PTR SS:[EBP-37FC] ; FlashFav.00417550
003C70B9 83C0 04 ADD EAX,4
003C70BC 8985 04C8FFFF MOV DWORD PTR SS:[EBP-37FC],EAX
003C70C2 ^ E9 CEFCFFFF JMP 003C6D95
003C70C7 FF15 9C023D00 CALL DWORD PTR DS:[3D029C] ; kernel32.GetTickCount
hai dòng đánh dấu màu vàng dùng để nhận diện đọan code này
Tại direction 003C70B3 , Armadillo viết giá trị của hàm API vào IAT. Do đó, vùng code “phá rối, trộn lẫn” IAT sẽ nằm ở trên direction này.Trong window CPU of Olly, dò lên trên một chút, chúng ta sẽ thấy vùng code như dưới đây:
003C6F30 FF15 5C033D00 CALL DWORD PTR DS:[3D035C] ; msvcrt._stricmp
003C6F36 59 POP ECX
003C6F37 59 POP ECX
003C6F38 85C0 TEST EAX,EAX
003C6F3A 75 11 JNZ SHORT 003C6F4D
003C6F3C 8B85 4CC2FFFF MOV EAX,DWORD PTR SS:[EBP-3DB4]
003C6F42 8B40 08 MOV EAX,DWORD PTR DS:[EAX+8]
003C6F45 8985 58C2FFFF MOV DWORD PTR SS:[EBP-3DA8],EAX
003C6F4B EB 02 JMP SHORT 003C6F4F
003C6F4D ^ EB 9D JMP SHORT 003C6EEC
003C6F4F 8B85 98C4FFFF MOV EAX,DWORD PTR SS:[EBP-3B68]
003C6F55 40 INC EAX
003C6F56 8985 98C4FFFF MOV DWORD PTR SS:[EBP-3B68],EAX
003C6F5C 83BD 58C2FFFF 0>CMP DWORD PTR SS:[EBP-3DA8],0
003C6F63 75 42 JNZ SHORT 003C6FA7
003C6F65 0FB785 5CC2FFFF MOVZX EAX,WORD PTR SS:[EBP-3DA4]
003C6F6C 85C0 TEST EAX,EAX
003C6F6E 74 0F JE SHORT 003C6F7F
003C6F70 0FB785 5CC2FFFF MOVZX EAX,WORD PTR SS:[EBP-3DA4]
003C6F77 8985 5CADFFFF MOV DWORD PTR SS:[EBP+FFFFAD5C],EAX
003C6F7D EB 0C JMP SHORT 003C6F8B
003C6F7F 8B85 54C2FFFF MOV EAX,DWORD PTR SS:[EBP-3DAC]
003C6F85 8985 5CADFFFF MOV DWORD PTR SS:[EBP+FFFFAD5C],EAX
003C6F8B 6A 01 PUSH 1
003C6F8D FFB5 5CADFFFF PUSH DWORD PTR SS:[EBP+FFFFAD5C]
003C6F93 FFB5 90C4FFFF PUSH DWORD PTR SS:[EBP-3B70]
003C6F99 E8 6E31FEFF CALL 003AA10C
003C6F9E 83C4 0C ADD ESP,0C
003C6FA1 8985 58C2FFFF MOV DWORD PTR SS:[EBP-3DA8],EAX
003C6FA7 83BD 58C2FFFF 0>CMP DWORD PTR SS:[EBP-3DA8],0
003C6FAE 75 42 JNZ SHORT 003C6FF2
003C6FB0 0FB785 5CC2FFFF MOVZX EAX,WORD PTR SS:[EBP-3DA4]
003C6FB7 85C0 TEST EAX,EAX
003C6FB9 74 0F JE SHORT 003C6FCA
003C6FBB 0FB785 5CC2FFFF MOVZX EAX,WORD PTR SS:[EBP-3DA4]
003C6FC2 8985 58ADFFFF MOV DWORD PTR SS:[EBP+FFFFAD58],EAX
003C6FC8 EB 0C JMP SHORT 003C6FD6
003C6FCA 8B85 54C2FFFF MOV EAX,DWORD PTR SS:[EBP-3DAC]
003C6FD0 8985 58ADFFFF MOV DWORD PTR SS:[EBP+FFFFAD58],EAX
003C6FD6 6A 00 PUSH 0
003C6FD8 FFB5 58ADFFFF PUSH DWORD PTR SS:[EBP+FFFFAD58]
003C6FDE FFB5 90C4FFFF PUSH DWORD PTR SS:[EBP-3B70]
003C6FE4 E8 2331FEFF CALL 003AA10C
003C6FE9 83C4 0C ADD ESP,0C
003C6FEC 8985 58C2FFFF MOV DWORD PTR SS:[EBP-3DA8],EAX
003C6FF2 83BD 58C2FFFF 0>CMP DWORD PTR SS:[EBP-3DA8],0
003C6FF9 0F85 98000000 JNZ 003C7097
003C6FFF 0FB785 5CC2FFFF MOVZX EAX,WORD PTR SS:[EBP-3DA4]
003C7006 85C0 TEST EAX,EAX
003C7008 74 54 JE SHORT 003C705E
003C700A FF15 E4003D00 CALL DWORD PTR DS:[3D00E4] ; ntdll.RtlGetLastWin32Error
Những dòng tui đánh dấu màu đỏ, dùng để nhận diện vùng code này
Tại direction 003C6F63 (mà 1 số tut Tây Ban Nha gọi là một trong 1 cặp lệnh nhảy Magical Jump) chính là direction quyết định có trộn hàm API hay chép nguyên xi địa chỉ của hàm vào IAT. Nếu tại đây, cờ flag Zero = 1, thì ko “trộn lẫn”chép nguyên addr của hàm API vào IAT, còn nếu FZ=0 thì sẽ “phá rối”
Trước khi đi tiếp , chúng ta hảy clear bp mà chúng ta đã set ở bước 2
Chọn menu Debug/Hardware breakpoints :
Xuất hiện :
Nhấn button “Delete 1” để xóa bp đã set, và nhấn OK
Chúng ta hảy set breakpiont Hardware, on execute tại address 003C6F63:
Click phải chuột trên direction 003C6F63 và thực hiện như hình sau:
Bây giờ chúng ta hảy đóng Olly lại.
Step 4: Chạy 1 script để sửa chửa IAT :
Load file FashFavorite.exe inOlly một lần nữa. RUN by Shift+F9. Chúng ta sẽ dừng lại tại breakpiont đã set bp Hardware,on execute ở bước 3.
Trước khi run ollyscript,chúng ta hảy set breakpoint Hardware, on execute tại địa chỉ OEP (004154A2 )mà chúng ta đã tìm ở bước 1. Mục đích là khi Olly chạy xong script sẽ dừng lại tại đây. Trong window dump, chúng ta goto đến addr 004154A2. Chọn 4 bytes, và click phải chuột vào bytes đã chọn. Set bp như hình sau:
Chú ý : Trước khi thực thi ollyscript
Nếu ZF = 0 chúng ta hảy set nó bằng 1 (set ZF=1). Vì nếu ko ollsript sẽ chạy bỏ mất 1 hàm. Chúng ta làm như sau, click vào flag Zero, click phải, chọn “Set” như hình
Ollyscript dùng để sửa chửa IAT là file IATscript.osc như sau :
IATscript.osc
dbh
eoe LABEL
eob
run
LABEL:
esto
jmp LABEL
cmp eip, 003C6F63
jne FIN
mov !ZF, 1
run
jmp
FIN:
ret
Address 003C6F63 trong script là addr mà chúng ta tìm ở bước 3 (addr này tùy theo máy tính của bạn)
Now, Chúng ta thực thi IATscript.osc và sau đó nó sẽ dừng tại OEP mà chúng ta đã set bp :
Step 5: Dump :
Chúng ta sẽ dump full tiến trình process fashfavorite.exe bằng LordPE thành file dumped.exe
Step 6: Fix IAT :
Open ImpRec, Chọn proccess là flashfavarite.exe.
Set OEP = 154A2 như hình
Press button “Get Imports” và sau đó press button “Show Invalid” chúng ta sẽ có như hình sau ( chú ý ko nhấn IAT AutoSearch)
Right click vào các Fthunk ko nhận diện được ( màu xanh như hình trên), Chọn Advanced Commands / Get API Calls
Xuất hiện:
Press “OK”
After, press button “Show Invalid” again, and “Cut thunks”
Chúng ta sẽ thấy như sau:
Press button “Fix Dump” để fix IAT file dumped.exe.
Run file dumped_.exe ko bị scrash.
Benina 15/5/2005