54
1 INTRODUCTION TO THE CRACKING WITH OLLYDBG FROM CRACKLATINOS (_kienmanowar_) I. Lời nói đầu : Một lần nữa gửi lời chào tới toàn thể anh em trong REA. Tình cờ qua bên site của lão Ricardo Narvaja thấy được bộ tut này khá hay và rất cơ bản cho tất cả những ai muốn tìm hiểu về cracking thông qua sự trợ giúp của chương trình debugger đã trở nên quá nổi tiếng, đó chính là Ollydbg. Tôi rất khoái các tut bên Cracklatinos nhưng ngặt nỗi toàn là tiếng TBN, nhưng thấy bộ tut này hay nên máu quá , quyết định trans từ TBN qua English, rồi từ Eng lại hì hục viết lại theo cách mình hiểu để truyền đạt những gì mình biết cho anh em. Ý tưởng chính của loạt tut này theo như tác giả của nó nói là nhằm cung cấp những kiến thức cơ bản nhất cho tất cả những ai chuẩn bị bắt đầu bước vào tìm hiểu nghệ thuật cracking với sự trợ giúp của Ollydbg. Mặc dù tiêu đề của tut là Introduction (tức là chỉ giới thiệu thôi) nhưng thực chất bộ tuts này sẽ cung cấp cho chúng ta một kiến thức nền tảng vững chắc để có thể đọc và hiểu được các tuts dành cho những người có trình độ advanced và đặc biệt là những tut sắp được giới thiệu trên Cracklatinos (hehe tác giả của nó quảng cáo ác quá), đồng thời thông qua loạt tuts này nó còn giúp chúng ta có khả năng áp dụng các kĩ thuật mới trong việc cracking. II. Tại sao lại là Ollydbg ? Tham gia vào REA điều đầu tiên có lẽ chúng ta thấy nhiều nhất đó là sự xuất hiện của “Ollydbg”, vậy tại sao lại là Ollydbg mà không phải là một công cụ nào khác. Ở đây chúng ta sẽ không bàn luận đến việc tạo ra một công cụ khác hay hơn, mạnh hơn Ollydbg cũng như không để cập tới việc chỉnh sửa lại một chương trình đã quá nổi tiếng từ lâu là SoftIce, chỉ đơn giản là những tín đồ cuồng tín của SoftIce đang dần dần chuyển qua xài Ollydbg bởi tính dễ dùng, không gây crash máy bất thình lình như SoftIce, được hỗ trợ bởi nhiều teams trên thế giới thông qua các Plugins cũng như các bản Ollydbg được mod lại nhằm chống lại các cơ chế anti-debug cũng như anti-Ollydbg, và vì một lý do đơn giản khác nữa đó là loạt tuts này dành riêng để nói vể Ollydbg . III. Nhiệm vụ đầu tiên Hì nhiệm vụ đầu tiên của chúng ta bây giờ là gì ? Do đây là tut viết về Olly nên việc chúng ta phải làm là đi tìm Olly ở đâu để còn load về mà xài. Thứ nhất bạn có thể lên home site của Olly là ollydbg.de để download, còn không thì trong REA có đưa rất nhiều link để download Ollydbg. Riêng bản thân tôi cũng sưu tầm được có lẽ gần chục bản Olly khác nhau, hic hic có lẽ là đợi ver 2.0 của Olly thôi

Cracking Voi Ollydbg

  • Upload
    namnam

  • View
    131

  • Download
    6

Embed Size (px)

Citation preview

Page 1: Cracking Voi Ollydbg

1

INTRODUCTION TO THE CRACKING WITH OLLYDBG

FROM CRACKLATINOS

(_kienmanowar_)

I. Lời nói đầu : Một lần nữa gửi lời chào tới toàn thể anh em trong REA. Tình cờ qua bên site của lão Ricardo Narvaja thấy được bộ tut này khá hay và rất cơ bản cho tất cả những ai muốn tìm hiểu về cracking thông qua sự trợ giúp của chương trình debugger đã trở nên quá nổi tiếng, đó chính là Ollydbg. Tôi rất khoái các tut bên Cracklatinos nhưng ngặt nỗi toàn là tiếng TBN, nhưng thấy bộ tut này hay nên máu quá , quyết định trans từ TBN qua English, rồi từ Eng lại hì hục viết lại theo cách mình hiểu để truyền đạt những gì mình biết cho anh em. Ý tưởng chính của loạt tut này theo như tác giả của nó nói là nhằm cung cấp những kiến thức cơ bản nhất cho tất cả những ai chuẩn bị bắt đầu bước vào tìm hiểu nghệ thuật cracking với sự trợ giúp của Ollydbg. Mặc dù tiêu đề của tut là Introduction (tức là chỉ giới thiệu thôi) nhưng thực chất bộ tuts này sẽ cung cấp cho chúng ta một kiến thức nền tảng vững chắc để có thể đọc và hiểu được các tuts dành cho những người có trình độ advanced và đặc biệt là những tut sắp được giới thiệu trên Cracklatinos (hehe tác giả của nó quảng cáo ác quá), đồng thời thông qua loạt tuts này nó còn giúp chúng ta có khả năng áp dụng các kĩ thuật mới trong việc cracking. II. Tại sao lại là Ollydbg ? Tham gia vào REA điều đầu tiên có lẽ chúng ta thấy nhiều nhất đó là sự xuất hiện của “Ollydbg”, vậy tại sao lại là Ollydbg mà không phải là một công cụ nào khác. Ở đây chúng ta sẽ không bàn luận đến việc tạo ra một công cụ khác hay hơn, mạnh hơn Ollydbg cũng như không để cập tới việc chỉnh sửa lại một chương trình đã quá nổi tiếng từ lâu là SoftIce, chỉ đơn giản là những tín đồ cuồng tín của SoftIce đang dần dần chuyển qua xài Ollydbg bởi tính dễ dùng, không gây crash máy bất thình lình như SoftIce, được hỗ trợ bởi nhiều teams trên thế giới thông qua các Plugins cũng như các bản Ollydbg được mod lại nhằm chống lại các cơ chế anti-debug cũng như anti-Ollydbg, và vì một lý do đơn giản khác nữa đó là loạt tuts này dành riêng để nói vể Ollydbg ☺. III. Nhiệm vụ đầu tiên Hì nhiệm vụ đầu tiên của chúng ta bây giờ là gì ? Do đây là tut viết về Olly nên việc chúng ta phải làm là đi tìm Olly ở đâu để còn load về mà xài. Thứ nhất bạn có thể lên home site của Olly là ollydbg.de để download, còn không thì trong REA có đưa rất nhiều link để download Ollydbg. Riêng bản thân tôi cũng sưu tầm được có lẽ gần chục bản Olly khác nhau, hic hic có lẽ là đợi ver 2.0 của Olly thôi ☺

Page 2: Cracking Voi Ollydbg

2

Khi download được Olly về rồi thì rất đơn giản chỉ việc extract nó ra rồi sử dụng, tôi khuyên bạn nên để chung tất cả công cụ liên quan đến RE, Cracking vào 1 thư mục, ví dụ như của tôi trên hình minh họa, như thế ta dễ dàng quản lý hơn. Okie coi như bạn đã có Ollydbg, chúng ta chỉ việc Run cái file OLLYDBG.exe là Olly hoạt động liền, không phức tạp về mặt cài đặt cũng như sử dụng như SoftIce. Giao diện của Ollydbg như sau :

ðây là bản Ollydbg của tôi, đã được chỉnh sửa cũng như cấu hình lại. Nếu như các bạn download bản Ollydbg trên home site hoặc từ các nguồn khác có thể sẽ khác của tôi, và để có thể hiện thị menu Plugins thì các bạn làm như sau :

Page 3: Cracking Voi Ollydbg

3

Chọn như hình trên hoặc vào Options > Appearance , chọn tab Directories và chỉnh lại đường dẫn tới thư mục Plugins và thư mục UDD.

Sau đó nhấn Ok và chạy lại Olly thì sẽ thấy được menu Plugins. Phần tiếp theo, tôi sẽ giới thiệu tới các bạn chi tiết các cửa số chính trong Ollydbg và để minh họa cho các phần sau của bài viết, tôi sẽ sử dụng một Crackme rất nổi tiếng đó là : CRACKME.EXE của tác giả CRUEHEAD. ðể load crackme này vào trong Olly ta nhấn chuột vào biểu tượng sau hoặc vào File > Open (or F3) :

Sau đó chúng ta sẽ chọn chính xác crackme mà chúng ta dùng để minh họa cho bài viết này.

Kết quả sau khi load vào Olly chúng ta có được như sau :

Page 4: Cracking Voi Ollydbg

4

Chắc các bạn nhìn vào sẽ cảm thấy choáng ngợp, không biết phải bắt đầu từ đâu. Hic ngày đầu tiên khi tôi load một target vào trong Olly, nhìn ngược nhìn xuôi cũng không hiểu gì hết luôn hehe, cứ ngồi ngắm mãi vì chẳng biết làm gì hơn. Nhưng không sao mọi thứ đều có cách giải quyết, khi chưa biết thì phải tìm tài liệu mà đọc, khi đọc mà không hiểu lúc đấy hẵng đi hỏi. Nhưng hỏi cũng phải biết đường mà hỏi, nếu không sẽ chẳng bao giờ bạn nhận được câu trả lời mà có khi còn khiến người khác cảm thấy bực mình. Tôi sẽ cùng các bạn tìm hiểu từng cửa sổ một của Olly. Như các bạn nhìn thấy ở trên màn hình chính của Olly được phân ra làm 5 cửa sổ chính, mỗi cửa sổ có một nhiệm vụ và một tên riêng :

Page 5: Cracking Voi Ollydbg

5

Ở đây chúng ta thấy có 4 cửa sổ lớn :

- The Disassembler Window : Ở cửa sổ này các bạn có thể nhìn thấy các đoạn code của chương trình ở dạng ngôn ngữ asm, và đồng thời tại cửa sổ này các bạn cũng có thể chú thích cho từng từng dòng mã asm .

- The Registers Window : ðây là cửa số chứa thông tin chi tiết về các thanh ghi

như eax, ebx, ecx v….v…..Các cờ trạng thái cũng được quản lý tại cửa sổ này - The Dump Window : Tại cửa sổ này bạn có thể xem hoặc chỉnh sửa theo 2 dạng

là hex và Ascii bộ nhớ của chương trình mà bạn muốn debug - The Stack Window : Một cửa sổ không kém phần quan trọng , mọi thứ trước khi

được thực hiện phải được nạp vào Stack.

Cuối cùng có một cửa sổ nằm bên dưới cửa sổ Disassembler Window : Chúng ta gọi nó là The Tip Window . ðây không phải là tên gọi của nó nhưng với tôi, tôi thích gọi như vậy ☺ .Khi bạn đang ở tại một dòng code nào đó trong quá trình debug , Olly sẽ cho bạn thấy thông tin chi tiết về dòng code đó . Lấy ví dụ đơn giản như sau : nếu bạn debug tới dòng lệnh “ mov eax , dword ptr [123]” . Thì cửa sổ này sẽ cho bạn biết được giá trị hay con số nào đang được lưu giữ tại [123] . Và còn nhiều điều thú vị khác nữa mà cửa sổ này sẽ mang lại cho chúng ta . Trên đây là những gì tổng quan nhất mà các bạn nên biết. Phần dưới đây tôi sẽ đi vào giới thiệu về chức năng của từng cửa sổ một thông qua các hình minh họa, tất nhiên không thể giới thiệu chi tiết hết được, chúng ta sẽ tìm hiểu dần dần trong từng trường hợp cụ thể ở

