Using Graph Mode In Ida

  • May 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Using Graph Mode In Ida as PDF for free.

More details

  • Words: 3,301
  • Pages: 19
Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

Using Graph Mode in IDA Chào các bác, các cô, các chú, các anh, các chị… Em vừa cài được thằng Office (sư phụ 0xdie đưa link), lòng vui phơi phới, và để dập tắt lời đồn thổi rằng có một thằng P.E suốt ngày vào REA spam, bữa nay viết cái hướng dẫn nhỏ cho anh em newbie, lần đầu viết bài có gì thiếu xót mong mọi người bỏ qua. Target Packed/Lang Tool Level

Unregistered!'s Crackmev #1 None/ASM IDA 5.5 demo 1/10 - Very Easy

Trong bài viết này em dùng IDA 5.5 demo cho lương thiện, bác nào có bản full cứ việc dùng, cũng chả khác nhau gì đâu, ít nhất là mấy cái liên quan đến tut của em 

Lấy thông tin

Như em đã nói, cái này viết bằng ASM (em yêu cầu thằng Unreg thế mà, nó sợ em lắm, đâu lẽ dám làm khác ), tóm lại là khỏi cần kiểm tra, chỉ cần chạy thử coi sao thôi:

Nhấn Check ~~>

Rất tử tế. Không thấy nút Thank đâu cả, khỏi cảm ơn 

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

Làm quen với chế độ sơ đồ trong IDA

Chúng ta thường crack với Olly (xét tại thời điểm hiện tại), IDA cũng phổ biến nhưng số lượng hướng dẫn về công cụ này không nhiều (cảm giác như đây là công cụ dành cho dân chuyên nghiệp, và tất nhiên ai muốn chuyên nghiệp thì tự tìm hiểu, chứ cứ dạy qua dạy lại thì đâu còn khái niệm chuyên nghiệp nữa), tut này chẳng có tham vọng gì cả, cũng như chẳng khai sáng giúp các bác tí nào về IDA, chỉ muốn cùng các bác thư giãn một chút với chế độ sơ đồ của IDA, thay vì chế độ text tương tự Olly. Vậy chế độ này có ưu điểm gì? Ưu điểm là gì thì mỗi người một nhận xét, nhưng em ví dụ có cái quyển sách hướng dẫn đi đường mà cứ nói rẽ trái đến Hàng Buồm, rẽ phải đến Hàng Ngang, rồi lại rẽ trái, rẽ phải, quay tới quay lui tới Tràng Tiền thì chắc các bác chả muốn dùng, mua cái bản đồ Hà Nội coi cho sướng, nhỉ  Vậy thì chế độ IDA phần nào sẽ giúp các bác thấy code sáng sủa hơn, đỡ rối hơn (cái này cũng còn tùy ) và logic hơn… Rồi, rào trước đón sau nhiều rồi lại Đầu voi đuôi chuột thì xấu hổ lắm, thực hành luôn cho vui nhỉ  Mở IDA lên, load cái crackme vào, giữ nguyên tùy chọn mặc định:

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM] Nhấn OK và chờ tí xíu ("tí xíu" ở đây sẽ đủ để các bác pha một tách cà phê và vừa nhấm nháp vừa đọc sách trong một số trường hợp ), bao giờ thấy dòng này bên dưới thì coi như xong:

Quan sát cái cửa sổ to nhất (IDA View-A), nếu các bác thấy nó toàn là chữ và chữ thì nhấn chuột phải ~> Graph View. Sang được chế độ Graph rồi thì các bác nên chú ý cái khung nhỏ nhỏ bên góc phải:

Cái này trông nhỏ con mà có ích lắm, nhiều khi sơ đồ nó cứ lằng tằng nhằng, rối tinh rối mù mà không thể bao quát nổi, các bác như nhìn cái cửa sổ thu nhỏ này cho dễ thở  Rồi, bây giờ coi cái sơ đồ chính, các bác thấy nó to, nhưng chữ vẫn không rõ, vậy thì nhấn chuột phải ~> Zoom 100% (nhấn bên ngoài cái khung nhé). Các bác có thể nhấn chuột trái và kéo qua kéo lại, kéo lên kéo xuống cho vừa tầm mắt thì thôi (kéo ở sơ đồ chính hay sơ đồ phụ thu nhỏ cũng được). Giờ thì điểm qua một chút cái crackme nào  Bỏ qua mấy dòng chú thích trên đầu, có thể thấy đoạn code chính là đây:

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

