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 Export và Import.
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 1.4 |
BCB 6.0 |
godfather+ 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
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,
Thanx to author of OllyDBG.
To be continued...
Written by hacnho
(tutorial date: Sai Gon