Page 6: Cracking Voi Ollydbg

6

các loạt tuts sau thêm vào đó các bạn cũng nên chủ động tự mình tìm hiểu, đừng nên quá lệ thuộc vào bài viết này. 1. The DISASSEMBLER Window : ðây là cửa sổ chính đầu tiên của Olly và là cửa sổ rất quan trọng, chúng ta sẽ làm việc rất nhiều trên cửa sổ này. Khi bạn muốn debug một chương trình, bạn load file thực thi của chương trình đó vào trong Olly.Các chương trình mà bạn load vào Olly là những chương trình có thể được code bằng những ngôn ngữ khác nhau như : VB, VC++, Borland Delphi hay MASM nhưng tại cửa sổ này toàn bộ code của chương trình sẽ được list ra dưới dạng các mã ASM. Theo mặc định của Olly thì bất cứ chương trình nào mà bạn load vào Olly sẽ được Olly tiến hành phân tích toàn bộ code chính của chương trình đó và đưa ra các comment thích hợp. Bạn có thể tùy biến chức năng này thông qua hình minh họa dưới đây :

Nếu như bạn chọn sử dụng chức năng này của Olly thì những gì xuất hiện trên cửa sổ bạn sẽ giống với những hình minh họa trước. Còn nếu như bạn không chọn, chúng ta sẽ thấy ngay được sự khác biệt, Olly sẽ không tự động phân tích chương trình nữa công việc phân tích này chúng ta sẽ phải thực hiện một cách manual sau khi chương trình được load vào trong Olly. Okie, tôi thử bỏ chọn và load lại Crackme vào trong Olly, ta sẽ được như sau :

Page 7: Cracking Voi Ollydbg

7

Như các bạn thấy trên hình trên, nếu như chúng ta không chọn chức năng tự động phân tích của Olly thì sẽ thấy các thông tin trong phần Comment đã bị lược bỏ đi khá nhiều, điều này dẫn đến việc khó khăn trong quá trình debug chương trình. Tuy nhiên không phải lúc nào chức năng này cũng hoạt động một cách hiệu quá, nhiều khi chúng ta để cho Olly tự động phân tích sẽ lại dấn đến một kết quả hoàn toàn ngược lại, đoạn code được phân tích và thể hiện ra không được chính xác, ví dụ như trường hợp dưới đây chúng ta sẽ nhận được đoạn code toàn chứa DB :

Trong trường hợp như thế này chúng ta có thể thực hiên một cách manual để remove những gì mà Olly đã tiến hành phân tích chỉ đơn giản bằng cách nhấn chuột phải tại màn hình này và chọn Analysis > Remove analysis from module

Page 8: Cracking Voi Ollydbg

8

Và kết quả là chúng ta có được đoạn code chính xác như sau :

Do đó trong quá trình làm việc với Olly các bạn nên linh hoạt trong quá trình sử dụng chức năng này. Ngoài ra còn một phần khác cũng không kém phần quan trọng, như các bạn thấy trên hình minh họa Olly của tôi các câu lệnh được phân biệt màu sắc một cách rõ ràng, có thể các bạn không chú trọng đến vấn đề này nhưng theo tôi việc chúng ta phân biệt cũng như tinh chỉnh lại màu sắc trong Olly sẽ khiến cho chúng ta nhận biệt các câu lệnh dễ dàng hơn cũng như phần nào thể hiện năng khiếu thẩm mĩ của bạn ☺. ðể tinh chỉnh lại màu sắc trong Olly các bạn vào các Tabs sau :

Page 9: Cracking Voi Ollydbg

9

2. The REGISTERs Window : Một cửa sổ quan trọng tiếp theo, đó chính là cửa sổ Register. Như đã nói đây là cửa sổ chứa thông tin chi tiết về các thanh ghi như eax, ebx, ecx v…v… Các cờ trạng thái cũng được quản lý tại cửa sổ này.

Cửa số này sẽ cung cấp cho chúng ta rất nhiều thông tin trong quá trình chúng ta làm việc cùng Olly. Nếu như chỉ nhìn vào hình minh họa ở trên các bạn chắc cũng sẽ như tôi cảm thấy rằng nó sẽ không có ý nghĩa nhiều lắm, nhưng kì thực đây là nơi cung cấp nhiều thông tin rất hữu ích. 3. The STACK Window : Trước tiên chúng ta sẽ đi tìm hiểu sơ qua về Stack. ðây là nơi lưu trữ tạm thời các dữ liệu và địa chỉ, nó là một cấu trúc dữ liệu một chiều. Các phần tử được cất vào và lấy ra từ một đầu của cấu trúc này, tức là nó được xử lý theo phương thức “vào trước, ra sau” (LIFO : Last In First Out). Phần tử được cất vào cuối cùng gọi là đỉnh của Stack. Các bạn có thể hình dung Stack như là một chồng đĩa, chiếc đĩa được đặt lên cuối cùng sẽ nằm trên đỉnh và chỉ có nó mới có thể được lấy ra đầu tiên. Hai thanh ghi chính làm việc với Stack là ESP và EBP. Theo mặc định trong Olly, Stack được biểu diễn theo thanh ghi ESP tuy nhiên chúng ta có thể luân chuyển qua lại giữa ESP và EBP bằng cách nhấn chuột phải và chọn như hình sau :

Page 10: Cracking Voi Ollydbg

10

4. The DUMP Window : ðây là cửa số hiện thị nội dung của bộ nhớ hoặc file. Ta có thể chọn nhiều định dạng khác nhau để biểu diễn nội dung của memory trong cửa số này : byte, text, integer, float, address, disassembly hoặc PE Header. Cửa sổ này cho phép chúng ta tìm kiếm cũng như thực hiện các chức năng chỉnh sửa, thiết lập các Break points v..v...

Vậy là chúng ta đã dạo qua 1 vòng các cửa sổ chính của Olly, tuy nhiên bên cạnh đó Olly còn có rất nhiều cửa sổ khác mà chúng ta không nhìn thấy một cách trực tiếp như các cửa sổ trên được.Chúng ta phải truy cập vào các cửa sổ đó thông qua Menu như hình minh họa dưới đây :

Chúng ta sẽ lướt qua chức năng của từng cửa sổ một. _ Nút L dùng để mở cửa sổ Log của Olly, cửa sổ này cho chúng ta thấy những thông tin mà Olly ghi lại. Theo mặc định thì cửa số này sẽ lưu các thông tin về các module, import library hoặc các Plugins được load cùng chương trình tại thời điểm đầu tiên khi ta load chương trình vào Olly. Bên cạnh đó cửa sổ này cũng ghi lại các thông tin về các Break points mà chúng ta đặt trong chương trình. Trong trường hợp crackme của chúng ta, ta có được thông tin như sau :

Page 11: Cracking Voi Ollydbg

11

Một tính năng nữa của cửa sổ này là khi chúng ta muốn lưu lại nhưng thông tin về Log cửa số này cũng cung cấp cho chúng ta khả năng ghi ra file.

_ Nút E dùng để mở cửa sổ Executables, cửa sổ này sẽ đưa ra danh sách những file có khả năng thực thi được chương trình sử dụng như file exe, dlls, ocxs , v..v..

Tại cửa sổ này nếu như bạn click chuột phải sẽ thấy có rất nhiều tùy chọn khác nhau, trong khuôn khổ có hạn của bài viết không thể nói hết được. Sẽ có những phần tiếp theo đề cập đến chúng. _ Nút M dùng để mở cửa sổ Memory, cửa sổ này sẽ cho chúng ta thông tin về bộ nhớ đang được sử dụng bởi chương trình của chúng ta và còn nhiều thông tin bổ ích khác nữa :

Page 12: Cracking Voi Ollydbg

12

Tại cửa sổ này chúng ta cũng có thể sử dụng tính năng Search để tìm kiếm thông tin về các strings, các đoạn hexa cụ thể hay unicode v..v.. thêm vào đó nó còn cung cấp cho chúng ta những kiểu thiết lập Break points khác nhau tại các Sections. Việc thiết lập các BPs là tùy thuộc vào yêu cầu và mục đích của chúng ta. _ Nút T dùng để mở cửa sổ Threads, cửa sổ này liệt kê các Threads của chương trình :

_ Nút W dùng để mở cửa sổ Windows _ Nút H dùng để mở cửa sổ Handles

_ Nút C thì khỏi nói , bạn cứ nhấn vào là khắc biết ngay ☺ _ Nút / để mở cửa sổ Patches, cửa sổ này sẽ cho chúng ta các thông tin về những gì mà chúng ta đã edit trong chương trình.

_Nút K để mở cửa sổ Call Stack, hiển thị một danh sách các lệnh call mà chương trình của chúng ta đã thực hiện khi chúng ta Run bằng F9 và dùng F12 để tạm dừng chương trình.

_ Nút B để mở cửa sổ Break Points, cửa sổ này sẽ hiển thị tất cả các BPs mà chúng ta đặt trong chương trình. Tuy nhiên nó chỉ hiện thị các BPs được set bằng cách nhấn F2 thôi, còn các dạng BPs khác như : hardware breakpoint hoặc memory breakpoints thì không được liệt kê ra ở đây:

_ Nút R để mở cửa sổ References, cửa sổ này là kết quả cho những gì chúng ta thực hiện chức năng Search trong Olly, kết quả sẽ được hiện ra ở đây :

Page 13: Cracking Voi Ollydbg

13

Phù khá nhiều cửa sổ phải không các bạn, tôi sẽ không đi vào chi tiết thêm nữa bởi vì chúng ta sẽ còn gặp lại trong các tuts tiếp theo, 1 yêu cầu rất quan trọng ngoài việc bạn biết sử dụng Olly ra thì bạn còn phải biết về Asm language, nếu không biết về nó thì hii các bạn nên dành thời gian để tìm hiểu một số kiến thức cơ bản trước khi đọc tiếp các phần sau của bài viết. Ngoài ra để các bạn dễ làm quen hơn trong các phần sau tôi sẽ cố gắng hệ thống lại ☺. IV. Cấu hình Olly thành JIT (Just-in-time debugging) Khi một số chương trình thực thi và nó tạo ra Exception, Windows có thể gọi Registered Debugger (các debuggers được cấu hình thành JIT) và attach nó vào chương trình. Tính năng này được gọi là Just-in-time debugging. Một vài JIT debuggers dừng lại tại System breakpoint. Ollydbg thì tiếp tục thực thi cho đến khi nó đi đến câu lệnh đã tạo ra Exception. ðể cấu hình Ollydbg trở thành 1 JIT bạn làm như sau :

Nếu như bạn không muốn sử dụng tính năng này thì bạn có thể Restore lại.

Page 14: Cracking Voi Ollydbg

14

