IDA – Bây giờ hoặc không bao giờ.

 

Hello bà con, nhân dịp HVA format lại box Cracking và các chiến hữu REA sắp thôi nôi. Tui ðã lâu không có ðóng góp gì cho anh em nên làm cái tut này ðể tặng anh em. Cái tut này tui down lâu rồi của Ricardo Narvaja hýớng dẫn cõ bản về IDA. Uống nýớc nhớ nguồn, ngày xýa tui chỉ quen dùng các công cụ Wdasm 8.93 và SI 4.0.5. Lúc ðó tui có nghe nói ðến IDA nhýng không thích dùng với lại máy tui yếu ðợi IDA load xong khoảng 5’ với một target 1MB. Tui xài IDA là do anh Còm share, lúc ðó IDA ðýợc release bên TTDOWN bởi TEAM SSG. Anh Còm phải hì hục down xong cut ra từng file nhỏ ðể tui down. Nhờ ðó tui mới có IDA mà xài. Anyway thanx Còm nhiều. Hiện tai một cracker sừng sỏ ở VN làm việc nhiều nhất với IDA là anh TQN. Tui không dám nhận mình là một cracker, chỉ xin là ngýời dẫn lối ðýa ðýờng cho các bạn ðam mê ðến với Cracking. Mạn phép xin các bro cho tui ðýợc múa búa trýớc cửa Lỗ Bang, giảng về XXX trýớc lão Z và lão Hoàng…

 

I.                   IDA là gì?

 

The IDA Pro Disassembler and Debugger is an interactive, programmable, extendible, muti-processor disassembler hosted on the Windows platform.Universally acclaimed as the best disassembler money can buy, IDA Pro has become the de-facto standard for the analysis of hostile code and is quickly establishing itself as a major tool in the field of vulnerability research.

 

Link download: http://www.datarescue.com/idabase/

 

Hiện nay tui ðang xài bản DataRescue.IDA.Pro.v4.8.0.847.Advanced.with.Flair.and.SDK với các sig và plugin có dung lýợng khoảng 100MB. Bản Full này có thể down tại FTP của Exetools Forum.

 

 

II.                Công cụ và target dùng trong tuts này:

 

- IDA 4.8.0.847,

- Wdasm 8.93 with the final patch,

- OllyDBG 1.10 Final.

- MapConV 1.4

- Crackme#2 by CoSH.

- Advanced Tracks Eraser 3.0

 

III.             Let’s Go!

 

 

Có lẽ các bạn cho rằng tui bày vẽ chi, ðang xài Olly và Wdasm ngon õ, tý dýng chuyển sang xài IDA. Ðúng, nhýng hầu hết các lập trình viên và pro and super pro cracker thì IDA là hành trang không thể thiếu với họ, WDASM không là cái ðinh gỉ gì cả.

 

Các bác load cái target lên bằng OllyDBG và Wdasm cái ðã. Click vào phần import trong Wdasm và Search Names in All Modules trong Olly:

 

 

Dòm vậy có trời mới biết nó import cái hàm nào trong thý viện MFC. Bây giờ load lên bằng IDA. Chọn Options nhý thế này:

 

 

Wow, giao diện của IDA dòm choáng thiệt! Quá trời tuỳ chọn, quá trời menu. Bít ðýờng nào mà mò. Ấy ấy ðừng nản, nếu sợ ãn bạt tai thì chẳng bao giờ có bạn gái cả. IDA cũng thế, từ từ mà tiến.

 

 

Bây giờ bạn click vào tab Names.

 

 

      Ðể so sánh ta lấy một thí dụ là hàm DoMessagebox ðýợc hiển thị trong IDA và trong Olly nó hiển thị ra sao:

 

 

IDA:

 

__imp_?DoMessageBox@CWinApp@@UAEHPBDII@Z 00402010

 

OllyDBG:

 

All names, item 4

Address=00402010 target

Section=.rdata

Type=Import

Name=MFC42.#2512

 

