Trao đổi với tôi

http://www.buidao.com

4/9/10

[Reverse] INSTALL, RUN AND WRITE A SCRIPT IN OLLDG

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

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:

/*=================
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:

/*///////////////////////////////////
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:

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:

/*///////////////////////////////////
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:

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:
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
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 ##, 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:
Ví dụ:

Var x
Mov x, “benina is a good newbie”
-Includes một file script:
#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:

/*///////////////////////////////////
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
------------------------------------
/*///////////////////////////////////
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à:
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)
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.
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 ##, 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à:
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:
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:

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.

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:

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:
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):
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:
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

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

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

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

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 :
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)

#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:
#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

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

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:

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

#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:
#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)