V. Một số phím cơ bản để làm việc với Olly : F7 : Khi bạn nhấn F7 sẽ thực thi từng dòng lệnh 1. Nếu trong quá trình Trace mà gặp lệnh Call thì sẽ đi vào trong lòng của lệnh Call đó và thực thi từng câu lệnh trong lệnh Call này cho đến khi gặp lệnh Retn để trở lại chương trình chính, tức là câu lệnh tiếp theo sau lệnh Call. F8 : Cũng tương tự như F7 nhưng có 1 điểm khác biệt là khi Trace code, nếu như gặp lệnh Call nó bỏ qua không cần quan tâm các lệnh bên trong lệnh Call mà thực thi luôn lệnh Call đó và dừng lại tại câu lệnh tiếp theo dưới lệnh Call. F2 : ðặt một Break point trong chương trình. Vậy Break point là gì , đơn giản nó chỉ là việc chúng ta tạo 1 điểm ngắt trong chương trình theo một điều kiện nào đó để khi thực thi chương trình, nếu thỏa điều kiện mà chúng ta đặt ra thì chương trình sẽ dừng lại tại vị trí mà chúng ta đã đặt BP. Ví dụ, trong hình minh họa dưới đây :

Bây giờ tôi muốn đặt một BP tại hàm Call gọi tới API: LoadIconA. Tức là khi tôi thực thi chương trình, chương trình gọi tới hàm này thì ngay lập tức nó sẽ dừng lại tại đây.Việc tiếp theo là tôi có thể tùy biến lại hàm này theo mục đích của tôi, chẳng hạn tôi NOP nó để chương trình không còn gọi đến hàm này nữa v..v.. ðể làm được điều này bạn nhấn chuột tại vị trí cần Set BP, sau đó nhấn F2. Chỗ chúng ta Set BP sẽ được đánh dấu màu đỏ :

ðể bỏ BP mà chúng ta đã set thì chỉ việc chọn vị trí đánh dấu màu đỏ và nhấn F2. F9 : Cho phép thực thi chương trình trong chế độ Debug, tương tự như việc chúng ta nhấp đúp chuột vào chương trình để thực thi nó. Tuy nhiên khác với việc nhấp đúp chuột, nếu chúng ta nhấn F9 thì Olly sẽ tìm xem có BP nào được Set hay không, chương trình có tung ra các Exception gì không, hay nếu chương trình có cơ chế chống Debug thì nó sẽ terminate ngay lập tức. Nếu như không có bất kì cản trở nào thì chương trình sẽ Run hoàn toàn và trên status bar của Olly sẽ báo cho chúng ta biết điều này :

Page 15: Cracking Voi Ollydbg

15

F12 : Tạm dừng chương trình lại. VI. Lời kết : Trên đây là những gì tổng quan nhất về Olly, như đã nói các bạn không nên quá lệ thuộc vào bài viết này của tôi, các bạn có thể tự mình tìm hiểu thêm những tính năng khác của Olly. Các phần sau của loạt tuts này làm việc trên Crackme của tác giả CRUEHEAD, để tiện cho các bạn đỡ mất công tìm kiếm tôi đã kèm luôn target cùng với bài viết này. Hi vọng những gi tôi đã viết ở trên đã giúp cho các bạn phần nào hiểu được tại sao Ollydbg đang ngày càng trở nên phổ biến. Best Regards _[Kienmanowar]_

--++--==[ Greatz Thanks To ]==--++-- My family, Computer_Angel, Moonbaby , Zombie_Deathman, Littleboy, Benina, QHQCrker, the_Lighthouse, Merc, Hoadongnoi, Nini ... all REA‘s members, TQN, HacNho, RongChauA, Deux, tlandn, light.phoenix, dqtln, ARTEAM .... all my friend, and YOU. --++--==[ Thanks To ]==--++-- iamidiot, WhyNotBar, trickyboy, dzungltvn, takada, hurt_heart, haule_nth, hytkl v..v.. các bạn đã đóng góp rất nhiều cho REA. Hi vọng các bạn sẽ tiếp tục phát huy ☺ I want to thank Teddy Roggers for his great site, Reversing.be folks(especially haggar), Arteam folks(Shub-Nigurrath, MaDMAn_H3rCuL3s) and all folks on crackmes.de, thank to all members of unpack.cn (especially fly and linhanshi). Great thanks to lena151(I like your tutorials). And finally, thanks to RICARDO NARVAJA and all members on CRACKSLATINOS.

>>>> If you have any suggestions, comments or corrections email me:

kienbigmummy[at]gmail.com

Page 16: Cracking Voi Ollydbg

1

INTRODUCTION TO THE CRACKING WITH OLLYDBG

FROM CRACKLATINOS

(_kienmanowar_)

I. Lời nói đầu Chào mọi người, sau tut đầu tiên của tôi giới thiệu tới các bạn về Ollydbg, bẵng đi một thời gian do công việc bận rộn tôi đành gác bút chưa thể viết tiếp được. Bây giờ mọi việc có vẻ ổn định rồi, tôi sẽ dành chút thời gian để tiếp tục bộ tut này. Mặc dù có bạn đã làm tiếp công việc của tôi là dịch và viết đến tut thứ 16, nhưng tôi sẽ vẫn viết lại theo cách viết và phong cách của tôi. ðây vừa là những bài viết mà tôi chia sẻ đến các bạn cũng đồng thời là việc tôi đúc kết và lưu trữ những gì mình đã làm được. Ở phần trước sau khi các bạn đã có một cái nhìn tổng quan nhất về công cụ Ollydbg về các thành phần cũng như chức năng chính của nó, thì trong phần thứ hai này tôi sẽ đề cập đến việc sử dụng các hệ thống số trong Olly, thêm vào đó là một chút kiến thức cơ bản về Stack. Okie, L3t’s G0!! II. Các hệ thống số Có ba hệ thống số được sử dụng nhiều nhất đó là Hệ nhị phân, Hệ mười và cuối cùng là hệ thập lục phân.Chúng ta sẽ đi lần lượt định nghĩa về từng hệ thống này. Hệ nhị phân : Trong hệ đếm nhị phân cơ số là 2 và nó chỉ có hai chữ số là 0 và 1. Hệ mười (thập phân) : Có thể nói đây là một hệ thống được chúng ta sử dụng nhiều nhất trong đời sống hàng ngày.Hệ này bao gồm mười chữ số bắt đầu từ 0 đến 9. Hệ đếm này là hệ đếm mà chúng ta quen thuộc nhất. Hệ mười sáu : Các số dưới dạng nhị phân thường là dài và khó nhớ. Việc chuyển đổi các số thập phân sang nhị phân thường khó. Khi chúng ta viết chương trình hợp ngữ chúng ta thường sử dụng cả hai hệ đếm là : nhị phân và thập phân, và cả một hệ đếm thứ ba là hệ 16 hay còn gọi tắt là số hex. Số hex cho phép chúng ta chuyển đổi một cách dễ dàng sang số ở hệ nhị phân và ngược lại. Note : ðể đổi số hex sang số nhị phân chúng ta chỉ việc biểu diễn các chữ số của nó dưới dạng nhị phân. Còn đổi số nhị phân sang số hex, thì ta nhóm 4 chữ số của số nhị phân lại theo thứ tự lần lượt từ phải qua trái. Sau đó chuyển thành số hex tương ứng. Hệ đếm hex là hệ đếm có cơ số 16 cho nên các chữ số của nó là : 0-9, A-F. (Vì hết các kí hiệu chữ số để biểu diễn nên người ta dùng thêm các chữ cái để biểu diễn: các chữ cái từ A – F tương ứng biểu diễn các số từ 10 – 15). Khi bạn muốn làm quen với công việc debug trong Olly thì điều đầu tiên tôi khuyên bạn nên làm quen với các hệ thống số ở trên, Olly chủ yếu sử dụng hệ 16. Bên cạnh đó các bạn cũng phải học các phương pháp chuyển đổi đơn giản giữa các hệ số với nhau để tiện cho quá trình bạn làm việc. Có thể các bạn sẽ cho lời tôi nói là thừa bởi vì ngày nay có quá

Page 17: Cracking Voi Ollydbg

2

nhiều công cụ hỗ trợ cho chúng ta làm việc này, nhưng theo tôi đây vẫn là những kiến thức tiên quyết vì công cụ chỉ là hỗ trợ để chúng ta làm việc nhanh chóng mà thôi, còn muốn hiểu sâu, rộng thì chúng ta không nên bỏ qua những chi tiết dù là vụn vặt nhất. Ở đây trong bài viết này, tôi coi như các bạn đã tự mình trang bị những kiến thức cơ bản rồi. Do đó để dễ dàng hơn cho chúng ta khi làm việc với các hệ thống số, Windows cung cấp cho chúng ta một công cụ khá mạnh mà đôi khi ít người để ý mà thậm chí có khi còn không biết là nó hỗ trợ cho chúng ta các tính năng liên quan đến việc chuyển đổi ☺, đó chính là tiện ích Calculator. Có nhiều cách thức để mở chương trình này nhưng cách nhanh nhất là vào menu Run và gõ Calc.exe (thậm chí chỉ cần gõ Calc cũng mở được).

Như bạn thấy trên hình sau khi chúng ta gõ Calc thì ngay lập tức công cụ Calculator sẽ hiện ra dưới dạng một máy tính chuẩn hệt như cái máy tính bình thường mà bạn hay sử dụng. ðể có thể chuyển sang sử dụng các tính năng chuyên nghiệp hơn liên quan tới các số hệ nhị phân và hệ 16 cũng như các phép tính liên quan tới hai hệ số này, bạn làm như trên hình vẽ (View > Scientific). Ta có được như sau :

Page 18: Cracking Voi Ollydbg

3

Trong hình minh họa bên trên, bạn thấy hệ thống số được sử dụng mặc định là hệ 10 (Dec).Tại sao nó lại mặc định như vậy? Một câu trả lời rất đơn giản là vì từ lúc cha sinh mẹ đẻ chúng ta tới giờ chúng ta sử dụng hệ 10, hệ đếm chuẩn của loài người ☺ nên chương trình để default như vậy là hoàn toàn hợp lý. Các bạn có thể luân chuyển sang các hệ khác rất đơn giản thông qua các tùy chọn. Lấy một ví dụ, tôi muốn chuyển một con số từ hệ 10 sang hệ 16 thì tôi làm thế nào? Tại màn hình Calculator bạn chọn Dec và gõ vào một con số bất kì, ví dụ : 1111)

ðể chuyển sang hệ Hex bạn chỉ việc nhấp chọn vào tùy chọn Hex tại cửa màn hình của Calculator, ngay lập tức số ở hệ 10 của bạn sẽ được chuyển sang số ở hệ 16 một cách chính xác.

Page 19: Cracking Voi Ollydbg

4

