# Trung tâm xử lý sự cố > Hỏi-Đáp về Lỗi Windows >  phần mềm OllyDbg

## blogwhey1

có bạn nào biết cách sủ dụng phần mềm ollydbg :ermm:

----------


## conghung999

sử dụng ollydbg, ## cơ bản ## 
copyright by moonbaby - rea.fareastking.com 


i - giới thiệu : 

- ollydbg hay gọi tắt là olly, là một chương trình debugger dễ sử dụng, trực quan . thích ứng cho mọi cấp độ cracker khác nhau. 
- có thể nói olly bao hàm rất nhiều tính năng mà nếu sử dụng riêng lẻ ta phải cần đến nhiều chương trình kết hợp lại . hiện nay olly đã có version 1.0 
- phần hướng dẫn sử dụng olly này bao gồm ba phần : 
*** phần i : cài đặt và cấu hình olly 
*** khần ii : tổng quan về olly 
*** phần iii : sử dụng olly 

ii – cài đặt và cấu hình olly 

- olly không cần cài đặt, khi load về ta chỉ việc bung nén vào trong một thư mục là đã có thể sử dụng olly. tuy nhiên, để có thể sử dụng thêm một số chức năng của olly ta cần phải cấu hình thêm và tìm thêm một số plugins được viết riêng cho chương trình. 
- bạn có thể load olly từ trang chủ http://home.t-online.de/home/ollydbg hay từ http://moonbaby.envy.nu/002-tools/olly với các plugin và cấu hình định sẵn. 
- sau khi unzip olly vào thư mục ( chẳng hạn ollydbg ) bạn sẽ thấy có một thư mục định sẵn plugins, bạn cần tạo thêm một thư mục nữa là udd. đồng thời nếu bạn tải olly về từ trang chủ sẽ không có file ollydbg.ini ( file này lưu giữ cấu hình của olly ), nhưng khi bạn chạy olly lần đầu tiên thì chương trình sẽ tạo file này cho bạn. 
- khởi động olly lên, bạn chọn options --> appearance --> directories. ở đây bạn sẽ thấy hai đường dẫn là udd path và plugin path, bạn hãy chọn đường dẫn về thư mục của olly. sau đó chương trình yêu cầu bạn khỏi động lại để chập nhận chỉnh sửa. 
- sau khi khởi động lại bạn sẽ nhìn thấy trên thanh công cụ chính của olly xuất hiện thêm một mục mới plugins. 
- khi bạn tải olly từ trang web http://moonbaby.envy.nu/002-tools/olly, trong này đã có sẵn file ollydbg.ini, một số plugins cần thiết và đã được cấu hình sẵn cho bạn các số thông số về màu sắc, màu nền cũng như một số các tuỳ chọn khác. khi bạn tải olly về từ trang chủ thì khi khởi động chương trình màu sắc của olly sẽ trông không được đẹp. để chỉnh sửa mà sắc bạn chọn options --> appearance, trong cửa sổ này bạn vào từng mục và chọn màu sắc, font và kích thước chữ, màu nền, màu highline ..... sau đó khởi động lại olly để kích hoạt thay đổi. 
- khi đã quen thuộc với olly, bạn nên vào phần help để tìm hiểu thêm và cấu hình olly theo ý của bạn. song nếu bạn mới bắt đầu sử dụng olly, tôi khuyên bạn nên sử dụng cấu hình định sẵn khi bạn tải về từ http://moonbaby.envy.nu/002-tools/olly 

iii – tổng quan về olly : 

olly có thể chia thành 5 cửa sổ chính . để chuyển đổi qua lại giữa các cửa sổ này ta dùng phím tab. và phím shift-tab sẽ chuyển về cửa sổ trước đó. 

iii.1 - cpu : 

- hầu hết thời gian chúng ta tập trung vào đây. cửa sổ này chia làm 4 ô nhỏ. ta xét từ trái sang phải : 
** ô thứ nhất : hiển thị địa chỉ của code. khi ta double-click vào nó thì ngay dòng chúng ta double-click vào sẽ đổi thành “ $ == > “, bên trên nó sẽ là “ $ - x “ và bên dưới sẽ là “ $ + x “. các giá trị “ x “ này chính là số byte của câu lệnh. 
** ô thứ hai : chính là mã lệnh. khi ta double-click vào nó thì có nghĩa ta đặt breakpoint tại đó. và khi double-click lần nữa thì xoá bỏ điểm đặt breakpoint này. 
** ô thứ ba : code assembler. đây là ô rất quan trọng trong suốt quá trình trace code. khi ta double-click vào nó thì sẽ hiện lên ô “assemble at ******xx”, chúng ta có thể sửa code của chương trình thông qua ô này. 
** ô thứ tư : hiển thị thông tin của chương trình. chúng ta sử dụng ô này để tìm các chuỗi đặt biệt. và khi chúng ta chuyển sang cửa sổ “text string reference” thì mọi thông tin của cửa sổ này chính là thông tin của ô này. khi ta double-click vào nó thì sẽ hiện lên ô “ add comment at ******xx” cho chúng ta ghi chú lại thông tin, chú giải cần thiết để sử dụng cho lần sau. 

iii.2 - registers [fpu, mmx, 3dnow!] : 

- cửa sổ thứ hai nằm bên phải cửa sổ thứ nhất. 
- hiển thị các thanh ghi và cờ trong assembly. cửa sổ này cần thiết để chúng ta theo dõi sự thay đổi giá trị của các thanh ghi, các lệnh toán học …. 

iii.3 - cửa số thứ ba : 

- cửa sổ nhỏ nằm ngay bên dưới của sổ thứ nhất. 
- thông báo cho ta biết địa chỉ thực, giá trị tính toán, ... trước khi đưa vào hiển thị ở cửa sổ thứ hai. 
- trong cửa sổ này, khi ta right click vào một dòng thì có thể xuất hiện cửa sổ phụ với các tùy chọn ( tối đa là 4 tuỳ chọn ) modify data, follow address in dump, follow value indump và appearance. 
- tuy nhiên phải ghi nhớ một điều, thông số xuất hiện trong cửa sổ này là giá trị của dòng lệnh trong cửa sổ thứ nhất khi ta trace tới. còn khi ta dò thì không xuất hiện thông số trong cửa sổ này 
*** modify data : khi chọn mục này sẽ xuất hiện cửa sổ modify dword at ***xx với ba giá trị là hexadecimal, signed và unsigned. ưu điểm của của sổ này là trong một số trường hợp ta có thể xem được số serial thực của chương trình. 
*** follow address in dump : chuyển cửa sổ thứ tư đến địa chỉ mà ta chọn. rất cần thiết khi ta cần xem xét giá trị của chương trình được lưu tại địa chỉ này 
*** follow value indump : chuyền cửa sổ thứ tư đến giá trị của địa chỉ mà ta chọn. 
*** appearance : thông báo về các tùy chọn trong options --> appearance . 