Không lẽ có vài dòng vậy ta :-? Hơ hơ, như ta biết crackme viết bằng ASM, mà ASM thì đoạn code tạo một Dialog cũng quen thuộc, nhỉ , xét theo cái Call DialogBoxParamA kia thì có đoạn code chính chắc chắn phải ở cái DialogFunc rồi  Nhấn kép chuột vào chuỗi DialogFunc đó, ta vào một khu phố sầm uất hơn 

Hơi rối thì phải , vẫn phải phóng to rồi nhìn 100% thôi, nhỏ này thì hiểu sao nổi  Đoạn code đầu tiên là đây:

Có thể tạm thấy rằng IDA phân loại các khung code theo lệnh nhảy (từ khung này sang khung kia). Tùy theo màu sắc các bác config, ở máy em thì màu đỏ là nhảy, còn màu trắng là không nhảy (tức là nếu lệnh nhảy thực thi thì đi theo mũi tên đỏ, còn không thì đi theo mũi tên trắng). Chúng ta chú ý đến dòng

Giá trị 110h ở đây không phải là một giá trị ngẫu nhiên mà thực chất là tên một sự kiện (tại sao thì cứ code là hiểu), vậy đây là sự kiện gì? Có lẽ phần nhiều các bác đoán được, nhưng nếu không đoán được, hoặc chẳng muốn cứ phải nhớ trong đầu cho rối trí thì ta có thể để IDA thay thế giá trị số đó bằng một chuỗi gợi nhớ hơn. Nhấn chuột phải vào 110h ~>

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

Một cửa sổ hiện ra, trong này có rất nhiều chuỗi tương ứng với giá trị 110h, tuy nhiên với một ứng dụng ASM, lại ở đầu thế kia, thì ta đoán đó sẽ là:

Chọn và nhấn OK để áp dụng thay đổi:

Tất nhiên không phải lúc nào cũng dễ dàng như vậy, tuy nhiên nếu chỉ chú ý đến các sự kiện bắt đầu bằng WM, mọi thứ sẽ đơn giản hơn phần nào. Ví dụ với giá trị 201h trong khung này:

Vẫn làm như trên, trong cửa sổ chọn giá trị, ta gõ WM và lọc được:

Cũng không khó, nhỉ  Các bác cứ tiếp tục làm với mấy cái tương tự, tất nhiên kinh nghiệm code sẽ là lợi thế  Như vậy đoạn code lúc này như sau:

Crackme sẽ bắt sự kiện WM_INITDIALOG để thực thi đoạn code theo mũi tên trắng (không nhảy), còn nếu nhảy (JNZ - nhảy nếu [ebp+arg_4] khác WM_INITDIALOG) thì sẽ thực thi đoạn code theo mũi tên đỏ. Sẵn tiện nói thêm chút, nếu các bác chưa quen với mấy lệnh nhảy JNE, JE, JG… nó nghĩa là gì và giá trị các cờ thế nào (trường hợp patch trong memory) thì có thể dùng tính năng Auto Comments trong IDA

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM] bằng cách vào Options ~> General… ~> thẻ Disassembly ~> Auto Comments, sau khi đánh dấu ta được như sau:

Rất rõ ràng  Lệnh JNZ nhảy nếu khác 0 (trong phép so sánh thì nếu 2 toán hạng bằng nhau sẽ trả về 1, khác nhau trả về 0), đồng thời khi đó cờ ZF sẽ bằng 0 (như vậy nếu muốn patch thì chỉ cần đổi giá trị cờ ZF thành 1 là được ) Thế là tạm ổn rồi, giờ ta tiến hành phân tích cái crackme này. Đầu tiên tại sự kiện WM_INITDIALOG, crackme sẽ làm gì? Theo hướng mũi tên trắng ta đến khung này:

Cái này ai lập trình thì biết đoạn code này có 2 nhiệm vụ chính là đặt Icon cho Dialog và Kiểm tra xem crackme có đang bị debug không thông qua hàm IsDebuggerPresent (cái thằng hâm, bảo viết để mình học mà nó cho tùm lum đủ thứ). Thế này nếu ta run thì hỏng chắc chứ còn gì nữa  Không tin à? Test nhé  Tại dòng

Ta nhấn F2 để đặt BP (giống Olly), tiếp theo nhấn F9 để run (cũng giống Olly), khác Olly ở chỗ là IDA nó oai hơn tí 

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

Mấy cậu khoái nghịch ngợm là phải chú ý đấy  Còn đã liều thì đánh dấu vào Don't display… rồi nhấn Yes thôi  IDA dừng tại BP, Zoom 100% để xem code, để chuột tại eax và thấy rằng eax lúc này bằng 1 (thì tại mình đang debug crackme mà )

F9 run tiếp và "Mặt trời xuống núi"  … … … Vậy thì, để có thể debug được crackme này, ta cần bypass quá trình kiểm tra debugger. Nếu là Olly thì eax, 1" ~> "cmp eax, 0" hoặc jz ~> jnz. Tuy nhiên IDA không cho phép có thể patch từ "cmp patch như vậy, nên ta cần dùng cách khác… Dựa vào chế độ Auto Comments của IDA, ta có thể thay đổi giá trị cờ ZF để lệnh nhảy jz không thực thi. Tuy nhiên với IDA có một cách khác khá thú vị như sau: Chúng ta vẫn đang đặt BP tại câu lệnh:

Giờ nhấn phải chuột vào dòng code này, chọn:

Trong cửa sổ hiện ra, ta điền như sau và nhấn OK:

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

Có nghĩa là, mỗi khi thực thi đến câu lệnh ta đặt BP này, giá trị của eax sẽ bằng 0, đồng nghĩa với việc ta có thể bypass quá trình kiểm tra debugger. Giờ chạy thử crackme, IDA vẫn dừng tại BP đang xét, nhưng khi ta thấy giá trị eax lúc này bằng:

Nhấn F9 tiếp và ta thấy crackme run bình thường. Bây giờ ta có thể edit breakpoint khi nãy để bỏ mục Pause (vì không cần thiết nữa), nhưng không được bỏ hẳn BP đó. Như vậy là ta đã hiểu và xử lý được một đoạn code khá quan trọng, nhưng nếu cứ để nó như vậy thì chiếm diện tích quá, mà ta thì đâu cần đến nó nữa  IDA cho phép ta thu hẹp diện tích của một hay nhiều khung code với nội dung hiển thị do ta đặt. Ví dụ với khung code này, nhấn chuột phải chọn:

Ta có thể điền nội dung bất kỳ mang tính gợi nhớ, sau khi điền nhấn OK và khung code trở nên gọn gàng hơn rất nhiều:

Từ giờ chúng ta nên có thói quen sau khi phân tích xong đoạn code nào thì tóm tắt lại nội dung đoạn code đó, sẽ tiện cho việc keygen vì code trở nên mạch lạc và rõ ràng hơn rất nhiều  Xong bước 1! 

Phân tích thuật toán và code Keyge n Chuyển qua nhánh Code theo hướng mũi tên đỏ, ta đến:

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

Đoạn code này không có gì đáng chú ý (chỉ xử lý tương tác giữa người dùng và form), chúng ta bỏ qua để đến đoạn code này:

Bạn hãy chú ý giá trị 3F7h, đây là giá trị ở hệ HEX, bạn chuyển qua DEC bằng cách nhấn chuột phải vào giá trị đó ~>