Trên hình trên bạn đã thấy khi ở hệ 10 thì các chữ cái từ A – F đều bị disable. Khị bạn chọn chuyển sang hệ hex thì các chữ cái này sẽ được enable lên để phục vụ cho các bạn làm việc ở hệ hex. Việc chuyển đôi qua lại các hệ số khác cũng làm tương tự như trên, qua đó bạn thấy công cụ này đã đơn giản hóa cho chúng ta rất nhiều các công việc liên quan đến việc chuyển đổi bằng tay.Tất cả những gì bạn phải làm là gõ số và nhấn chọn khà khà ☺. III. Số có dấu trong hệ 16 Phần cứng của máy tính cần giới hạn kích thước của các số để có thể lưu nó trong các thanh ghi hay các ô nhớ. Trong hệ hex vấn đề sẽ nảy sinh khi chúng ta muốn biểu diễn một số âm ví dụ như -1 chẳng hạn, chúng ta không thể làm bằng cách thêm một dấu trừ ở phía trước con số giống như ở trong hệ 10 được.Vì nếu làm thế thì đơn giản quá rồi, đâu cần phải đề cập đến vấn đề này làm gì và vì hệ thống máy tính mà chúng ta đang sử dụng chỉ làm việc với hai số 0 và 1 mà thôi, cho nên để biểu diễn một số có dấu phải có qui định khác. Do chúng ta đang làm việc với hệ thống 32 bít cho nên dải số của nó sẽ được biểu diễn ở hệ hex là từ 00000000 – FFFFFFFF.Dải này sẽ được cắt nửa ra, một nửa dùng để biểu diễn số dương và một nửa dùng để biểu diễn số âm. Vậy số dương sẽ bắt đầu từ 00000000 và kết thúc là 7FFFFFFF, còn số âm sẽ bắt đầu từ 80000000 và kết thúc là FFFFFFFF. Vậy làm thế nào để nhận biết đâu là số âm và đâu là số dương? Các bạn hãy để ý đến một bit đặc biệt, đó là bit nằm ở tận cùng bên trái hay còn được gọi với một cái tên khác là bit có trọng số nặng nhất (MSB - Most significant bit). Tương tự như vậy ta cũng có một bit có trọng số thấp nhất hay còn gọi là bít nhẹ nhất đó là số nằm ở tận cùng bên phải (LSB – Least Significant bit). Nếu như bit có trọng số cao nhất là 0 thì số đó được hiểu là số dương. Còn nếu như bít có có trọng số cao nhất là 1 thì số được được hiểu là số âm. Bằng 0 hay bằng 1 là khi chúng ta biểu diễn số đó dưới dạng nhị phân. Các số âm trong máy tính được lưu ở dạng số bù 2 (Note: số bù 2 có được bằng cách đảo bít của một số nguyên và cộng với 1). Theo đó ta có được dải biểu diễn như sau : SỐ DƯƠNG : 00000000h hệ 16 – 0 hệ 10 00000001h hệ 16 – 1 hệ 10

Page 20: Cracking Voi Ollydbg

5

………………………………………….. 7FFFFFFFh hệ 16 – 2147483647 hệ 10 (Số dương lớn nhất) SỐ ÂM : FFFFFFFFh hệ 16 - -1 hệ 10 FFFFFFFEh hệ 16 - -2 hệ 10 …………………………………………. 80000000h hệ 16 - -2147483647 hệ 10 (Số âm nhỏ nhất) Tôi sẽ làm một ví dụ chuyển đổi sang số bù 2 để các bạn thấy được một cách trực quan nhất. Giả sử tôi có số dương là 1 , giờ tôi muốn biểu diễn số -1 tôi sẽ làm thế nào. ðể đơn giản tôi chỉ làm mẫu với số 16 bit. _ ðầu tiên ta tìm số bù 1 của 1 (có được bằng cách đảo bít) :

1. Biểu diễn 1 ở dạng nhị phân : 0000 0000 0000 0001 2. Tìm số bù 1 của 1 : 1111 1111 1111 1110

_ Tìm số bù 2 của 1 bằng cách lấy bù 1 đem cộng với 1 : 1. Theo kết quả ở trên, bù 1 của 1 : 1111 1111 1111 1110 2. Cộng với 1 : +1 3. Kết quả là số bù 2 : 1111 1111 1111 1111

ðem số bù hai này chuyển qua hệ Hex các bạn sé có được là : FFFFh Trong Olly chúng ta có thể giải quyết mọi vấn đề liên quan thông qua Plug-in : Command Bar. ðể sử dụng nó cũng rất đơn giản, bạn làm như hình minh họa dưới đây :

Rất trực quan và dễ hiểu, bạn không biết giá trị ở hệ 10 của 7FFFFFFFh là bao nhiêu. Trong Plug-in Command Bar bạn chỉ việc gõ ? và theo sau là biểu thức hay giá trị mà bạn cần biết thông tin. Ta thử thực hiện phép chuyển đổi với giá trị 80000000h xem sao? Như ta biết ở trên, giá trị 80000000h biểu diễn một số âm, nhưng khi sử dụng Command Bar để chuyển đổi thì kết quả ta có được không như những gì chúng ta mong đợi, đây là một bug của Plug-in Command Bar.

Chúng ta có thể giải quyết vấn đề này thông qua cửa số Register. Giả sử tại cửa số này tôi có giá trị thanh ghi EAX là 80000000h. Tôi muốn xem giá trị của nó ở hệ mười thì phải làm thế nào và giá trị âm dương của nó ra sao?

ðể làm được điều này, nhấn chuột phải lên thanh ghi EAX và chọn Modify.Như hình minh họa dưới đây :

Page 21: Cracking Voi Ollydbg

6

Cửa sổ Modify sẽ hiện ra cho phép chúng ta muốn thay đổi thanh ghi EAX thế nào tùy thích ☺. Trong trường hợp này kết quả của 80000000h đúng như những gì chúng ta trông đợi đó là -214783648.

Chúng ta thử sửa giá trị 80000000 đi và thay vào đó là một giá trị khác xem thế nào :

Ok, sau khi chỉnh sửa các bạn có thể lưu lại giá trị mà bạn đã chỉnh hoặc bỏ bằng cách nhấn Cancel. IV. Bảng mã ACSII Không phải mọi số liệu mà máy tính xử lý đều là các con số, các thiết bị ngoại vi như màn hình, bàn phím, máy in đều có xu hướng làm việc với kí tự.Cũng như tất cả mọi loại dữ liệu khác, các kí tự cần phải được biểu diễn thành dạng nhị phân để máy tính có thể xử lý chúng. Một kiểu mã hóa thông dụng nhất cho các kí tự đó là mã ASCII. Khi làm việc trong Ollydbg bắt buộc bạn cũng phải tìm hiểu sơ qua về bảng mã này. Bạn phải hiểu nó để có thể làm các bước chuyển đổi giữa kí tự ở dạng hex sang kí tự cũng như những symbols tương ứng. Dưới đây là bảng mã ACSII mà bạn có thể tham khảo :

Page 22: Cracking Voi Ollydbg

7

Một ví dụ với sự giúp đỡ của Plug-in Command Bar sẽ cho bạn thấy được kết quả trực quan :

Ngoài ra cửa sổ Dump trong Olly cũng giúp bạn có được những thông tin quan trọng trong quá trình bạn Debug target :

Page 23: Cracking Voi Ollydbg

8

V. STACK Như trong phần đầu tiên tôi đã nói sơ quan vế STACK, nó là một vùng của bộ nhớ dùng để lưu trữ tạm thời các dữ liệu và địa chỉ. Stack làm việc theo nguyên lý LIFO (Last In, First Out), tức là phần tử nào được cất vào cuối cùng trong stack sẽ là phần tử được lấy ra đầu tiên. Bạn cứ tưởng tượng như bạn đang xếp một chồng đĩa, thì chiếc đĩa cuối cùng mà bạn xếp sẽ nằm trên cùng, tức là đỉnh của Stack nó sẽ là chiếc đĩa được lấy ra đầu tiên nếu như bạn muốn lấy tiếp chiếc đĩa thứ hai bên dưới nó. Cấu trúc dữ liệu làm việc theo kiểu LIFO này là ý tưởng cho việc lưu trữ những dữ liệu tạm thời, hoặc những thông tin không cần thiết phải được lưu trữ trong một thời gian dài. Stack thường là nơi lưu trữ các local variables, những lời gọi hàm (function calls) và các thông tin khác được sử dụng để dọn dẹp stack sau khi một hàm hay một thủ tục được gọi. Một tính năng quan trọng khác của stack là nó grows down theo không gian địa chỉ: có nghĩa là càng nhiều dữ liệu được thêm vào trong stack, nó được thêm vào tại các giá trị địa chỉ thấp hơn theo cơ chế tăng dần. Xem hình minh họa về sơ đồ không gian bộ nhớ :

Làm việc với Stack có 2 thanh ghi chính là ESP và EBP, và các câu lệnh PUSH và POP. Trong Ollydbg bạn có thể quan sát thấy cửa sổ Stack rất trực quan :

Okie vậy là phần hai trong loạt bài viết về Olly đến đây là hết, trong phần tiếp theo tôi sẽ giới thiệu tới các bạn về các thanh ghi cũng như những tính năng của từng thanh ghi. Tôi sẽ cố gằng viết xong trong thời gian sớm nhất! ☺

Page 24: Cracking Voi Ollydbg

9

Best Regards _[Kienmanowar]_

--++--==[ Greatz Thanks To ]==--++-- My family, Computer_Angel, Moonbaby , Zombie_Deathman, Littleboy, Benina, QHQCrker, the_Lighthouse, Merc, Hoadongnoi, Nini ... all REA‘s members, TQN, HacNho, RongChauA, Deux, tlandn, light.phoenix, dqtln, ARTEAM .... all my friend, and YOU. --++--==[ Thanks To ]==--++-- iamidiot, WhyNotBar, trickyboy, dzungltvn, takada, hurt_heart, haule_nth, hytkl v..v.. các bạn đã đóng góp rất nhiều cho REA. Hi vọng các bạn sẽ tiếp tục phát huy ☺ I want to thank Teddy Roggers for his great site, Reversing.be folks(especially haggar), Arteam folks(Shub-Nigurrath, MaDMAn_H3rCuL3s) and all folks on crackmes.de, thank to all members of unpack.cn (especially fly and linhanshi). Great thanks to lena151(I like your tutorials). And finally, thanks to RICARDO NARVAJA and all members on CRACKSLATINOS.

>>>> If you have any suggestions, comments or corrections email me:

kienmanowar[at]reaonline.net

Page 25: Cracking Voi Ollydbg

1

INTRODUCTION TO THE CRACKING WITH OLLYDBG

FROM CRACKLATINOS

(_kienmanowar_)

I. Lời nói đầu Hà Nội trời lạnh nhưng cũng không thể át được không khí hừng hực lửa tại triển lãm Giảng Võ.Hàng nghìn con người hò hét, lắc giật xé tan bầu không khí lạnh lẽo. Sau một đêm “phê” cùng R0ck, toàn thân mệt nhoài, cổ đau đến hôm nay mới đỡ tôi lại tiếp tục dành thời gian để hầu tiếp các bạn phần ba trong loạt tut về Ollydbg. Phần ba này sẽ tập trung giới thiệu tới các bạn ý nghĩa của các thanh ghi, các cờ thường được sử dụng trong quá trình crack hay reverse chương trình. Tôi sẽ cố gắng đúc kết lại sao cho các bạn dễ dàng tiếp cận nhanh nhất có thể… 0k13! L3t’s R0ck w1th m3 ☺ II. Giới thiệu chung Thông tin được lưu giữ bên trong bộ vi xử lý trong các thanh ghi. Các thanh ghi được phân loại theo chức năng của chúng. Bộ vi xử lý dựa vào sự trợ giúp của các thanh ghi để thực thi một chương trình. Các thanh ghi được phân loại như sau : thanh ghi dữ liệu chứa dữ liệu cho một thao tác, thanh ghi địa chỉ chứa địa chỉ của lệnh hay của dữ liệu và thanh ghi trạng thái lưu trạng thái hiện thời của bộ vi xử lý. ðối với bộ xử lý 8086 có bốn thanh ghi dữ liệu công dụng chung, các thanh ghi địa chỉ được chia ra làm các thanh ghi đoạn, thanh ghi con trỏ, thanh ghi chỉ số; thanh ghi trạng thái còn được gọi là các cờ. Khi mới làm quen với các thanh ghi tôi khuyên bạn không nên học thuộc hết các chức năng của các thanh ghi liền một lúc, các bạn nên làm quen với các thanh ghi dần dần trong quá trình học cũng như trong lúc thực hành với Ollydbg. III. Chi tiết về các thanh ghi và công dụng 1. Thanh ghi ESP : Thanh ghi đầu tiên mà tôi muốn giới thiệu tới các bạn đó chính là thanh ghi ESP (con trỏ ngăn xếp – Stack pointer). Thanh ghi này luôn trỏ tới đỉnh hiện thời của ngăn xếp. Các bạn xem hình minh họa dưới đây :