Trong Olly bạn quay trở lại màn hình CPU, Ctrl+G ðến ðịa chỉ 402010:

 

 

Trong IDA cũng thế, double click vào dòng __imp_?DoMessageBox@CWinApp@@UAEHPBDII@Z 00402010, bạn sẽ ở ðây:

 

 

Rõ ràng ở IDA ta thấy các function rất trực quan, các hàm ðýợc import từ thý viện nào, trong khi ðó ở Olly và Wdasm thì bó tay :d.

 

Bây giờ bạn chuyển qua tab Strings của IDA.

 

 

Xem toàn bộ tabs strings:

 

.rsrc:004045AE  00000006 unicode xb                                      

.rdata:004028BE 00000005 C       exit                                    

.rdata:00402A1C 00000009 C       _setmbcp                                

.rdata:00402892 00000008 C       _onexit                                 

.rdata:004028E0 0000000A C       _initterm                               

.rdata:004028A8 00000006 C       _exit                                   

.rdata:00402940 00000011 C       _except_handler3                         

.rdata:00402954 0000000B C       _controlfp                              

.rdata:00402900 0000000D C       _adjust_fdiv                            

.rdata:004028C6 00000008 C       _acmdln                                 

.rdata:004028EC 00000011 C       __setusermatherr                        

.rdata:0040292E 0000000F C       __set_app_type                          

.rdata:00402920 0000000B C       __p__fmode                              

.rdata:00402910 0000000D C       __p__commode                             

.rdata:004028D0 0000000E C       __getmainargs                           

.rdata:00402884 0000000C C       __dllonexit                             

.rdata:00402870 00000012 C       __CxxFrameHandler                       

.rdata:004028B0 0000000C C       _XcptFilter                             

.rsrc:00404654  00000006 unicode \a\a+                                   

.rsrc:004046C8  00000006 unicode \aM2                                    

.rsrc:004046A8  00000006 unicode \a6b                                     

.rsrc:0040467C  00000006 unicode \a*+                                    

.data:00403020  0000000B C       YOU DID IT                              

.data:0040302C  0000000B C       Well done,                               

.rsrc:004049A6  00000018 unicode VarFileInfo                             

.rsrc:004046EE  00000020 unicode VS_VERSION_INFO                         

.rdata:00402A0E 0000000B C       USER32.dll                              

.rsrc:004049C6  00000018 unicode Translation                             

.rsrc:0040474A  0000001E unicode StringFileInfo                          

.rsrc:0040468C  0000000E unicode Serial                                  

.rdata:004029A2 0000000D C       SendMessageA                             

.rsrc:0040461C  0000000A unicode QUIT                                    

.rsrc:0040496A  0000001E unicode ProductVersion                          

.rsrc:00404922  00000018 unicode ProductName                             

.rdata:004029EE 00000010 C       PostQuitMessage                         

.rsrc:004048DE  00000022 unicode OriginalFilename                        

.data:00403038  00000029 C       One of the Details you entered was wrong

.rsrc:00404664  0000000A unicode Name                                     

.rdata:0040289A 0000000B C       MSVCRT.dll                              

.rsrc:004045E2  0000001C unicode MS Sans Serif                           

.rdata:00402864 0000000A C       MFC42.DLL                               

.rsrc:004047C8  0000002E unicode MFC-Anwendung Crackme2                  

.rdata:00402996 0000000A C       LoadIconA                               

.rsrc:004048B6  00000020 unicode LegalTrademarks                         

.rsrc:0040486A  0000001E unicode LegalCopyright                          

.rdata:00402986 0000000D C       KERNEL32.dll                            

.rdata:004029E2 00000009 C       IsIconic                                

.rsrc:00404836  0000001A unicode InternalName                             

.rdata:004029CE 00000011 C       GetSystemMetrics                        

.rdata:00402976 00000010 C       GetStartupInfoA                         

.rdata:00402962 00000011 C       GetModuleHandleA                        

.rdata:004029BE 0000000E C       GetClientRect                           

