Trao đổi với tôi

http://www.buidao.com

7/2/10

[Reverse] (Beta) Unpack Armadillo - Standard protection only

(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 BABEL

run

LABEL:

esto

jmp LABEL

BABEL:

cmp eip, 003C6F63

jne FIN

mov !ZF, 1

run

jmp BABEL

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