Page 26: Cracking Voi Ollydbg

2

Như các bạn thấy trên hình, giá trị của thanh ghi ESP là 0x0013FFC4h, quan sát tại cửa sổ Stack các bạn sẽ thấy giá trị này đang nằm tại đỉnh của Stack.

Thanh ghi ESP trỏ tới địa chỉ vùng nhớ nơi mà thao tác stack tiếp theo sẽ được thực hiện. 2. Thanh ghi EIP : ðể truy cập đến các lệnh, 8086 sử dụng thanh ghi EIP (Instruction Pointer). ðây là một thanh ghi rất quan trọng, nó được cập nhật mỗi khi có một lệnh được thực hiện để sao cho nó luôn trỏ đến lệnh tiếp theo. Khác với các thanh ghi khác EIP không thể bị tác động trực tiếp bởi các lệnh, do đó trong một lệnh chúng ta sẽ thấy thường không có mặt thanh ghi EIP như một toán hạng. Ví dụ quan sát cửa sổ Registers trong Olly chúng ta thấy như sau :

Page 27: Cracking Voi Ollydbg

3

Chúng ta thấy rằng thanh ghi EIP mang giá trị là 0x00401000h, điều này có nghĩa là địa chỉ 0x00401000h chính là địa chỉ của câu lệnh tiếp theo sẽ được thực hiện. Chúng ta quan sát trên cửa sổ CPU sẽ thấy được câu lệnh tại địa chỉ trên là câu lệnh gì :

Tại cửa sổ CPU, chúng ta nhấn F8 để thực hiện câu lệnh đầu tiên tại địa chỉ 0x00401000h và quan sát trên cửa sổ Register xem thanh ghi EIP sẽ thay đổi giá trị như thế nào ? Chúng ta sẽ thấy được như sau :

Oh, giá trị thanh ghi đã thay đổi thành 0x00401002h, đó chính là địa chỉ của câu lệnh tiếp theo sẽ được thực hiện khi bạn quan sát trong màn hình CPU. 3. Thanh ghi EBP : ðây cũng là một thanh ghi không kém phần quan trọng, thanh ghi EBP (Con trỏ cơ sở - Base Pointer) chủ yếu được sử dụng để truy nhập dữ liệu trong ngăn xếp. Tuy nhiên khác với thanh ghi ESP, thanh ghi EBP còn được sử dụng để truy nhập dữ liệu trong các đoạn khác. Thanh ghi EBP thường được kết hợp với ESP khi chúng ta bắt gặp một lời gọi hàm, thì trước khi hàm này được thực hiện địa chỉ trở về của chương trình (tức là địa chỉ của câu lệnh tiếp theo dưới lời gọi hàm) sẽ được cất vào Stack, và bên trong thân hàm giá trị hiện thời của thanh ghi EBP sẽ được đẩy vào Stack, bởi vì giá trị của thanh ghi EBP phải được thay đổi để có thể tham chiếu tới các giá trị trên Stack.

Page 28: Cracking Voi Ollydbg

4

4. Các thanh ghi dữ liệu EAX, EBX, ECX, EDX: ðây là 4 thanh ghi đa năng 32 bit, điều đặc biệt là khi cần chứa dữ liệu 16 bit ta có các thanh ghi sau AX, BX, CX, DX và đặc biệt hơn khi ta cần chữa dữ liệu 8 bit thì các thanh ghi AX, BX, CX, DX này có thể phân tách ra thành 2 thanh ghi 8 bit cao và thấp để làm việc độc lập, đó là các thanh ghi AH và AL, BH và BL, CH và CL, DH và DL. Bốn thanh ghi này ngoài ý nghĩa là những thanh ghi công dụng chung thì nó còn mang những ý nghĩa và chức năng đặc biệt sau :

• Thanh ghi EAX (thanh ghi chứa) : thường được sử dụng trong các lệnh số học, logic và chuyển dữ liệu. Trong các thao tác nhân và chia thường sử dụng đến thanh ghi này.

• Thanh ghi EBX (thanh ghi cơ sở) : thanh ghi này cũng đóng vai trò là thanh ghi địa chỉ.

• Thanh ghi ECX (thanh ghi đếm) : thanh ghi này thường được sử dụng như một bộ đếm số lần lặp. Ngoài ra nó cũng được sử dụng như là biến đếm trong các lệnh dịch hay quay các bit.

• Thanh ghi EDX (thanh ghi dữ liệu) : thanh ghi này cùng với thanh ghi EAX tham gia vào thao tác của phép nhân hoặc phép chia. Bên cạnh đó nó cũng thường được sử dụng trong các thao tác vào ra.

5. Các thanh ghi chỉ số ESI, EDI : Hai thanh ghi ESI (chỉ số nguồn) và EDI (chỉ số đích) thường được sử dụng trong các thao tác làm việc với chuỗi hoặc mảng. Trong Ollydbg như các bạn đã làm quen trong các bài trước có một cửa sổ cho chúng ta quan sát trạng thái hiện thời của tất cả các thanh ghi, đó chính là cửa sổ Registers:

Page 29: Cracking Voi Ollydbg

5

Những thanh ghi này với chữ cái E ở đầu cho chúng ta biết được chúng là những thanh ghi 32 bits. Trong hình minh họa này các bạn thấy Ollydbg biểu diễn nội dung các thanh ghi ở dạng Hexa. Lấy thanh ghi EAX làm ví dụ, ta thấy giá trị của nó là 0x00000000h đây là giá trị nhỏ nhất của một thanh ghi, giá trị lớn nhất mà thanh ghi này có thể lưu trữ là 0xFFFFFFFFh, nếu như chúng ta chuyển nó sang dạng nhị phân thì chúng ta sẽ có được như sau :

Chúng ta thấy rằng khi chuyển sang dạng nhị phân sẽ biểu diễn đúng 32 bits, 32 bits này sẽ có thể mang một trong hai giá trị 0 hoặc 1. Tuy nhiên trong lập trình ASM không phải lúc nào chúng ta cũng sử dụng hết 32 bits, để tránh lãng phí chúng ta có thể thao tác, tính

Page 30: Cracking Voi Ollydbg

6

toán chỉ trên một phần của các thanh ghi này, trong trường hợp này của tôi tôi có thể chia nhỏ thanh ghi EAX ra. Ta sẽ làm một ví dụ cụ thể : Giả sử thanh ghi EAX tôi muốn thay đổi giá trị của nó thành là 0x12345678h. ðầu tiên ta load crackme vào trong Ollydbg, sau khi analyse xong chúng ta sẽ dừng lại tại EP (Entry Point) của chương trình. Bây giờ tôi sẽ thay đổi giá trị của thanh ghi EAX, chuột phải tại thanh ghi này và chọn Modify :

Chỉnh sửa lại giá trị của thanh ghi EAX như hình dưới đây :

Kết quả sau khi chỉnh sửa :

Page 31: Cracking Voi Ollydbg

7

Khi bạn thay đổi giá trị của một thanh ghi thì kết quả chỉnh sửa sẽ được đánh dấu màu đỏ. Như tôi đã nói ở trên nhiều khi chúng ta không sử dụng hết 32 bits trong quá trình tính toán mà ta chỉ cần một phần của nó thôi. Thông thường người ta thường sử dụng thanh ghi AX (16 bits) - một phần của thanh ghi EAX. Do AX là thanh ghi 16 bits nên nó chiếm ½ trên tổng số bits, vậy ta có giá trị của thanh ghi AX là 0x5678h. ðể biết được kết quả này có chính xác hay không, chúng ta sẽ sử dụng Command Bar :

ðúng như những gì chúng ta đã lập luận ở trên, giá trị của AX là 0x5678h. Tuy nhiên bản thân thanh chi AX cũng lại được phân tách thành các thanh ghi AH (8 bits cao) và AL (8 bits thấp). Ta thử quan sát giá trị của thanh ghi AL :

Tổng kết lại ta có một hình ảnh minh họa trực quan như sau :

Tất cả những thanh ghi đa năng khác cũng sẽ được phân tách tương tự như thanh ghi EAX. 6. Thay đổi giá trị của những thanh ghi : Ở phần trên, các bạn đã quan sát thấy quá trình thay đổi giá trị của một thanh ghi , ví dụ như thanh ghi EAX diễn ra rất đơn giản, gọn nhẹ. Cách thức thay đổi giá trị bằng cách nhấp chuột phải tại thanh ghi đó và chọn Modify. Chúng ta sẽ làm thêm một ví dụ nữa, như các bạn đã biết thanh ghi EIP được sử dụng để trỏ tới lệnh tiếp theo sắp được thực hiện, giờ đây tôi muốn thay đổi nội dung của thanh ghi này thì phải làm thế nào ? Giả sử khi ta load crackme vào trong Olly thì ta có được như sau :

Page 32: Cracking Voi Ollydbg

8

Trong hình minh họa này thì thanh ghi EIP mang giá trị là 0x00401000h, điều này có nghĩa là câu lệnh tại địa chỉ đó sẽ được thực hiện. Nhưng nếu ta muốn thay đổi giá trị EIP để cho chương trình sẽ thực hiện một câu lệnh ở địa chỉ khác chứ không phải là câu lệnh tại địa chỉ 0x00401000h thì làm thế nào? Rất đơn giản, chúng ta chỉ việc chọn dòng lệnh đó nhấn chuột phải và chọn New origin here, ngay lập tức giá trị của EIP sẽ thay đổi theo :

IV. Các cờ (Flags) hay được sử dụng Trong phần tiếp theo của bài viết này, chúng ta sẽ làm quen với các cờ. Trong cửa sổ Registers thì các cờ sẽ nằm bên dưới các thanh ghi ☺

Page 33: Cracking Voi Ollydbg

9