.rsrc:004047FE  00000018 unicode FileVersion                             

.rsrc:004047A6  00000020 unicode FileDescription                         

.rdata:00402A00 0000000D C       EnableWindow                             

.data:00403064  00000006 C       ERROR                                   

.rdata:004029B2 00000009 C       DrawIcon                                

.rsrc:00404900  0000001A unicode Crackme2.EXE                            

.rsrc:004045B6  00000026 unicode Crackme2 - By CoSH                      

.rsrc:00404850  00000012 unicode Crackme2                                

.rsrc:00404888  00000026 unicode Copyright (C) 1999                      

.rsrc:00404786  00000018 unicode CompanyName                             

.rsrc:004046D8  0000000C unicode CHECK                                   

.rsrc:0040493C  00000026 unicode Anwendung Crackme2                      

.rdata:00402306 00000006 unicode @7                                       

.rsrc:0040460C  00000006 unicode ?M2                                     

.rsrc:004044F0  00000006 unicode 3\v                                     

.rsrc:004044E8  00000006 unicode 3\v                                     

.rsrc:004044B9  00000005 C       3330                                    

.rsrc:00404818  00000016 unicode 1, 0, 0, 1                              

.rsrc:00404988  00000016 unicode 1, 0, 0, 1                              

.rsrc:0040476E  00000012 unicode 040704B0                                 

 

 

Trong khi ðó tab strings của Olly và Wdasm:

 

 

 

Bạn ðã nể khả nãng disasm của IDA chýa. Tui cracking thýờng thýờng ðều dùng ðến tính nãng này của IDA ðể tìm. Chỉ cần nhấn Alt+T gõ vào dòng chữ muốn tìm. Ðể dòng string thể hiện rõ ràng nhất, tôi khuyên bạn nên setup các options cho tab Strings của IDA theo hình sau:

 

 

Khi sử dụng IDA có 4 cửa sổ ta cần quan tâm. Thứ nhất là IDA View-A, ðây là cửa sổ chính nhý CPU trong Olly. Mọi thao tác về ðọc code hay xử lý code ðều nằm trên ðây. Thứ hai là HexView týõng tự memory dump window của Olly. Kế ðến là bảng Names và cuối cùng là bảng Strings nhý ta ðã xem qua ở trên. Ở ver 4.8 này có thêm hai bảng ExportImport.

 

Xem một ví dụ về khả nãng tìm hàm của IDA và OllyDBG, quả là rất có lợi cho việc xác ðịnh IAT trong quá trình fix mà ko cần ctrl+R trong OllyDBG ðể xác ðịnh tên hàm.

 

_IDA:

 

.text:00401628                 jmp     ds:__imp_?DoMessageBox@CWinApp@@UAEHPBDII@Z ; __declspec(dllimport) CWinApp::DoMessageBox(char const *,uint,uint)

 

 

_OllyDBG:

 

00401628   .- FF25 10204000 JMP DWORD PTR DS:[<&MFC42.#2512>]        ;  MFC42.#2512

 

 

IV. Vẫn là OllyDBG yêu dấu!

 

Bảo ðảm ðọc tới ðây, thế nào các bạn cũng có ngýời ngẫm nghĩ : “Lỡ yêu Olly rồi, kô bỏ ðýợc, phải chi kết hợp ðýợc thì hay”. Oh, ðýợc chứ! Tui sẽ chỉ cho bạn một cách ðể Olly có thể ðọc ðýợc string ðã disasm từ IDA.

 

Ðể làm ðýợc ðiều này bạn phải có một plugin Olly là MapConv 1.4 download từ http://ollydbg.win32asmcommunity.net/stuph/

 

File

Name/Description

Source

Author(s)

Release date

MapConv_14.zip

MapConv 1.4
imports .map files from SoftiCE or IDA
Update: address of the code section is now read dynamically

BCB 6.0

godfather+
TBD

SHaG

10.Jun.2003

 

 

Nếu bạn ðã có thì chúng ta bắt ðầu. Mở lại IDA, load target.exe lên, vào Menu File->Produce->Create Map File…

 

 

Chọn options nhý sau:

 

 

Save với tên target.map. Load target.exe lên OllyDBG. Vào menu Plugin chon MapConv, chọn Replace Label, browse ðến target.map…

 

 

 

Lần lýợt chạy plugin này hai lần ðể load toàn bộ label và comments:

 

 

 

 

Yeah, bây giờ vào, R-click Search Names in All Modules. Xem thử cái:

 

 

Wow, coi thêm một cái cho ðã:

 

 

He he, ýng cái bụng rồi hẻ :d. Phần lý thuyết tới ðây tui xin mạn phép kết thúc. IDA còn rất nhiều ðiều ðể khám phá. Bạn hãy tự mình tìm một cách riêng ðể khám phá xem, nếu lýời thì chờ tuts của tui sau này ;;).

 

