Tải bản đầy đủ (.pdf) (236 trang)

Hướng dẫn sử dụng ollydbg bẻ khóa phần mềm

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (12.89 MB, 236 trang )

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 C racklatinos (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 ☺

1


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 :

2


C họ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 :

3


C hắ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 :

4


Ở đâ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.

C uối cùng có một cửa sổ nằm bên dưới cửa sổ Disassembler Window : C hú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ể ở

5


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 C rackme vào trong Olly, ta sẽ được như sau :

6


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


7


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 :

8


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 :

9


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.C hú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 :

C hú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 :

10



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 :

11


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 :

12


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.

13



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 C all 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 C all 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 : C ho 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 :

14



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 C rackme 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, C omputer_Angel, Moonbaby , Zombie_Deathman, Littleboy, Benina, QHQC rker,
the_Lighthouse, Merc, Hoadongnoi, Nini ... all REA‘s members, TQN, HacNho, RongC hauA,
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

15



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á

1


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 :

2


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.

3


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

4


…………………………………………..
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 :

5



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 :

6


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 :

7


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! ☺

8


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

9


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 :

1


×