Trong hình trên bạn quan sát sẽ thấy có các cờ sau : C, P, A, Z, S, T, D và O.Thêm vào đó các bạn cũng thấy là các cờ này chỉ có 1 bit mà thôi do đó giá trị của nó chỉ có thể là 0 hoặc 1. Các cờ này được đặt trong thanh ghi cờ và chúng được phân chia ra thanh hai loại là cờ trạng thái và cờ điều khiển. Cờ trạng thái phản ánh kết quả của các phép tính. Cờ điều khiển được sử dụng để cho phép hoặc không cho phép một thao tác nào đó của bộ vi xử lý. Nói tóm lại là mỗi một thao tác của CPU đều dựa vào các cờ để ra quyết định. Chúng ta sẽ đi vào xem xét từng cờ một. a. Cờ trạng thái : Cờ tràn (Overflow Flag): Cờ OF = 1 khi xảy ra hiện tượng tràn, thường là khi kết quả là một số bù hai vượt ra ngoài giới hạn biểu diễn dành cho nó. ðể minh họa về cờ OF các bạn mở Ollydbg và load crackme vào. Sau đó tiến hành sửa giá trị của thanh ghi EAX = 0x7FFFFFFFh (giá trị của số dương lớn nhất), ta có được như sau :

Bây giờ chúng ta sẽ thực hiện cộng thêm 1 vào thanh ghi EAX, chúng ta sẽ nghĩ ngay đến rằng giá trị của thanh ghi EAX sau khi cộng một sẽ là 0x80000000h (giá trị này tương đương với số âm). ðể thực hiện được phép cộng này ta sẽ làm như sau : Chuột phải tại lệnh mà bạn muốn thay đổi và chọn Assemble.

Page 34: Cracking Voi Ollydbg

10

Ta có được như sau :

Thay câu lệnh Push 0 thành câu lệnh Add EAX, 1.

Sau khi thay đổi xong chúng ta quan sát kết quả thay đổi trên cửa sổ CPU.

Trước khi tôi và các bạn thực thi câu lệnh ADD EAX,1 – chúng ta sẽ quan sát giá trị của của cờ OF. Ta có được kết quả như sau :

Okie, lúc này giá trị của cờ tràn O vẫn đang là 0. Chúng ta sẽ thử thực thi câu lệnh Add EAX,1 xem thế nào. Nhấn F8 để thực thi lệnh và quan sát cửa sổ Registers :

Page 35: Cracking Voi Ollydbg

11

Note: nhận xét về tràn với số có dấu là nếu cộng 2 số cùng dấu mà kết quả có dấu ngược lại thì có tràn xảy ra. Khi ta cộng hai số khác dấu thì không bao giờ có tràn.

Cờ chẵn lẻ (Parity Flag): Cờ này phản ánh tính chẵn lẻ của tổng số bit 1 có trong kết quả. Cờ PF = 1 khi tổng số bit 1 trong kết quả là chẵn – parity chẵn.Nó bằng không trong trường hợp ngược lại.Lấy ví dụ cụ thể như sau. Chúng ta có thanh ghi EAX = 0x0h,cờ PF lúc đầu bằng 1, chúng ta sẽ thực hiện lệnh cộng EAX với 1 và xem kết quả giá trị trên cờ PF.

Sau khi thực hiện lệnh ta có được như sau :

Ok chúng ta thấy rằng PF đã bằng 0 bởi vì giá trị thanh ghi EAX = 1, mà tổng số bit 1 trong thanh ghi EAX lúc này là 1, vậy theo định nghĩa thì giá trị PF = 0 là hoàn toàn chính xác. Quay trở lại vấn đề, lúc này ta chuột phải tại địa chỉ 0x00401000 và chọn New Origin. Nhấn F8 để thực hiện lại câu lệnh. Chúng ta có được kết quả như sau :

Page 36: Cracking Voi Ollydbg

12

Ta vẫn thấy cờ PF giữ nguyên kết quả. ðó là bởi vì thanh ghi EAX có giá trị là 0x02 (tổng số bit 1 là lẻ). Lại làm như trên và thực hiện lại câu lệnh add EAX,1. Quan sát hình minh họa dưới đây :

Cờ Zero (Parity Flag): Cờ này được thiết lập 1 khi kết quả bằng không và ngược lại. Cờ này khá quan trọng đối với việc crack. ðể minh họa cho cờ này chúng ta vẫn sẽ sử dụng lệnh Add EAX, 1 nhưng lần này chúng ta sẽ thay lại giá trị của thanh ghi EAX thành 0xFFFFFFFF (-1).

Nhấn F8 để thực hiện câu lệnh add, ta sẽ có được thông tin như sau :

Khà khà, do kết quả của phép cộng thì thanh ghi EAX có giá trị là 0x0h cho nên cờ Z sẽ được bật lên thành 1. Cờ dấu (Sign Flag): Cờ SF được thiết lập là 1 khi bít msb của kết quả bằng 1 có nghĩa là kết quả âm nếu bạn muốn làm việc với số có dấu. Tôi sẽ minh họa về cờ SF như sau, trong Olly chúng ta thay giá trị của thanh ghi EAX thành 0xFFFFFFF8 (=-8). Thực hiện câu lệnh add eax, 1 để tính lại giá trị của thanh ghi EAX.

Page 37: Cracking Voi Ollydbg

13

Thực thi lệnh, kết quả của thanh ghi EAX sẽ là 0xFFFFFFFF9 (=-7) :

Cờ nhớ(Carry Flag): Cờ CF được thiết lập 1 khi có nhớ hoặc mượn từ bit msb. b.Cờ điều khiển Có 3 cờ được sử dụng trong việc điều khiển đó là cờ T. I và cờ D. Cờ T(cờ bẫy) bằng 1 thì CPU làm việc ở chế độ chạy từng lệnh –chế độ này thường được dùng khi cần tìm lỗi trong chương trình.) Cờ I (cờ ngắt) , cờ này bằng 1 thì CPU cho phép các yêu cầu ngắt được tác động. Cờ D (cờ hướng), cờ này bằng 1 khi CPU làm việc với chuỗi kí tự theo tứ tự từ phải sang trái.

Okie vậy là phần 3 đến đây là kết thúc, trong phần này tôi có tham khảo thêm một số tài liệu liên quan tới lập trình ASM. Các bạn có thể tham khảo thêm các tài liệu liên quan để có được một cái nhìn sâu hơn. Best Regards _[Kienmanowar]_

--++--==[ Greatz Thanks To ]==--++-- My family, Computer_Angel, Moonbaby , Zombie_Deathman, Littleboy, Benina, QHQCrker, the_Lighthouse, Merc, Hoadongnoi, Nini ... all REA‘s members, TQN, HacNho, RongChauA, Deux, tlandn, light.phoenix, dqtln, ARTEAM .... all my friend, and YOU. --++--==[ Thanks To ]==--++-- iamidiot, WhyNotBar, trickyboy, dzungltvn, takada, hurt_heart, haule_nth, hytkl v..v.. các bạn đã đóng góp rất nhiều cho REA. Hi vọng các bạn sẽ tiếp tục phát huy ☺

Page 38: Cracking Voi Ollydbg

14

I want to thank Teddy Roggers for his great site, Reversing.be folks(especially haggar), Arteam folks(Shub-Nigurrath, MaDMAn_H3rCuL3s) and all folks on crackmes.de, thank to all members of unpack.cn (especially fly and linhanshi). Great thanks to lena151(I like your tutorials). And finally, thanks to RICARDO NARVAJA and all members on CRACKSLATINOS.

>>>> If you have any suggestions, comments or corrections email me:

kienmanowar[at]reaonline.net

Page 39: Cracking Voi Ollydbg

1

INTRODUCTION TO THE CRACKING WITH OLLYDBG

FROM CRACKLATINOS

(_kienmanowar_)

I. Lời nói đầu Hà Nội trời lạnh quá, ngoài trời mưa phùn, quàng khăn đi găng tay cộng thêm cái mũ mà vẫn thấy lạnh. ðêm nay rảnh rỗi tôi lại tiếp tục phần bốn trong loạt tut về Ollydbg như đã hứa với các bạn. Trong bài viết trước tôi đã tập trung giới thiệu ý nghĩa của các thanh ghi, các cờ thường được sử dụng trong quá trình crack hay reverse chương trình, cũng như quan sát thấy các cờ thay đổi trạng thái như thế nào khi ta thực thi một câu lệnh có tác động đến cờ. Trong phần bốn này sẽ đề cập tới những câu lệnh Asm cơ bản, cách thức chúng thi hành. Như những gì chúng ta đã làm trong các phần trước, sẽ không có gì dễ hiểu hơn là khi tìm hiểu về một công cụ chúng ta tiến hành thực hành luôn trên công cụ đó để kiểm nghiệm những kiến thức mà chúng ta tiếp thu được trong quá trình đọc tài liệu. Tôi sẽ cố gắng đúc kết lại sao cho các bạn dễ dàng tiếp cận nhanh nhất có thể… 0k13! L3t’s R0ck w1th m3 ☺ II. Giới thiệu chung Tập lệnh của bộ vi xử lý có đến hơn trăm lệnh, trong đó có các lệnh được thiết kế dành riêng cho các bộ vi xử lý cao cấp. Trong bài viết này tôi chỉ đề cập đến những câu lệnh hay dùng nhất, chung nhất mà thôi. Việc cung cấp tất cả các lệnh vượt quá khuôn khổ cho phép của bài viết, cũng như tôi cũng không đủ sức để mà thực hiện điều này. Do đó việc tham khảo thêm các nguồn tài liệu khác để bổ sung thêm kiến thức là điều hết sức cần thiết cho các bạn. III. Chi tiết về các câu lệnh ASM hay dùng 1. NOP (No Operation) : Cái tên của nó đã cho bạn thấy được ý nghĩa. Lệnh này không thực hiện một công việc gì cả ngoại trừ việc tăng nội dung của thanh ghi EIP, nó không gây ra bất kì thay đổi nào trong thanh ghi, stack hoặc memory. Chính vì ý nghĩa này của nó mà câu lệnh này thường được dùng vào mục đích hủy bỏ bất kì câu lệnh nào (không cho lệnh đó thực hiện), bằng cách ta thay thế câu lệnh sắp thực hiện bằng lệnh NOP chương trình sẽ vẫn thực thi nhưng thay vì thực thi câu lệnh gốc thì giờ đây do được thay thế bằng NOP nên nó sẽ không làm gì cả. ðó là lý do tại sao các bạn hay thấy người ta sử dụng NOP (ví dụ như : tôi muốn loại bỏ một thông báo nào đó, để làm được điều này tôi thay thế lệnh Call đến thông báo bằng lệnh NOP, vậy là thông báo đó sẽ biến mất ☺ ). Okie, mở Cruehead crackme trong Olly, ta có như sau :

Page 40: Cracking Voi Ollydbg

2

Trong hình trên, mới đầu khi load vào Olly ta sẽ có được đoạn code gốc của chương trình đã được Olly phân tích sang ASM. Bây giờ chúng ta sẽ thay thế câu lệnh PUSH 0 như trên hình minh họa bằng lệnh NOP. Các bạn để ý vùng tôi khoanh đỏ, lệnh Push này có 2 bytes mà trong khi lệnh NOP chỉ có 1 byte mà thôi, vậy cho nên khi ta thay thế lệnh PUSH bằng lệnh NOP chúng ta sẽ thấy trên màn hình Olly xuất hiện 2 lệnh NOP. ðể có thể thay đổi một câu lệnh trong Olly, chúng ta làm như sau : chuột phải trên lệnh cần thay đổi và chọn Assemble(hoặc nhấn Space Bar).

Ngay lập tức một cửa sổ bật ra thông báo cho chúng ta biết chúng ta đang chuẩn bị thay đổi lệnh ở địa chỉ nào, và một textbox để cho phép ta nhập lệnh mà chúng ta muốn thay đổi :