IV.              Thực hành với Advanced Tracks Eraser 3.0 – Remove time trial.

 

Soft này code bằng Delphi7. Sig by TQN. Thanx anh vì một sig rất tốt cho app written by Delphi.

 

Chỉnh giờ hệ thống cho soft expired, set back lại dĩ nhiên báo lỗi!

 

 

Load với IDA.

 

 

Qua tab Strings, gõ alt+T nhập vào dòng Days Left:

 

 

Double vào dòng Days Left ta tới IDA View-A:

 

 

Ðể con trỏ chuột tại  DATA XREF: sub_48B868+3Eo bạn sẽ thấy ðoạn text này thuộc về ðoạn code:

 

 

Double click vào dòng DATA XREF: sub_48B868+3Eo ta sẽ ở ðây:

 

 

 

CODE:0048B868 ;

 ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦

CODE:0048B868

CODE:0048B868 ; Attributes: bp-based frame

CODE:0048B868

CODE:0048B868 sub_48B868      proc near               ; DATA XREF: CODE:0048B5E5o

CODE:0048B868

CODE:0048B868 var_C           = dword ptr -0Ch

CODE:0048B868 var_8           = dword ptr -8

CODE:0048B868 var_4           = dword ptr -4

CODE:0048B868

CODE:0048B868                 push    ebp

CODE:0048B869                 mov     ebp, esp

CODE:0048B86B                 push    0

CODE:0048B86D                 push    0

CODE:0048B86F                 push    0

CODE:0048B871                 push    ebx

CODE:0048B872                 push    esi

CODE:0048B873                 mov     ebx, eax

CODE:0048B875                 xor     eax, eax

CODE:0048B877                 push    ebp

CODE:0048B878                 push    offset loc_48B928

CODE:0048B87D                 push    dword ptr fs:[eax]

CODE:0048B880                 mov     fs:[eax], esp

CODE:0048B883                 push    offset _str_Advanced_Tracks_1.Text

CODE:0048B888                 mov     eax, 0Fh

CODE:0048B88D                 call    sub_48AFD4

CODE:0048B892                 push    eax

CODE:0048B893                 mov     eax, 0Fh

CODE:0048B898                 pop     edx

CODE:0048B899                 sub     eax, edx

CODE:0048B89B                 lea     edx, [ebp+var_8]

CODE:0048B89E                 call    sub_474DFC

CODE:0048B8A3                 push    [ebp+var_8]

CODE:0048B8A6                 push    offset _str__Days_Left_.Text

CODE:0048B8AB                 lea     eax, [ebp+var_4]

CODE:0048B8AE                 mov     edx, 3

CODE:0048B8B3                 call    sub_404474

CODE:0048B8B8                 mov     edx, [ebp+var_4]

CODE:0048B8BB                 mov     eax, ebx

CODE:0048B8BD                 call    @Controls@TControl@SetText$qqrx17System@AnsiString

CODE:0048B8C2                 lea     eax, [ebp+var_C]

CODE:0048B8C5                 call    sub_475338