iii.4 - address, hex dump, ascii hay unicode 

- cửa sổ thứ tứ nằm bên dưới cửa sổ thứ ba . 
- cần thiết để ta quan sát sự thay đổi các giá trị tính toán của chương trình. 
- trong một vài trường hợp ta có thể tìm thấy chuỗi serial ở đây. 

iii.5 - stack 

- cửa sổ thứ năm nằm bên dưới của sổ thứ hai và ngay bên phải cửa sổ thứ ba. 
- đây là bộ nhớ tạm của chương trình. 
- các thông số của một hàm trước khi xử lý sẽ được lưu tạm vào trong stack này. theo dõi chặt chẽ sự thay đổi các vùng nhớ và giá trị của cửa sổ này sẽ giúp ích rất nhiều trong quá trình tìm ra chuỗi serial thực. 

--------------------------------------------------------- 




install, run and write a script in olldg 

thưa các bạn. đặc biệt cho newbie. 
như các bạn thấy đó, khi chúng ta học crack , đa số các phần mềm bây giờ thường được pack bằng một packer nào đó . nhưng chúng ta là newbie thì ko biết unpack như thế nào. thường thì chúng ta tìm một unpacker để unpack . nếu ko có thì chúng ta phải học các tut mup , còn gọi là các tut unpack ‘bằng tay’ rồi thực hành theo để unpack các phần mềm chúng ta muốn crack. các tut mup dạy cho chúng ta các bước sau: 
-find oep 
-dump chương trình trong bộ nhớ bắt đầu tại oep vừa tìm được ra 1 file 
-fix iat 
-sau đó là rebuild pe. 
(oep,iat,pe... là gì hôm nào rãnh tui tổng hợp cho các bạn) 
thường thường đối với một lọai packer, chúng ta tìm oep giống nhau cho các chương trình bị pack bằng packer đó. khi các bạn biết cách tìm oep rồi thì công việc này thật nhàm chán. vì nó chỉ là các thao tác lập lại mỗi khi chúng ta muốn unpack lọai packer đó. vì vậy để không phải mỗi lần chúng ta unpack là phải đem tut mup ra đọc, rồi thao tác y chang như vậy để tìm oep , các cracker đã dùng ngôn ngữ script trong olly để “viết các thao tác nhàm chán” đó lưu lại thành một file script . khi unpack bạn chỉ cần chạy file đó là olly sẽ tự động tìm cho bạn oep. khỏe re phải không bạn. hi` 
một trong những tay cracker của vn viết rất nhiều các script là lão hacnho. các bạn hảy vào website của lão ta mà tìm các script nhé: http://www.reaonline.net/forum/links.php?url=http://www.hacnho.nhandan.info 
mục đích của tut này là giúp các bạn newbie chạy được một file script và làm quen với ngôn ngữ script để hiểu được những gì các tác giả viết trong file script. không khó lắm đâu các bạn. chúng ta học từ từ rồi sẽ biết thôi mà.  


1.cài đặt ollydbgscript và chạy một file script: 

cài đặt ollyscript theo các bước sau: 
1. đầu tiên bạn phải có ollydbg đã được cài đặt sẳn.( điều này là tất nhiên rồi) 
2. cài đặt 1 thư mục có tên là “plugins” trong thư mục chứa ollydbg trên máy bạn. 
3. bạn download file ollyscript.dll trên mạng về và copy nó vào thư mục “plugins” đã tạo ở trên 
4. mở olldbg lên , vào menu options , chọn appearance/directories. một dialog pops up ra 
5. trong dialog vừa bật lên ta set “plugin path” đến thư mục “plugins” đã tạo ra ở trên. 
6. restart ollydbg. bây giờ ollyscript đã có trong menu plugins . 
7. để chạy một script , ta chọn “run script…” trong menu plugins/ollyscript và chọn file script và bạn muốn run. 

2.giới thiệu về ngôn ngữ script: 

để viết các file script các bạn ko cần một chương trình sọan thảo riêng nào cả , chỉ cần sọan thảo trong notepad là được và lưu ra file có đuôi .txt hay gì cũng được, thỏai mái như “lai cái” hi`hi`. 
bây giờ tui giới thiệu với các bạn cái ngôn ngữ script đơn giản này như đang giởn này: 
tui xài olly 1.10 và plugins v0.91. các bạn hảy vào trang web olly tải về nhé. 
đầu tiên tui xin giới thiệu về cái menu của nó 

a-menus: 

bạn vào menu plugins của olly, chọn ollyscript, ta thấy các menu con như sau: 
-run script…: cho người sử dụng chọn một file script và chạy nó. 
-abort : bỏ qua khi ko muốn script chạy tiếp 
-pause: tạm ngừng script khi nó đang chạy 
-resume: chạy tiếp khi script bị paused 
-about**: thông tin về plugin này 
bây giờ chúng ta vào mục chính nhé: 

b-về ngôn ngữ ollyscript: 

ngôn ngữ script trong olly tương tự về mặt ngôn ngữ như ngôn ngữ asm. nhưng khác ở chổ nó ko cần phải biên dịch ra một file .exe , mà thực chất nó là một ngôn ngữ thông dịch trong olly. nếu các bạn nào biết dùng ngôn ngữ lisp trong autocad thì script cũng tương tự như vậy trong olly. tại sao tui nói nó là ngôn ngữ thông dịch chứ ko phải biên dịch, vì khi olly khi run 1 script thì gặp lệnh nào là thực hiện ngay lệnh đó, chứ ko phải biên dịch hết file script rồi mới chạy. các bạn nên có khái niệm về vấn đề này. 

i/qui ước dữ liệu: 

đây cũng chính là rule của ollyscript 
sau đây là một số quy ước của script về dữ liệu src (nguồn) và dest (đích) cho các lệnh (như lệnh “mov dest,src” chẳng hạn): 
-constant ( hằng số): giống như asm là 1 số hex, nhưng trong script không có những ký hiệu trước hay sau số hex. 
ví dụ: 
trong script , một số hex được viết là 00ff chứ ko phải 0x00ff hay 00ffh 
-variable (biến): giống như pascal, biến được mô tả sau từ khóa var nhưng ko cần khai báo lọai biến vì chỉ có 1 lọai biến là số hex. 
-chỉ có một lọai thanh ghi 32-bit trong script như : eax,ebx, ecx, edx, esi, edi, ebp, esp, eip. không có thanh ghi 16-bit như ax , hay 8-bit như al. nhưng bạn có thể dùng lệnh shl/shr và and để lấy giá trị của chúng. 
-tham chiếu đến một vùng nhớ nào đó ta cho địa chỉ nhớ nằm trong 2 dấu […. ] 
ví dụ: 
[401000] : trỏ đến vùng nhớ tại địa chỉ 401000 
[ecx] : trỏ đến vùng nhớ tại địa chỉ ecx 
-để dùng flag (cờ) trong script ta dùng dấu cảm thán “!” trước tên flag 
ví dụ: !cf, !pf, !af, !zf, !sf, !df, !of 
-byte string (chuổi byte, mỗi 1 byte là 2 số hex) để được script hiểu nó phải đặt trong 2 dấu thăng # và chuổi byte phải là số chẳn các số hex giữa 2 dấu # (2 số hex cho 1 byte nên lúc nào cũng phải chẳn) 
ví dụ: #6a0000# (có 6 số là số chẳn chứa trong 2 dấu #) 
-hay hơn nữa là byte string có chứa wildcard là dấu “?”. 
ví dụ: #6a??00# hay #6?0000# 
-chuổi ký tự trong script được viết giữ 2 dấu “…..” 
ví dụ: chuổi ký tự benina là “benina” 
-đối với một số lệnh,để lấy giá trị của một biến ta đặt biến đó trong {..} 
ví dụ: 
var x 
mov x,”00402222” 
mov eax,{x}======== >>eax=00402222 
ii/các biến riêng của script: 

quote: 
$result 
đây là giá trị trả về của vài chức năng giống như chức năng find…. 

$version 

biến này chứa version hiện hành của ollyscript 
ví dụ: 
cmp $version, "0.8" 
ja version_above_08 


iii/comments (ghi chú thích khi viết script): 
bất cứ khi nào tui muốn học một ngôn ngữ mới , việc đầu tiên tui phải học là cách comment trong ngôn ngữ đó. vì khi ta tiến hành viết lệnh, nếu ko ghi chú thích đầy đủ, chừng nữa tiếng sau…. , tui ko biết tui đã viết gì…. tui ngu bẩm sinh mà. vì vậy tui sẽ giới thiệu với các bạn cách comment trong script như sau: 
- comment cho 1 dòng lệnh ta dùng “//” trước lời chú thích 
- comment một cụm lời chú thích ta đặt “/*” đầu cụm và “*/” cuối cụm chú thích 

iv-skeleton script (nhân của một script): 

như các bạn biết khi học pascal, một chương trình pascal chuẩn như sau: 


quote: 
program tenchuongtrinh 
khai báo biến, hằng, …. 
begin 
các lệnh; 
end. 



cái đó chính là nhân của một chương trình pascal. vậy nhân của script như thế nào?.thực ra trong ollyscript ko qui định về nhân, nhưng để qui định chung khi “thuở ban đầu mới yêu nhau” , benina xin đề xuất một cái nhân như sau: 


quote: 
/*================= 
tên script 
==================*/ 
khai báo biến, includes …(không bắt buộc) 
các lệnh script 
…………… 
………….. 
ret // exits script 



thực chất ra các dòng comment về tên script ko cần thiết, nhưng chúng ta hảy tập thói wen này để sau này dễ tra cứu script này làm gì. 
ở đây chúng ta thấy lệnh ret ở cuối file. nó chính là lệnh thóat khỏi script trở về olly. nó cũng tương tự như lệnh end trong pascal thôi. 


v-chương trình đầu tiên của bạn: 
để cho đỡ buồn chán bây giờ tui sẽ hướng dẫn các bạn làm một file script đơn giản: 
các bạn hảy bật notepad lên và sọan thảo một file .txt như sau: 


quote: 
/*/////////////////////////////////// 
chuong tinh dau tien cua ban 
/////////////////////////////////////*/ 
msg “benina is a good newbie” // hiện hộp thọai 
ret // exits script 



bây giờ các bạn hảy lưu file text trên vào một thư mục bất kỳ.hảy bật olly lên, chú ý: ta hảy open 1 file .exe nào đó trong olly rồi mới chạy script trên được nhé. xong chưa các bạn, bây giờ chạy script trên xem sao. 
bùm, nó hiển thị một dialog có dòng thông báo: “benina is a good newbie” đúng ko các bạn. hêhê … sau đó nó hiện 1 hộp thọai báo “script finished”….vậy là ta viết script được rồi…pó tay luôn . 
sẳn đây tui giới thiệu với các bạn một lệnh sau: 
như các bạn biết, trong tut “let’s cracking by olly” mà tui đã viết , có nói về lệnh comment cho các routine trong olly (ko phải comment trong script nhe, đừng có lộn!). nó có phím tắt là button “;”. khi sử dụng lệnh này các bạn sẽ chú thích được 1 ghi chú trong của sổ cpu tại cột comment. thưa các bạn, trong script củng cho phép bạn thao tác được như lệnh “;”. chỉ thị sau tương tự như lệnh “;” trong olly: 


quote: 
cmt addr, text 
----------------- 
thêm vào dòng chú thích text tại địa chỉ addr 
ví dụ: 
cmt eip, “this is the ep” 



như các bạn biết , thanh ghi eip chứa chỉ thị lệnh sắp thực hiện. vì vậy khi open 1 file trong olly , eip luôn chứa chỉ thị lệnh đầu tiên của chương trình đó cũng chính là ep của chương trình. bây giờ ta viết lại script trên như sau: 


quote: 
/*/////////////////////////////////// 
chuong tinh dau tien cua ban 
/////////////////////////////////////*/ 

msg “benina is a good newbie” // hiện hộp thọai 
cmt eip, “this is the ep” 
ret // exits script 



bạn hảy cho chạy script trên, và nó làm việc như ý chứ?. bạn có thấy tại dòng lệnh đầu tiên trong của sổ cpu của olly có dòng comment “this is the ep” không?. ok! 
sở dĩ tui post lệnh cmt này trước cho các bạn vì trong tut của lão hacnho hay sử dụng cái lệnh này để ghi chú oep đã tìm được. bây giờ thì chúng ta đã lấn sâu vào script một chút rồi đấy. 

chú ý: khi viết script , nhiều khi bị rối, chương trình chạy tầm bậy, ta muốn debug xem script chạy sai chổ nào, chúng ta hảy ứng dụng lệnh msg làm breakpoint trong script nhé. khi đó chương trình ngừng lại cho chúng ta xem xét…hihi.hay các bạn dùng lệnh sau là breakpoint cũng được: 


quote: 
pause 
---------- 
tạm ngừng tiến trình script đang thực thi. muốn resume tiếp tục thì ta vào menu plugins /ollyscript/resume 
ví dụ: trong file script ta đánh vào lệnh: 
pause 



vậy là coi như chương trình đầu tiên đã xong. 

vi-khai báo biến, hằng, và includes 

-khai báo biến: 

quote: 
var varname 
------------ 
khai báo biến để được dùng trong script 
phải khai báo trước khi dùng biến 
ví dụ: 
var x 



-khai báo hằng: thực ra trong script ko có khai báo hằng , muốn khai báo hằng chúng ta cho 1 biến có giá trị đầu tiên, đơn giản vậy thôi. 
trước tiên chúng ta xem lệnh gán giá trị trong script, nó giống như asm vậy 

quote: 
mov dest,src 
----------------- 
gán giá trị trong src vào dest 
src có thể là một long hex string với định dạng như sau #<số hex>#, ví dụ: #1234# (số số hex phải là số chẳn nhé) 
ví dụ: 
mov x, 0f 
mov y, "hello world" 
mov eax, ecx 
mov [ecx], #00dead00beef00# 
mov !cf, 1 
mov !df, !pf 


vậy khai báo hằng như sau: 

quote: 
ví dụ: 

var x 
mov x, “benina is a good newbie” 



-includes một file script: 

quote: 
#inc file 
---------------- 
includes một file script trong một file script khác 
ví dụ: 
#inc “anotherscript.txt” 



ghi chú: lệnh này không nhất thiết phải ở đầu chương trính script, bạn muốn đặt ở đâu cũng được. mục đích chính của nó là, khi script chạy gặp lệnh này thì thực thi tất cả các lệnh trong file “anotherscript.txt” , sau đó mới thực thi tiếp các lệnh sau lệnh #inc (với điều kiện trong “anotherscript.txt” ko có lệnh ret) 

để ứng dụng các điều vừa học, các bạn hảy viết 2 file script như sau: 


quote: 
/*/////////////////////////////////// 
file : script1.txt 
/////////////////////////////////////*/ 
var x 
mov x,"benina is a good newbie" // khai bao hang x 

#inc "script2.txt" // thực thi các lệnh trong script2.txt 

msg “script2 da chay xong!!” 

ret // exits script 




quote: 
------------------------------------ 
/*/////////////////////////////////// 
file : script2.txt 
/////////////////////////////////////*/ 

msg x 
// chu y trong script2 khong co lệnh ret 



--------------------------- 
bây giờ bạn hảy cho olly chạy file script1 xem sao. ok! bạn đã hiểu rồi nhé, không cần giải thích dài dòng. chỉ chú ý là trong script2 ko có lệnh ret thôi 

vii-các lệnh thao tác trong olly: 

trong olly các lệnh “thao tác bằng tay” như f9 (run), f8 , f7….. đều được script tự động thực hiện. sau đây là các lệnh script tương tự như các lệnh thao tác trong olly. mấy cái lệnh này tui ko dịch nhé, vì quá dễ mà: 

quote: 
ai 
-- 
executes "animate into" in ollydbg 
example: 
ai 

an addr 
------- 
analyze module which contains the address addr. 
example: 
an eip // same as pressing ctrl-a 

ao 
-- 
executes "animate over" in ollydbg 
example: 
ao 
rtr 
--- 
executes "run to return" in ollydbg 
example: 
rtr 

rtu 
--- 
executes "run to user code" in ollydbg 
example: 
rtu 

run 
--- 
executes f9 in ollydbg 
example: 
run 


sti 
--- 
execute f7 in ollydbg. 
example: 
sti 


sto 
--- 
execute f8 in ollydbg. 
example: 
sto 
esti 
---- 
executes shift-f7 in ollydbg. 
example: 
esti 

esto 
---- 
executes shift-f9 in ollydbg. 
example: 
esto 
ti 
-- 
executes "trace into" in ollydbg 
example: 
ti 

ticnd cond 
---------- 
traces into calls until cond is true 
example: 
ticnd "eip > 40100a" // will stop when eip > 40100a 

to 
-- 
executes "trace over" in ollydbg 
example: 
to 

tocnd cond 
---------- 
traces over calls until cond is true 
example: 
tocnd "eip > 40100a" // will stop when eip > 40100a 
pause 
----- 
pauses script execution. script can be resumed from plugin menu. 
example: 
pause 




tóm tắt các lệnh trên như sau: (để chúng ta dễ tra khi đọc code hay viết code cho script) 

quote: 
ai --------- ctrl-f7 : animate into 
an---------ctrl-a : analyze module 
ao---------ctrl-f8 : animate over 
rtr--------ctrl-f9 : run to return 
rtu-------alt-f9 : run to user code 
run---------f9 : run 
sti-----------f7: step into 
sto----------f8: step over 
esti---------shift-f7: giống như f7, nhưng nếu khi chương trình dừng lại trên một exception, thì olly bắt đầu thử chuyển exception đến handler được chỉ định trong chương trình. 
esto--------shift-f9: giống như f9, nhưng nếu khi chương trình dừng lại trên một exception, thì olly bắt đầu thử chuyển exception đến handler được chỉ định trong chương trình. 
ti------------ctrl-f11: trace into 
to-----------ctrl-f12: trace over 
ticnd------ctrl-f11 kết hợp với ctrl-t: trace into và set condition 
tocnd------ctrl-f12 kết hợp với ctrl-t: trace over và set condition 
pause--------f12 ; pause 


================= 
đến đây thì xin các bạn cho benina đi ngũ nhe. buồn ngũ quá rồi. hôm nào rãnh post tiếp. 

benina (5/10/2004) 

--------------------------------------------------------------------------- 




phần tiếp theo: 

xin lỗi trước các bạn, vì lỡ khui “thùng bia ollysrcipt” ra rồi thành thử ra phải nhậu cho hết, chứ benina quải quá, không có thời gian để mà nhậu. muốn gác kiếm rồi nhưng còn vương vấn sự đời nên lâu lâu cũng nhậu vài ba cái tut cho vui để có dịp nào thảnh thơi benina sẽ nhậu với các bạn mấy cái script này cho nó kỹ càng. còn bây giờ benina chỉ sắp xếp các cái lệnh script cho các bạn có hệ thống. đồng thời tóm tắt , và điểm sáng một số lệnh quan trọng để các bạn có khái niệm. benina sẽ ko dịch tòan bộ các lệnh này, vì thực ra cũng dễ dịch lắm. nếu bạn nào rãnh rỗi cứ dịch ra cho anh em thì rất tốt. 



viii-các lệnh giống trong asm: 

các lệnh này của script đều có trong tập lệnh asm, nên thật dễ dàng khi tiếp xúc các lệnh này. 

quote: 
add dest, src 
------------- 
adds src to dest and stores result in dest 
example: 
add x, 0f 
add eax, x 
add [401000], 5 
add y, " times" // if y was 1000 before this command then y is "1000 times" after it 


and dest, src 
------------- 
ands src and dest and stores result in dest 
example: 
and x, 0f 
and eax, x 
and [401000], 5 

dec var 
------- 
substracts 1 from variable 
example: 
dec v 


inc var 
------- 
adds 1 to variable 
example: 
inc v 

mov dest, src 
------------- 
move src to dest. 
src can be a long hex string in the format #<some hex numbers>#, for example #1234#. 
remember that the number of digits in the hex string must be even, i.e. 2, 4, 6, 8 etc. 
example: 
mov x, 0f 
mov y, "hello world" 
mov eax, ecx 
mov [ecx], #00dead00beef00# 
mov !cf, 1 
mov !df, !pf 

or dest, src 
------------- 
ors src and dest and stores result in dest 
example: 
or x, 0f 
or eax, x 
or [401000], 5 
shl dest, src 
------------- 
shifts dest to the left src times and stores the result in dest. 
example: 
mov x, 00000010 
shl x, 8 // x is now 00001000 

shr dest, src 
------------- 
shifts dest to the right src times and stores the result in dest. 
example: 
mov x, 00001000 
shr x, 8 // x is now 00000010 


sub dest, src 
------------- 
substracts src from dest and stores result in dest 
example: 
sub x, 0f 
sub eax, x 
sub [401000], 5 


xor dest, src 
------------- 
xors src and dest and stores result in dest 
example: 
xor x, 0f 
xor eax, x 
xor [401000], 5 
--------------------------------------------------- 



tóm lại: các lệnh sắp xếp trong mục này là: 

quote: 
add,sub, dec,inc, and,or,xor,shl,shr, mov 



ix-lệnh nhảy và lệnh so sánh: 

a>label(nhãn) 

trước hết phải nói về nhãn (label) vì lệnh nhảy lúc nào cũng liên quan đến label. trong ngôn ngữ lập trình cấp cao, khi ta muốn điều khiển một lệnh nhảy , nhảy đến 1 routine nào, thì ta phải khai báo trước routine đó một cái tên nhãn (label). lúc đó chương trình chúng ta mới biết đường mà nhảy . trong script, lables khai báo như sau: 

quote: 
labels 
---------- 
labels được định nghĩa bằng cách đặt dấu “:” sau một cái name. 
example: 
some_label: 



sau đây tui cũng xin giới thiệu với các bạn một lệnh định nhãn của script cho window cpu. 
trong tut “let’s cracking by olly” , tui có post về cách định một nhãn cho một dòng lệnh trong olly để khi nào ta muốn đến đó debug thì ta cho olly nhảy đến nhãn đó là xong. lệnh định nhãn trong olly là shotcut “:” . trong script, nó hổ trợ cho chúng ta thực hiện lệnh trên như sau: 


quote: 
lbl addr, text 
-------------- 
inserts a label at the specified address 
example: 
lbl eip, "nicejump" 



b>compare (lệnh so sánh): 

như các bạn biết, lệnh so sánh lúc nào cũng đi chung với lệnh nhảy, nên tui sắp xếp chúng vào một mục. 


quote: 
cmp dest, src 
------------- 
compares dest to src. works like it's asm counterpart. 
example: 
cmp y, x 
cmp eip, 401000 



c>jumps(các lệnh nhảy): 

các lệnh nhảy trong script: 


quote: 
ja label 
-------- 
use this after cmp. works like it's asm counterpart. 
example: 
ja some_label 

jae label 
--------- 
use this after cmp. works like it's asm counterpart. 
example: 
jae some_label 

jb label 
-------- 
use this after cmp. works like it's asm counterpart. 
example: 
jb some_label 

jbe label 
--------- 
use this after cmp. works like it's asm counterpart. 
example: 
jbe some_label 

je label 
-------- 
use this after cmp. works like it's asm counterpart. 
example: 
je some_label 

jmp label 
--------- 
unconditionally jump to a label. 
example: 
jmp some_label 

jne label 
--------- 
use this after cmp. works like it's asm counterpart. 
example: 
jne some_label 

=============== 


tóm lại: các lệnh trong mục này: 

quote: 
lables in file script;lbl;cmp;ja;jae;jb;jbe;je;jne;jmp 



x-lệnh patch thay đổi code : 

nó tương tự như các lệnh assemble (shotcut space), fill with nops, edit binary (ctrl-e): 

quote: 
asm addr, command 
----------------- 
assemble a command at some address. 
returns bytes assembled in the reserved $result variable 
example: 
asm eip, "mov eax, ecx" 

fill addr, len, value 
--------------------- 
fills len bytes of memory at addr with value 
example: 
fill 401000, 10, 90 // nop 10h bytes 

repl addr, find, repl, len 
-------------------------- 
replace find with repl starting att addr for len bytes. 
wildcards are allowed 
example: 
repl eip, #6a00#, #6b00#, 10 
repl eip, #??00#, #??01#, 10 
repl 401000, #41#, #90#, 1f 


tóm lại: có 3 lệnh để patch: 

quote: 
asm,fill,repl 




xi-lệnh về breakpoint: 

trong script cũng cho ta lệnh set breakpoint. các bạn chú ý lệnh bp nó giống như set breakpoint toggle f2, và lệnh bphws , nó giống như lệnh bpm trong si. tức là set bp tại một address trong vùng nhớ , khi chương trình chạm đến vùng nhớ này, tùy theo mod đọc hay viết vào vùng nhớ này mà nó break chương trình 


quote: 
bc addr 
------- 
clear unconditional breakpoint at addr. 
example: 
bc 401000 
bc x 
bc eip 

bp addr 
-------- 
set unconditional breakpoint at addr. 
example: 
bp 401000 
bp x 
bp eip 

bpcnd addr, cond 
---------------- 
set breakpoint on address addr with condition cond. 
example: 
bpcnd 401000, "ecx==1" 

bpl addr, expr 
-------------- 
sets logging breakpoint at address addr that logs expression expr 
example: 
bpl 401000, "eax" // logs the value of eax everytime this line is passed 

bplcnd addr, expr, cond 
----------------------- 
sets logging breakpoint at address addr that logs expression expr if condition cond is true 
example: 
bplcnd 401000, "eax", "eax > 1" // logs the value of eax everytime this line is passed and eax > 1 

bpmc 
---- 
clear memory breakpoint. 
example: 
bpmc 

bphwc addr 
---------- 
delete hardware breakpoint at a specified address 
example: 
bphwc 401000 

bphws addr, mode 
---------------- 
set hardware breakpoint. mode can be "r" - read, "w" - write or "x" - execute. 
example: 
bphws 401000, "x" 

bprm addr, size 
--------------- 
set memory breakpoint on read. size is size of memory in bytes. 
example: 
bprm 401000, ff 

bpwm addr, size 
--------------- 
set memory breakpoint on write. size is size of memory in bytes. 
example: 
bpwm 401000, ff 


tóm tắt lệnh: 

quote: 
bc,bp,bpcnd,bpl,bplcnd,bpmc,bphwc,bphws,bprm,bpwm 



xii-lệnh về các hộp thọai: 

các lệnh liên quan đến việc cho hiển thị hộp đối thọai với srcipt. 


quote: 
ask question 
------------ 
displays an input box with the specified question and lets user enter a response. 
sets the reserved $result variable (0 if cancel button was pressed). 
example: 
ask "enter new eip" 
cmp $result, 0 
je cancel_pressed 
mov eip, $result 


msg message 
----------- 
display a message box with specified message 
example: 
msg "script paused" 

msgyn message 
----------- 
display a message box with specified message and yes and no buttons. 
sets the reserved $result variable to 1 if yes is selected and 0 otherwise. 
example: 
msgyn "continue?" 



tóm lại: 

quote: 
ask,msg,msgyn 



xiii-các lệnh dump: 

ứng dụng các lệnh này để ta viết 1 script có chức năng dump chương trình ra 1 file , mà ko cần dùng các phần mềm dump chuyên nghiệp. đặc biệt các bạn chú ý lệnh dump dpe 


quote: 
dm addr, size, file 
------------------- 
dumps memory of specified size from specified address to specified file 
example: 
dm 401000, 1f, "c:\dump.bin" 

dma addr, size, file 
------------------- 
dumps memory of specified size from specified address to specified file appending to that file if it exists 
example: 
dma 401000, 1f, "c:\dump.bin" 

dpe filename, ep 
---------------- 
dumps the executable to file with specified name. 
entry point is set to ep. 
example: 
dpe "c:\test.exe", eip 


tóm lại: 

quote: 
dm,dma,dpe 



xiv-các lệnh về tìm kiếm: 

các lệnh này rất quan trọng trong việc đọc tut mup, các bạn nên hiểu rõ các lệnh này. tui xin dịch các lệnh findop cho các bạn 


quote: 
find addr, what 
--------------- 
searches memory starting at addr for the specified value. 
when found sets the reserved $result variable. $result == 0 if nothing found. 
the search string can also use the wildcard "??" (see below). 

example: 
find eip, #6a00e8# // find a push 0 followed by some kind of call 
find eip, #6a??e8# // find a push 0 followed by some kind of call 

findop addr, what 
----------------- 
searches code starting at addr for an instruction that begins with the specified bytes. 
when found sets the reserved $result variable. $result == 0 if nothing found. 
the search string can also use the wildcard "??" (see below). 
example: 
findop 401000, #61# // find next popad 
findop 401000, #6a??# // find next push of something 



lệnh này có ý nghĩa như sau: 
tìm một chỉ thị lệnh bắt đầu với những bytes được chỉ định trong tham số what .địa chỉ bắt đầu tìm kiếm là địa chỉ addr . khi đã tìm xong, nó sẽ set kết quả địa chỉ dòng lệnh trong biến $result. nếu $result==0 tức là ko tìm thấy. khi tìm kiếm string cũng có thể dùng widcard “??”. xem các ví dụ trên 
lệnh này rất hay dùng trong các tut mup để tìm kiếm một dòng lệnh nào đó. 
chú ý: lệnh find và findop khác nhau ở chồ: find thì tìm trong memory cái gì đó còn findop thì tìm dòng lệnh code. 

tóm tắt các lệnh : 

quote: 
find,findop 



xv-các lệnh về liên quan đến log window: 

các lệnh sau can thiệp vào của sổ log trong olly (trong olly bạn nhấn button “l” trên thanh menu để cho hiển thị cửa sổ log.cửa sổ này ghi nhận lại những gì mà olly đã log trong quá trình thực thi chương trình.cửa sổ này cũng có thể ứng dụng trong filegen để tìm file lưu serial) 


quote: 
#log 
---- 
enables logging of executed commands. 
the commands will appear in ollydbg log window, and will be prefixed with --> 
example: 
#log 

ghi chú: lệnh này sẽ cho hiển thị các lệnh trong script mà nó đã thực thi trong cửa sổ log 

log src 
------- 
logs src to ollydbg log window. 
if src is a constant string the string is logged as it is. 
if src is a variable or register its logged with its name. 
example: 
log "hello world" // the string "hello world" is logged 
var x 
mov x, 10 
log x // the string "x = 00000010" is logged. 


tóm tắt: 

quote: 
#log, log 



xvi-các lệnh gets: 

các lệnh này chủ yếu để lấy thông tin nào đó từ dữ liệu ta cung cấp 


quote: 
gn addr 
------- 
gets the symbolic name of specified address (ex the api it poits to) 
sets the reserved $result variable 
example: 
gn 401000 

gpa proc, lib 
------------- 
gets the address of the specified procedure in the specified library. 
when found sets the reserved $result variable. $result == 0 if nothing found. 
useful for setting breakpoints on apis. 
example: 
gpa "messageboxa", "user32.dll" // after this $result is the address of messageboxa and you can do "bp $result". 

gmi addr, info 
-------------- 
gets information about a module to which the specified address belongs. 
"info" can be modulebase, modulesize, codebase or codesize (if you want other info in the future versions plz tell me). 
sets the reserved $result variable (0 if data not found). 
example: 
gmi eip, codebase // after this $result is the address to the codebase of the module to which eip belongs 



tóm tắt: 

quote: 
các lệnh này mới rất hay. tui tóm tắt như sau 
gn: ứng dụng lấy tên của hàm api tại địa chỉ chỉ định 
gpa : ứng dụng lấy địa chỉ của một hàm api nào đó để đặt bp tại địa chỉ đó 
gmi: thấy thông tin về module mà eip(hay một adrr) đang trỏ. nhiều khi tử huyệt cần crack ko nằm trong file exe mà lại nằm trong file dll. ta ứng dụng lệnh này để lấy thông tin module 





xvii-các lệnh tranfer (dời thao tác) 

(dời sự thực thi của script đến một label nào đó trong trong file script): 
có 2 trạng thái cần phân biệt: 
-breakpoint (điểm ngắt trong olly): ngắt do người dùng ép buộc 
-exception (sự phản kháng của olly): ngắt do olly phản kháng. 
các lệnh này can thiệp vào 2 trạng thái ngắt ở trên. mục đích chính của các lệnh này là báo cho script biết, khi nào ngắt xảy ra thì rời ngắt thực thi tiếp (cob,coe) hay nhảy đến một đọan script nào đó thực thi tiếp(eob,eoe). vì vậy khi viết script, lệnh này đặt đâu cũng được miễn trước break mà ta dự tính sẽ xử lý. 


quote: 
eob label 
--------- 
transfer execution to some label on next breakpoint. 
example: 
eob some_label 

eoe label 
--------- 
transfer execution to some label on next exception. 
example: 
eob some_label 
cob 
--- 
makes script continue execution after a breakpoint has occured (removes eob) 
example: 
cob 

coe 
--- 
makes script continue execution after an exception has occured (removes eoe) 
example: 
coe 



tóm tắt: 


quote: 
eob,eoe,cob,coe 



xiii-các lệnh thực thi trong script: 

lệnh dễ và cũ , tui ko dịch , chỉ dịch các lệnh mới mà thôi 


quote: 
#inc file 
--------- 
includes a script file in another script file 
example: 
#inc "anotherscript.txt" 
cmt addr, text 
-------------- 
inserts a comment at the specified address 
example: 
cmt eip, "this is the entry point" 
ret 
--- 
exits script. 
example: 
ret 
dbh 
--- 
hides debugger 
example: 
dbh 

dbs 
--- 
unhides debugger 
example: 
dbs 



eval 
---- 
mục đích: kết hợp một string với một giá trị đã tính tóan thành một string mới được set trong biến $result 

evaluates a string expression that contains variables. 
the variables that are declared in the current script can be enclosed in curly braces {} to be inserted. 
sets the reserved $result variable 
example: 
var x 
mov x, 1000 
eval "the value of x is {x}" // after this $result is "the value of x is 00001000" 

exec/ende 
--------- 
mục đích của các lệnh này là can thiệp vào trong quá trình thực thi của olly, như thay đổi giá trị thanh ghi, hay exit tiến trình thực thi. 

executes instructions between exec and ende in the context of the target process. 
values in curly braces {} are replaced by their values. 
example: 
// this does some movs 
var x 
var y 
mov x, "eax" 
mov y, "0deadbeef" 
exec 
mov {x}, {y} // mov eax, 0deadbeef will be executed 
mov ecx, {x} // mov ecx, eax will be executed 
ende 
// this calls exitprocess in the debugged application 
exec 
push 0 
call exitprocess 
ende 
ret 

go addr 
------- 
executes to specified address (like g in softice) 
example: 
go 401005 


integration with other plugins (tích hợp với một plugins khác) 
--------------------------------- 
you can call ollyscript from your plugin and make it execute a script. 
use something like the source code below: 
(bạn có thể gọi ollscript từ một plugin củ abạn và bắt nó thực thi một script .ta xử dụng hàm này 

hmodule hmod = getmodulehandle("ollyscript.dll"); 
if(hmod) // check that the other plugin is present and loaded 
{ 
// get address of exported function 
int (*pfunc)(char*) = (int (char*)) getprocaddress(hmod, "executescript"); 
if(pfunc) // check that the other plugin exports the correct function 
pfunc("myscript.txt"); // execute exported function 
} 



tóm tắt: 

quote: 
#inc,cmt,ret,dbh,dbs, exec/ende,eval,go, hmodule 


đến đây là hết tut này. benina hy vọng qua tut này , các cracker sẽ viết rất nhiều script tuyệt đẹp. 
benina (9/10/2004) 


------------------------------------------------------------------------------ 




command line plugin 




welcome, sau một thời gian làm quen với olly hôm nay em xin giới thiệu với mọi người một plugin không kém phần quan trọng của olly , đó chính là plugin command line. mặc dù còn nhiều tính năng hạn chế nhưng plugin này cũng vẫn cung cấp cho chúng ta các chức năng đầy đủ mà một chương trình debug cần phải có. nhưng bù lại thì mã nguồn của plugin này là mở cho nên cho phép chúng ta add thêm bất kì câu lệnh mới nào vào đồng thời nó cũng cho phép chúng ta chỉnh sửa các chức năng của những câu lệnh đã có. bài viết này được dịch ra từ file help , mong rằng sẽ đáp ứng được phần nào thông tin , cũng như chức năng cơ bản của plugin này. 

như chúng ta đã biết , để gọi plugin này trong olly chúng ta dùng phím tắt sau : alt + f1. hiện tại theo tài liệu mà em có thì plugin này hỗ trợ những câu lệnh sau : 

1. expressions (biểu thức) : 

code: 
calc expression : tính toán giá trị của một biểu thức 
? expression : tương tự như trên 
expression (kí tự đầu tiên không được là chữ cái) : tương tự như trên 
watch expression : theo dõi, quan sát một biểu thức 
w expression : tương tự2. assignments (gán) : 

code: 
set reg=expression : ghi giá trị của biểu thức vào thanh ghi chung 8, 16, hay 32 bits 
reg=expression : tương tự 
set memory=expression : ghi giá trị của biểu thức vào bộ nhớ 8 , 16, hay 32 bits3. disassembler : 

code: 
at expression : theo dõi địa chỉ trong cửa sổ disassembler 
follow expression : tương tự 
orig : đi tới thanh ghi eip hiện tại 
* : tương tự4. dump and stack : 

code: 
d expression : theo một địa chỉ trong cửa sổ dump 
dump expression : tương tự 
da [expression] : dump theo dạng assembler 
db [expression] : dump ở dạng byte (hexa) 
dc [expression] : dump dưới dạng ascii text 
dd [expression] : dump dưới dạng địa chỉ (áp dụng cho stack) 
du [expression] : dump theo dạng unicode text 
dw [expression] : dump ở dạn word (hexa) 
stk expression : lần theo một địa chỉ trong stack5. assembling : 

code: 
a expression [,command] : assemble tại một địa chỉ6. labels and comments (các lệnh liên quan đến nhãn và chú thích): 

code: 
l expression, label : gán nhãn cho một địa chỉ 
c expression, comment : gán chú thích tại một địa chỉ7. breakpoint commands (các lệnh liên quan đến việc đặt bp trong olly): 

code: 
bp expression [,condition] : đặt breakpoint int3 tại địa chỉ 
bpx label : đặt breakpoint lên tất cả các hàm call 
bc expression : xóa điểm đặt bp tại địa chỉ 
mr expression1 [,expression2] : đặt một bp là memory on access trên một phạm vi nào đó 
mw expression1 [,expression2] : đặt một bp là memory on write trên một phạm vi nào đó 
md : xóa điểm đặt bp memory 
hr expression : đặt 1-byte bp có dạng hardware on access lên một địa chỉ 
hw expression : đặt 1-byte bp có dạng hardware on write lên một địa chỉ 
he expression : đặt một bp có dạng hardware on execute lên một địa chỉ 
hd [expression] : xóa điểm đặt hardware bp tại một địa chỉ8. tracing commands (các lệnh liên quan đến việc trace code trong olly): 

code: 
stop : tạm dừng sự thi hành 
pause : tương tự 
run : chạy chương trình 
g [expression] : chạy chương trình đến một địa chỉ nào đó 
ge [expression] : bỏ qua các ngoại lệ để điều khiển và chạy đến một địa chỉ nào đó 

s : nhảy vào trong một hàm 
si : tương tự 
so : nhảy qua một hàm 
t [expression] : trace vào trong một hàm đến một địa chỉ nào đó 
ti [expression] : tương tự 
to [expression] : trace qua một hàm đến một điạh chỉ nào đó 
tc condition : trace vào trong một hàm đến một điều kiện nào đó 
toc condition : trace qua một hàm đến một điều kiện nào đó 
tr : thực thi cho đến khi return 
tu : thực thi cho đến đoạn user code9. ollydbg windows (các lệnh liên quan đến cửa sổ): 

code: 
log : xem cửa sổ log 
mod : xem cửa sổ executable 
mem : xem cửa sổ memory 
cpu : xem cửa sổ cpu 
cs : xem cửa sổ call stack 
brk : xem cửa sổ break points 
opt : xem cửa sổ options10. miscellaneous commands (các lệnh khác): 

code: 
exit : đóng ollydbg 
quit : tương tự 
open [filename] : mở một file để debug (executable file or dll) 
close : đóng chương trình đang debug 
rst : restart lại chương trình đang debug 
help : mở cửa help của plugin command line 
help ollydbg : mở cửa sổ help của olly 
help apifunction : mở cửa sổ help của hàm api 
các lệnh dùng trong plugin command line không phân biệt chữ hoa và chữ thường , các tham số trong ngoặc vuông là những tùy chọn. các biểu thức có thể bao gồm các hằng số, các thanh ghi và các tham chiếu bộ nhớ , bên cạnh đó nó còn hỗ trợ tất cả các phép tính số học cơ bản và các boolean function. theo mặc định thì tất cả các hằng số đều ở dạng hexa. để biểu diễn các hằng số về dạng decimal , đi kèm nó là dấu thập phân. ví dụ : 


code: 
1. 2 + 2 : tính toán giá trị của biểu thức (cộng ở kiểu hexa); 

2. 2.0 + 2.0 : tính toán giá trị của biểu thức (cộng ở kiểu thập phân); 

3. at [eax+10] : disassemble tại địa chỉ mà địa chỉ này là nội dung của dw mem tại địa chỉ eax + 0x10; 

4. bp kernel32.getprocaddress : đặt một bp lên hàm api . chú ý bạn có thể đặt một bp trong file dll hệ thống , nhưng chỉ đối với các hệ điều hành nt; 

5. bpx getprocaddress : đặt bp lên tất cả các lệnh gọi hàm api getprocaddress; 

6. bp 412010,eax==wm_close : đặt một conditional bp tại địa chỉ 0x412010. chương trình sẽ dừng lại khi mà giá trị của eax = wm_close; 
kienmanowar(rea – crackerteam) – 05/01/2005

"nguồn hvaonline"

----------


## huyenbeo

*phiền chủ top vừa nghe nhạc vừa đọc =))
phải nói là rất dài đấy
*

----------