Như các bạn thấy trên hình, bây giờ ta muốn thay lệnh PUSH 0 bằng lệnh NOP. Rất đơn giản ta xóa PUSH 0 đi và gõ vào NOP và nhấn Assemble.

Ở đây chúng ta nhận thấy rằng Olly ngoài việc sẽ thay thế bằng lệnh NOP, chương trình này còn nhận biết được rằng lệnh PUSH 0 trước khi thay thế là một câu lệnh 2 bytes cho nên nó sẽ tự động điền thêm một lệnh NOP ở địa chỉ 0x00401001 cho vừa đủ. So sánh lại với hình trước thì các bạn thấy rằng lệnh PUSH 0 đã hoàn toàn được thay thế bằng 2 lệnh NOP, 2 lệnh này sẽ không thực hiện bất kì công việc gì. ðể kiểm chứng bạn nhấn F8 để trace lần lượt qua 2 lệnh NOP này và quan sát các cửa sổ xem có sự thay đổi gì không.Oh, các thanh ghi không thay đổi, stack cũng không biến chuyển, các cờ vẫn bình thường chỉ có mỗi một thay đổi xảy ra đó là với thanh ghi EIP (điều này là hiển nhiên rồi vì thanh ghi EIP sẽ luôn trỏ tới câu lệnh tiếp theo được thực hiện). Tiếp theo chúng ta sẽ quan sát sự thay đổi của 2 bytes này trong cửa sổ Dump, để tìm chúng ta sẽ tìm kiếm theo địa chỉ chứa hai lệnh này. Như các bạn thấy ở trên đó là 0x00401000 và 0x00401001. Chúng ta tới cửa sổ DUMP, chuột phải và chọn như sau :

Page 41: Cracking Voi Ollydbg

3

Một cửa sổ hiện ra, tại đây ta gõ vào : 00401000 và nhấn OK.

Kết quả ta có được như sau :

Olly sẽ biểu diễn những gì chúng ta thay đổi bằng màu đỏ, trong hình trên chúng ta thấy có 2 mã lệnh 90 90 tương đương với 2 lệnh NOP NOP. Tiếp theo đó là E8 FF .. tương đương với câu lệnh CALL như các bạn quan sát thấy trong hình bên trên. Có một câu hỏi nhỏ đặt ra : Tôi có thể loại bỏ những gì tôi vừa thay đổi và quay trở lại đoạn code gốc được không ? Hoàn toàn có thể được, Olly hỗ trợ cho chúng ta chức năng Undo.ðể làm điều này thì trong cửa sổ Dump hoặc cửa số CPU chúng ta chỉ việc đánh dấu những bytes mà chúng ta đã thay đổi, nhấn chuột phải và chọn như trong hình dưới đây :

Sau khi làm đúng như trên, bạn sẽ có được lệnh PUSH 0 ban đầu :

Page 42: Cracking Voi Ollydbg

4

Quan sát tại cửa sổ DUMP, chúng ta có được như sau :

Y34h! Với lệnh NOP thế là quá đủ! Chúng ta chuyển sang các lệnh liên quan đến STACK.

2. Các lệnh liên quan đến STACK : Trong các phần trước chúng ta đã tìm hiểu về chức năng cơ bản của STACK rồi, phần này tôi sẽ đề cập đến các lệnh làm việc với STACK mà cụ thể ở đây là lệnh PUSH (đẩy dữ liệu vào Stack) và POP (lấy dữ liệu ra khỏi Stack). 2.a. Lệnh PUSH Về cơ bản lệnh PUSH được dùng để thêm/cất 1 từ (Word (letters hoặc value)) vào trong ngăn xếp. Như các bạn thấy trong Olly câu lệnh đầu tiên của Cruehead crackme là PUSH, cụ thể trong trường hợp này là PUSH 0.Khi chúng ta thực hiện câu lệnh này thì điều gì sẽ xảy ra, nó sẽ đẩy 0 vào đỉnh của Stack sau đó giảm thanh ghi ESP tuy theo kích thước của toán hạng. Quan sát cửa số Stack trước khi chúng ta thực thi câu lệnh PUSH.Lưu ý giá trị của thanh ghi ESP có thể khác nhau tùy theo từng máy.

Okie, ban đầu khi chưa thực hiện câu lệnh gì thì cửa sổ Stack của tôi giống như hình minh họa ở trên.ðây là những giá trị khởi tạo ban đầu của Stack do đó trên máy của bạn có thể khác máy của tôi chứ không nhất thiết phải giống nhau hoàn toàn.Bây giờ tôi sẽ thực hiện câu lệnh PUSH bằng cách nhấn F8 để trace qua câu lệnh này, ngay lập tức các bạn sẽ thấy được sự thay đổi :

Page 43: Cracking Voi Ollydbg

5

Như các bạn thấy giá trị tại đỉnh của Stack đã thay đổi là 0x0013FFC0 và tại đây lưu trữ giá trị 0x0 do câu lệnh PUSH thực hiện. Bạn hãy tưởng tượng như chúng ta có 1 chồng đĩa có sẵn, giờ ta muốn cất thêm một cái đĩa lên trên chồng đĩa này thì ta phải tịnh tiến chồng đĩa đi để dành ra một khoảng không gian cho ta đặt cái đĩa mới, sau khi có được khoảng không gian vừa đủ ta chỉ việc đặt cái đĩa mới lên trên. Vậy là khi chúng ta muốn lấy đĩa ra thì cái đĩa mới được cất vào sẽ được lấy ra đầu tiên. Thanh ghi liên quan trực tiếp đến Stack là ESP, thanh ghi này luôn trỏ vào đỉnh của Stack. Quan sát tại cửa sổ Registers chúng ta thấy được như sau :

Có nhiều cách thức để đẩy dữ liệu vào Stack chứ không đơn thuần như chúng ta thấy ở trên. Ví dụ nếu như tôi thực hiện câu lệnh PUSH EAX, thì lệnh này sẽ đẩy giá trị của thanh ghi EAX vào đỉnh Stack. Chúng ta sẽ tìm hiểu thêm sự khác nhau giữa câu lệnh PUSH và PUSH []. Giá sử tôi có câu lệnh PUSH 401008. Khi thực hiện câu lệnh này nó sẽ đẩy 401008 vào đỉnh của Stack. Quan sát hình minh họa dưới đây :

Thực hiện lệnh PUSH, quan sát trên stack :

Tuy nhiên nếu như tôi thực hiện câu lệnh PUSH [401008] thì điều gì sẽ xảy ra trên Stack? Lệnh này sẽ đẩy nội dung của bộ nhớ tại 401008 vào đỉnh của Stack, chúng ta sẽ quan sát cửa sổ DUMP xem tại 401008 lưu trữ giá trị gì.

Page 44: Cracking Voi Ollydbg

6

Chúng ta thấy được giá trị là CA 20 40 00. Khi cất vào stack nó sẽ được đảo ngược lại thành 004020CA, giống như dòng Comment như bạn quan sát thấy ở hình bên trên. Nhấn F8 để thực hiện lệnh PUSH và quan sát kết quả trên Stack.

2.b. Lệnh POP Lệnh POP có ý nghĩa hoàn toàn ngược lại với lệnh PUSH.Nó được sử dụng để lấy ra phần tử (giá trị) từ đỉnh của Stack và đặt vào một nơi mà chúng ta chỉ đỉnh để nhận giá trị được lấy ra.Lấy ví dụ, ta thực hiện câu lệnh POP EAX, điều này có nghĩa là chúng ta sẽ lấy giá trị tại đỉnh của Stack và lưu nó vào thanh ghi EAX, đồng thời giá trị tại đỉnh của Stack sẽ được thay đổi để trỏ tới phần tử tiếp theo. Lấy một ví dụ minh họa, ta thay thế lệnh PUSH 0 bằng lệnh POP EAX :

Giá trị tại đỉnh của Stack trước khi thực hiện lệnh POP :

Giá trị của thanh ghi ESP đang trỏ vào đỉnh của stack, giá trị của thanh ghi EAX lúc chưa thực hiện POP :

Page 45: Cracking Voi Ollydbg

7

Bây giờ chúng ta nhấn F8 để trace và thực hiện lệnh POP EAX.Quan sát cửa số Stack và cửa sổ Registers chúng ta có được kết quả như sau :

Ok, như vậy là các bạn đã có cái nhìn tổng quan về 2 lệnh PUSH và POP.Ta chuyển sang lệnh khác đó là hai lệnh PUSHAD và POPAD, đây là hai lệnh không kém phần quan trọng. Tại sao ta phải lưu ý tới câu lệnh này, lý do đơn giản đó là hai câu lệnh này thường được sử dụng để nhận biết các packers có cơ chế thực hiện gần giống với một Packer nổi tiếng mà có thể các bạn đã biết hoặc đã từng nghe tới đó là : UPX. 2.c. Lệnh PUSHAD Lệnh PUSHAD khi thực hiện sẽ lưu tất cả nội dung của các thanh ghi vào trong Stack. Vì vậy có thể nói lệnh PUSHAD sẽ tương đương với một loạt các câu lệnh Push như sau : PUSH EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI. Chúng ta sẽ quan sát câu lệnh này trong Olly, load crackme vào và thay câu lệnh Push 0 bằng lệnh PUSHAD.

Quan sát cửa sổ Stack và cửa sổ Registers trước khi thực hiện lệnh :

Page 46: Cracking Voi Ollydbg

8

Nhấn F8 để thực hiện lệnh, đồng thời quan sát cửa sổ Stack các bạn sẽ thấy được như sau :

Theo hình minh họa trên các bạn thấy rằng các thanh ghi lần lượt được đẩy vào Stack theo thự tự từ EAX cho tớ EDI. Vậy giá trị của EDI sẽ nằm ở đình của Stack và lúc này ESP sẽ có giá trị là đỉnh của Stack : 0x0013FFA4. 2.d. Lệnh POPAD Lệnh POPAD thực hiện nhiệm vụ ngược lại với những gì lệnh PUSHAD đã thực hiện.Nó sẽ lấy giá trị tại Stack và cất vào các thanh ghi theo thứ tự từ EDI về EAX. Chính vì vậy câu lệnh này sẽ tương đương với : POP EDI, ESI, EBP, ESP, EBX, EDX, ECX, EAX. Quan sát minh họa bằng Olly sẽ cho bạn thấy một cách trực quan :

Page 47: Cracking Voi Ollydbg

9

Các giá trị tại Stack :

Nhấn F8 để thực hiện lệnh POPAD. Quan sát tại cửa sổ Registers chúng ta thấy được giá trị của các thanh ghi đã được phục hồi :

Qua đây ta có thể rút ra một kết luận nho nhỏ là cặp lệnh PUSHAD và POPAD thường đi cùng với nhau. Nếu như ta thấy ở đâu đó trong mã của chương trình xuất hiện lệnh PUSHAD thì có nghĩa là đâu đó ở bên dưới chắc chắn sẽ có câu lệnh POPAD. 3. Câu lệnh MOV Lệnh MOV được sử dụng để chuyển dữ liệu giữa các thanh ghi, giữa một thanh ghi và một ô nhớ hoặc chuyển trực tiếp một số vào một thanh ghi hay ô nhớ.Một ví dụ minh họa : MOV EAX, EBX. Khi câu lệnh này thực thi nó sẽ chuyển dữ liệu của thanh ghi EBX tới thanh ghi EAX, quan sát trên Olly các bạn sẽ thấy như sau :