CODE:0048B8CA                 lea     eax, [ebp+var_C]

CODE:0048B8CD                 mov     edx, offset _str_System32_mssqlc.Text

CODE:0048B8D2                 call    @System@@LStrCat$qqrv

CODE:0048B8D7                 mov     eax, [ebp+var_C]

CODE:0048B8DA                 call    sub_48B7D0

CODE:0048B8DF                 cmp     al, 1

CODE:0048B8E1                 jnz     short loc_48B8F2

CODE:0048B8E3                 xor     edx, edx

CODE:0048B8E5                 mov     eax, [ebx+314h]

CODE:0048B8EB                 mov     ecx, [eax]

CODE:0048B8ED                 call    dword ptr [ecx+64h]

CODE:0048B8F0                 jmp     short loc_48B90D

 

Ok, patch thành EB. Time trial removed.

 

Ðể dừng bộ ðếm nút Try Now! Tiếp tục tìm kiếm chuỗi Try Now. Ta ðến ðây:

 

 

Týõng tự ta double click vào CODE:0048B784 _str__Try_Now__ dd 0FFFFFFFFh           ; _top ; DATA XREF: sub_48B6D4+18o:

 

CODE:0048B6D4 ;

¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦

CODE:0048B6D4

CODE:0048B6D4 ; Attributes: bp-based frame

CODE:0048B6D4

CODE:0048B6D4 sub_48B6D4      proc near               ; DATA XREF: CODE:0048B5C0o

CODE:0048B6D4

CODE:0048B6D4 var_8           = dword ptr -8

CODE:0048B6D4 var_4           = dword ptr -4

CODE:0048B6D4

CODE:0048B6D4                 push    ebp

CODE:0048B6D5                 mov     ebp, esp

CODE:0048B6D7                 push    0

CODE:0048B6D9                 push    0

CODE:0048B6DB                 push    ebx

CODE:0048B6DC                 mov     ebx, eax

CODE:0048B6DE                 xor     eax, eax

CODE:0048B6E0                 push    ebp

CODE:0048B6E1                 push    offset loc_48B775

CODE:0048B6E6                 push    dword ptr fs:[eax]

CODE:0048B6E9                 mov     fs:[eax], esp

CODE:0048B6EC                 push    offset _str__Try_Now__.Text

CODE:0048B6F1                 lea     edx, [ebp+var_8]

CODE:0048B6F4                 mov     eax, ds:dword_4941D0

CODE:0048B6F9                 call    sub_4084B8

CODE:0048B6FE                 push    [ebp+var_8]

CODE:0048B701                 push    offset _str__.Text

CODE:0048B706                 lea     eax, [ebp+var_4]

CODE:0048B709                 mov     edx, 3

CODE:0048B70E                 call    sub_404474

CODE:0048B713                 mov     edx, [ebp+var_4]

CODE:0048B716                 mov     eax, [ebx+314h]

CODE:0048B71C                 call    @Controls@TControl@SetText$qqrx17System@AnsiString

CODE:0048B721                 dec     ds:dword_4941D0

CODE:0048B727                 cmp     ds:dword_4941D0, 0FFFFFFFFh

CODE:0048B72E                 jnz     short loc_48B75A

CODE:0048B730                 mov     edx, offset _str__Try_Now.Text

CODE:0048B735                 mov     eax, [ebx+314h]

CODE:0048B73B                 call    @Controls@TControl@SetText$qqrx17System@AnsiString

CODE:0048B740                 mov     dl, 1

CODE:0048B742                 mov     eax, [ebx+314h]

CODE:0048B748                 mov     ecx, [eax]

CODE:0048B74A                 call    dword ptr [ecx+64h]

CODE:0048B74D                 xor     edx, edx

CODE:0048B74F                 mov     eax, [ebx+320h]

CODE:0048B755                 call    unknown_libname_166 ; Borland Visual Component Library & Packages

CODE:0048B75A

CODE:0048B75A loc_48B75A:                             ; CODE XREF: sub_48B6D4+5Aj