Với những ai lập trình ASM dùng IDE như WinASM hay RADASM thì các giá trị kiểu 1001, 1002… là rất quen thuộc, đây là các ID mặc định mà IDE đặt cho control được thêm vào form. Tuy nhiên bây giờ chúng ta chưa biết 1015 là ID của control nào, vì vậy hãy xem xét rộng hơn một chút:

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

The GetDlgI temText function retrieves the title or text associated with a control in a dialog box.

UINT GetDlgItemText( HWND hDlg, // handle of dialog box int nIDDlgItem, // iden tifier of control LPTSTR lpString, // address of buffer for text int nMaxCount // maximum size of string ); 1 Với một chút kinh nghiệm debug với Olly chúng ta dễ dàng thấy rằng những đoạn code ở khung 2 và 3 dùng để kiểm tra người dùng đã nhập dữ liệu vào control nào đó hay chưa (với crackme này thì đó là 2 textbox Name và Serial), một sự kiện mà kéo theo việc lấy giá trị chuỗi chứa trong 2 textbox Name và

1

Trích từ cuốn Win32.hlp

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM] Serial, đó chỉ có thể là sự kiện nhấn button Check! Như vậy 1015 là ID của button Check, nhưng chúng ta vẫn chưa biết ID của textbox nhập Name và Serial. Ta xét khung code thứ 2 trước

IDA tự động chú thích rõ đến nỗi ta không cần làm thủ công việc tra cứu tập tin WIN32.HLP. Để xác định 1011 là ID của control nào, ta đặt một BP tại câu lệnh

Nhấn F9, điền vào Name và Serial như lúc đầu, nhấn Check, IDA dừng lại:

Haha, thật ngu ngốc khi ta điền Name và Serial đều có chiều dài quá khổ dù biết rằng cchMax = 9 (chuỗi khi khai báo kết thúc bằng 0 nên 9 - 1 sẽ bằng 8 ký tự)  Tuy vậy, không cần thiết phải điền lại, chúng ta có thể kiểm tra giá trị vừa được lấy là Name hay Serial bằng cách: Nhấn kép chuột vào chuỗi "String" tại dòng"

Chúng ta sẽ đến địa chỉ lưu chuỗi vừa được lấy:

Đọc các byte này quả là mệt mỏi, IDA cho phép chúng ta chuyển chúng về dạng chuỗi thông thường, nhấn phím A và bạn sẽ thấy:

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM] Như vậy ta đã biết 1011 là ID của textbox nhập Serial, tuy nhiên đồng thời với việc đổi từ byte sang string bằng cách nhấn phím A, IDA cũng tự động rename tên biến dựa vào giá trị của biến. Nếu bạn không thích điều này, bạn có thể tự tay rename lại để có hiệu quả hơn. Nhấn chuột phải vào chuỗi a12345678 và chọn:

Hoặc nhấn N, đổi tên và nhấn OK, sau đó nhấn Esc để trở lại đoạn code đang xét:

Tên biến đã được đổi  Bằng phương pháp loại trừ ta thấy 1016 sẽ là ID của textbox nhập Name, vì 2 quá trình là như nhau nên ta không cần xét tới nữa. Tuy nhiên chúng ta sẽ xem xét xem điều gì sẽ xảy ra nếu ta không nhập Name hoặc Serial (không cần debug, chỉ cần lần theo mũi tên mà thôi )

He he, Badboy! Đây là một crackme nên code có thể đơn giản, nhưng trong nhiều trường hợp bạn khó nhớ hết được mỗi lệnh nhảy sẽ nhảy đến đâu, nhất là những lệnh nhảy quan trọng! Thay vì phải comment cho từng lệnh nhảy, nếu các lệnh nhảy đó có cùng một điểm đến, IDA cho phép bạn rename tên đại diện của mỗi khung code (mà mặc định là các chuỗi loc_xxxxxx như bạn thấy). Ta có thể rename Badboy qua thao tác nhấn vào chữ N trên mỗi khung code và điền vào chuỗi tùy ý, ở đây em điền là Badboy:

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

Trở lại các khung code khi nãy để xem sự thay đổi nào 

Rất trực quan phải không nào  Tạm thời như vậy đã  Khung code tiếp theo:

Đơn giản là gán chuỗi Name và ebx và khởi tạo giá trị các biến esi và edx về 0 (theo kinh nghiệm thì đoán là chuẩn bị cho một vòng lặp). Tiếp đến đoạn code này:

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

Ta nhớ rằng ebx chứa chuỗi Name, esi = edx = 0 và eax = Name.Length = 12 ("P.E Onimusha"). Đoạn code này có nhiệm vụ tính tổng DEC của chuỗi Name và lưu vào edx. Nhấn Ctrl và chọn 2 khung code trên, dùng tính năng Group Nodes để tóm tắt lại đoạn code, ví dụ:

Debug ta biết được sau vòng lặp EDX = 427h. Tiếp theo:

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

The wsprintf function formats an d s tores a series of characters and values in a buffer. Any argu men ts are converted an d copied to the output buffer according to the corres pondin g format specification in the format string. The function appends a termin ating null character to the characters it writes, bu t the return valu e does not inclu de the termin atin g null character in its character count. int ws printf( LPTSTR lpOut, // pointer to buffer for ou tpu t LPCTSTR lpFmt, // pointer to format-con trol string ... // option al argu ments ); 2 Như vậy với những dòng code này:

Crackme chuyển giá trị từ edx (HEX) sang ebx (String), ebx lúc này lưu chuỗi "427". Tuy nhiên cần chú ý rằng trước đó có câu lệnh:

2

Trích từ cuốn Win32.hlp

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

Nên tại địa chỉ byte_40304A cũng sẽ lưu chuỗi "427". Ta có thể đặt địa chỉ này là Sum để dễ nhớ. Mấy dòng này:

The lstrlen function retu rns the length in bytes (ANSI version ) or characters (Unicode version) of the specified s tring (not inclu ding the terminatin g null character). int lstrlen ( LPCTSTR lpString // address of strin g to count ); 3 Vậy sau lệnh call lstrlenA thì eax lưu chiều dài chuỗi tại địa chỉ Sum (gọi tắt là chuỗi Sum). Sau đó câu lệnh push eax sẽ lưu lại giá trị của eax trong stack.

Vẫn câu lệnh GetDlgItemText quen thuộc, sau lệnh call GetDlgItemText thì eax sẽ lưu chiều dài chuỗi Serial. Câu lệnh pop ebx sẽ lấy giá trị vừa lưu từ eax trong stack và gán vào ebx, tức là ebx chứa chiều dài chuỗi Sum. Nếu ebx khác eax ~> Badboy! Vì len("1234567890") <> len("427") nên ta cần điền lại Key, tuy nhiên điền ngay 427 sẽ mất vui vì crackme còn 1 đoạn code nữa, ta sẽ điền Serial là "123" để qua được lệnh nhảy đến Badboy hoặc không cần điền cũng được vì đoạn code tiếp theo là không khó.

3

Trích từ cuốn Win32.hlp

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

Vòng lặp này rất dễ hiểu, crackme so sánh từng ký tự trong chuỗi Serial người dùng nhập với ký tự tương ứng của chuỗi Sum tính được, nếu có cặp ký tự khác nhau sẽ nhảy đến Badboy, đồng nghĩa với việc muốn đến Goodboy thì tất cả các ký tự phải trùng khớp.

Tổng kết

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM]

Private Function Gen(ByVal strName As String) As String Dim i, strSum As Integer strSum = 0 If strName.Length = 0 Then Return "" End If If strName.Length > 20 Then strName = Mid(strName, 1, 20) End If For i = 1 To strName.Length

http://reaonline.net

Using Graph Mode in IDA - Writen by x5254725 [REA TEAM] strSum += Asc(Mid(strName, i, 1)) Next Return Hex(strSum).ToString End Function

[R]everse [E]ngineering [A]ssociation Greetz: Unregistered!, 0xdie … P.E Onimusha aka x5254725 16/08/2009

http://reaonline.net

Related Documents

Ida
April 2020 28
Graph
October 2019 41
Graph
October 2019 37