Page 48: Cracking Voi Ollydbg

10

Trên cửa sổ Registers chúng ta quan sát thấy giá trị của 2 thanh ghi EAX và EBX trước khi thực hiện lệnh như sau :

Okie, ta nhấn F8 để thực hiện câu lệnh MOV EAX, EBX và quan sát sự thay đổi giá trị của thanh ghi EAX tại cửa sổ Registers :

ðiều này khiến bạn liên tưởng tới ngôn ngữ lập trình bậc cao khi chúng ta thực hiện một câu lệnh gán A:=B. Ở đây EAX được gán cho giá trị của EBX. Ở ví dụ này các bạn sẽ thấy EAX lưu trữ dữ liệu giống hệt EBX, tuy nhiên trong một vài trường hợp đặc biệt tôi chỉ muốn lấy một phần giá trị thôi thì thế nào? Câu lệnh MOV cũng hỗ trợ các bạn thực hiện việc này. Lấy ví dụ cụ thể, tôi thực hiện cậu lệnh MOV AL, CL :

Nhấn F8 thực hiện câu lệnh MOV AL, CL. Quan sát cửa sổ Registers bạn sẽ thấy như hình minh họa dưới đây :

Ngoài việc chuyển dữ liệu qua lại giữa các thanh ghi như những gì các bạn đã nhìn thấy và quan sát ở trên chúng ta còn có lệnh MOV dùng để chuyển nội dung của một ô nhớ vào một thanh ghi.Chẳng hạn chúng ta sẽ thực hiện câu lệnh bên dưới đây :

Page 49: Cracking Voi Ollydbg

11

Trong trường hợ này thì nội dung của 405000 sẽ được chuyển vào thanh ghi EAX.Cụm từ DWORD như các bạn nhìn thấy ở trên có nghĩa là toàn bộ 4 bytes tại ô nhớ trên sẽ được chuyển vào EAX.Bây giờ chúng ta vào cửa sổ DUMP và quan sát xem tại 405000 có giá trị như thế nào :

Như ta thấy, tại 405000 là 00 10 00 00, khi thực hiện câu lệnh MOV thì EAX sẽ giữ giá trị là 00001000. Nhấn F8 thực thi lệnh và kiểm tra kết quả :

Bây giờ chúng ta thử thực hiện ngược lại và chuyển dữ liệu của một thanh ghi vào ô nhớ xem thế nào.Giả sử tôi muốn thực hiện lệnh : MOV DWORD PTR DS:[40500], ECX.

Page 50: Cracking Voi Ollydbg

12

F8 thực hiện lệnh MOV, ặc chương trình bị terminate ngay lập tức. Không có lý do gì mà câu lệnh này không thể thực hiện được? Vậy tại sao lại thế ?

Câu trả lời hết sức đơn giản là chúng ta không có quyển ghi tại ô nhớ đó. ðể kiểm tra xem có đúng không ta nhấn Alt + M để mở cửa sổ memory và thấy được như sau :

Vây là đã rõ tại 405000 chúng ta chỉ có quyển Read mà thôi, chính vì vậy khi chúng ta thực hiện lệnh MOV liền bị terminate chương trình ngay lập tức ☺. Nếu như tôi muốn chuyển 2 bytes hay 1 bytes dữ liệu của một ô nhớ vào một thanh ghi thì ta có thể dùng WORD và BYTE trong câu lệnh MOV. Ví dụ tôi có lệnh sau đây : MOV AX, WORD PTR DS:[405008]

Tại sao ở đây chúng ta không sử dụng thanh ghi EAX đó là vì ở đây chúng ta chỉ muốn lấy 2 bytes (16 bit) thôi nên phải sử dụng thanh ghi AX là thanh ghi 16 bits. ðiều này cũng đã được qui định bởi lệnh MOV : toán hạng đích và gốc có thể tìm được theo các chế độ địa chỉ khác nhau nhưng phải có cùng độ dài và không được phép đồng thời là 2 ô nhớ hoặc 2 thanh ghi đoạn. Ok ta chuyển qua cửa sổ DUMP và xem nội dung của ô nhớ 405008 :

Nhấn F8 để thực hiện câu lệnh MOV và quan sát thanh ghi AX ta có được kết quả như sau :

Giờ chúng ta muốn lấy 1 bytes thì thay thế thanh ghi AX bằng thanh ghi AL. Do đó câu lệnh MOV sẽ là như sau : MOV AL, BYTE PTR DS:[405008]

Vậy khi thực hiện lệnh MOV thanh ghi AL sẽ nhận giá trị như hình minh họa dưới đây :

Page 51: Cracking Voi Ollydbg

13

4. Câu lệnh MOVSX Câu lệnh này sẽ thực hiện sao chép nội dung của toán hạng thứ hai, có thể là thanh ghi hoặc ô nhớ (với điều kiện toán hạng thứ hai phải có độ dài nhỏ hơn toán hạng thứ nhất) vào toán hạng thứ nhất đồng thời sẽ điền đầy các bit bên trái của toán hạng thứ nhất bằng bít có trọng số cao nhất của toán hạng thứ hai.Chúng ta sẽ lấy ví dụ cụ thể để minh họa, giả sử trong Olly chúng ta bắt gặp lệnh sau :

ðể biết nội dung của 2 thanh ghi EAX và BX trước khi thực hiện câu lệnh trên sẽ như thế nào ta có thể nhờ cậy đến cửa sổ Tip Window.Cửa sổ này sẽ cho chúng ta thông tin chi tiết :

OK thanh ghi EAX là 0x0 còn BX là 0xF000.Bây giờ chúng ta nhấn F8 để thực hiện lệnh và quan sát trên cửa sổ Registers :

Như trên ta thấy rằng nội dung của BX đã được sao chép sáng AX và điền phần còn lại với giá trị là FFFF, đó là bởi vì thanh ghi BX nếu xét cụ thể thì nó biểu diễn cho số âm, mà số âm thì bít có trọng số cao nhất sẽ là 1. Do đó số 1 này sẽ được điền hết vào trong thanh ghi EAX như các bạn đã thấy trên hình. Nếu như thanh ghi BX biểu diễn một số dương chẳng hạn 0x1234 thì thanh ghi EAX sẽ có giá trị như sau : 0x00001234. ðể chứng mình ta giả sử thanh ghi EBX biểu diễn một số dương là 0x7FFF vậy khi thực hiện lệnh MOV ta sẽ được như sau :

Page 52: Cracking Voi Ollydbg

14

Nếu BX là 0x8000 thì thanh ghi EAX sẽ có giá trị là 0xFFFF8000.

5. Câu lệnh MOVZX Lệnh này cũng tương tự như lệnh MOVSX, nhưng thay vì phụ thuộc vào bít dấu thì phần bên trái luôn luôn được điền đầy bằng những con số 0. Bạn tự kiểm chứng trong Olly nhé ☺. 6. Câu lệnh LEA Lệnh này cũng tương tự như lệnh MOV nhưng khác ở chỗ toán hạng đầu tiên thường là các thanh ghi công dụng chung còn toán hạng thứ hai là một ô nhớ.Câu lệnh này thực sự rất hữu dụng khi ô nhớ này tương ứng với một phép tính toán trước đó. Lấy một ví dụ trực quan trong Olly :

Quan sát cửa sổ Registers để thấy được giá trị hiện thời của các thanh ghi khi chưa thực hiện lệnh :

Trong trường hợp tại máy của tôi thì giá trị thanh ghi ECX là 0x0013FFB0, mà trong lệnh trên tôi cho thanh ghi ECX + 38 vậy tức là tôi sẽ có giá trị = 0x0013FFE8. Nếu hiểu như lệnh MOV bạn sẽ nghĩ là nó sẽ chuyển dữ liệu tại ô nhớ có giá trị ở trên vào thanh ghi EAX nhưng ở đây thì không phải như thế. Nó sẽ nạp giá trị của ECX + 38 vào thanh ghi EAX, kết quả cuối cùng là thanh ghi EAX sẽ có giá trị là 0x0013FFE8. Lập luận là như vậy, bây giờ ta thử nhấn thử F8 để thực hiện lệnh và kiểm tra kết quả xem có chính xác hay không ☺

Trong quá trình làm việc nhiều với các chương trình các bạn sẽ hiểu rõ hơn về lệnh LEA.

Page 53: Cracking Voi Ollydbg

15

7. Câu lệnh XCHG Câu lệnh này còn được gọi là lệnh tráo đổi nội dung của hai toán hạng. Lệnh XCHG được dùng để hoán chuyển nội dung của hai thanh ghi, thanh ghi và một ô nhớ.Chúng ta thử kiểm tra bằng ví dụ trong Olly, tôi có một lệnh đơn giản như sau :

Nhìn vào câu lệnh trên các bạn hoàn toàn có thể suy ra ngay được kết quả của câu lệnh này sau khi thực hiện ☺. Thanh ghi EAX sẽ mang giá trị của ECX và ngược lại.

Cũng tương tự trong trường hợp câu lệnh MOV, bạn cũng không thể thực hiện lệnh XCHG giữa thanh ghi và một ô nhớ nếu như ô nhớ đó không có quyền ghi mà chỉ có quyển đọc.

Tôi thử thực hiện câu lệnh XCHG ở trên, câu lệnh này không thực hiện được và tôi nhận được một Exception :

Okie tôi nghĩ đến đây là đã đủ cho một bài viết và phần 4 về Ollydbg xin được kết thúc tại đây, trong phần này tôi có tham khảo thêm một số tài liệu liên quan tới lập trình ASM. Tôi tin là với những ví dụ minh họa trực quan như ở trên các bạn sẽ nắm được vấn đề nhanh hơn.Tuy nhiên câu lệnh của ASM không phải chỉ có thế,các bạn có thể tham khảo thêm các tài liệu liên quan để có được một cái nhìn sâu hơn. Hẹn gặp lại các bạn trong phần 5 của loạt bài viết về Olly, By3 By3!! ☺

Page 54: Cracking Voi Ollydbg

16

Best Regards _[Kienmanowar]_

--++--==[ Greatz Thanks To ]==--++-- My family, Computer_Angel, Moonbaby , Zombie_Deathman, Littleboy, Benina, QHQCrker, the_Lighthouse, Merc, Hoadongnoi, Nini ... all REA‘s members, TQN, HacNho, RongChauA, Deux, tlandn, light.phoenix, dqtln, ARTEAM .... all my friend, and YOU. --++--==[ Thanks To ]==--++-- iamidiot, WhyNotBar, trickyboy, dzungltvn, takada, hurt_heart, haule_nth, hytkl v..v.. các bạn đã đóng góp rất nhiều cho REA. Hi vọng các bạn sẽ tiếp tục phát huy ☺ I want to thank Teddy Roggers for his great site, Reversing.be folks(especially haggar), Arteam folks(Shub-Nigurrath, MaDMAn_H3rCuL3s) and all folks on crackmes.de, thank to all members of unpack.cn (especially fly and linhanshi). Great thanks to lena151(I like your tutorials). And finally, thanks to RICARDO NARVAJA and all members on CRACKSLATINOS.

>>>> If you have any suggestions, comments or corrections email me:

kienmanowar[at]reaonline.net