CODE:0048B75A                 xor     eax, eax

CODE:0048B75C                 pop     edx

CODE:0048B75D                 pop     ecx

CODE:0048B75E                 pop     ecx

CODE:0048B75F                 mov     fs:[eax], edx

CODE:0048B762                 push    offset loc_48B77C

CODE:0048B767

CODE:0048B767 loc_48B767:                             ; CODE XREF: sub_48B6D4+A6j

CODE:0048B767                 lea     eax, [ebp+var_8]

CODE:0048B76A                 mov     edx, 2

CODE:0048B76F                 call    @System@@LStrArrayClr$qqrv

CODE:0048B774                 retn

CODE:0048B775 ; ---------------------------------------------------------------------------

CODE:0048B775

CODE:0048B775 loc_48B775:                             ; DATA XREF: sub_48B6D4+Do

CODE:0048B775                 jmp     @System@@HandleFinally$qqrv

CODE:0048B77A ; ---------------------------------------------------------------------------

CODE:0048B77A                 jmp     short loc_48B767

CODE:0048B77C ; ---------------------------------------------------------------------------

CODE:0048B77C

CODE:0048B77C loc_48B77C:                             ; DATA XREF: sub_48B6D4+8Eo

CODE:0048B77C                 pop     ebx

CODE:0048B77D                 pop     ecx

CODE:0048B77E                 pop     ecx

CODE:0048B77F                 pop     ebp

CODE:0048B780                 retn

CODE:0048B780 sub_48B6D4      endp ; sp = -0Ch

CODE:0048B780

CODE:0048B780 ; ---------------------------------------------------------------------------

CODE:0048B781                 align 4

CODE:0048B784 _str__Try_Now__ dd 0FFFFFFFFh           ; _top ; DATA XREF: sub_48B6D4+18o

CODE:0048B784                 dd 10                   ; Len

CODE:0048B784                 db '&Try Now [',0       ; Text

CODE:0048B797                 align 4

CODE:0048B798 _str__          dd 0FFFFFFFFh           ; _top ; DATA XREF: sub_48B6D4+2Do

CODE:0048B798                 dd 1                    ; Len

CODE:0048B798                 db ']',0                ; Text

CODE:0048B7A2                 align 4

CODE:0048B7A4 _str__Try_Now   dd 0FFFFFFFFh           ; _top ; DATA XREF: sub_48B6D4+5Co

CODE:0048B7A4                 dd 8                    ; Len

CODE:0048B7A4                 db '&Try Now',0         ; Text

CODE:0048B7B5                 align 4

CODE:0048B7B8

 

Nop CODE:0048B72E                 jnz     short loc_48B75A thành 9090. Ok, Remove the Counter.

 

 

         

 

Trên ðây là một thí dụ nhỏ về cracking bằng IDA. Hy vọng qua tut này các bạn sẽ thích IDA. Một công cụ trên cả tuyệt vời. The End…

 

PS: Các nhóm crackers trên thế giới tôi không biết họ thýờng dùng gì ðể disasm nhýng các nhóm crackers của Pháp ðều dùng IDA ðể rip code và keygen. Và công cụ họ dùng là TMG Ripper Studio v 1.x.x.

 

GrEeTs Fly Out: Deux, INFINITE,Computer_Angel, Zombie, NVH(c),softcracker_vn, luucorp, Aaron, Canterwood, hhphong, R@dier, tlandn, , RCA, CTL, Moonbaby, kienmanowar, benina,TQN, the_lighthouse, Nini, hoadongnoi, hosiminh, Nilrem, Teerayoot, Ferrari, Kruger, Kelvin, Devilz, anh_surprised ...and you !

Special Thanx Cracks Latinos

Merci FFF, RiF, N-Gen (closed), ICI-TEAM pour me-aider des connaissances du Game Cracking

Thanx to author of OllyDBG.

To be continued...

Written by hacnho (tutorial date: Sai Gon 15/08/2005)

 

Free Web Hosting