OllyScript v0.92中文幫助文件
以下內容為TT小組[Translation Team]翻譯。原英文文件版權屬於SHaG。TT小組保留翻譯部分的權利,您可以任意轉載,但需標明出處來自TT小組。
歡迎大家加入TT小組。
-------------------------------
Olly指令碼外掛v0.92 製作: SHaG
文件漢化:ZMWorm[CCG][TT]
E-Mail:TranslationTeam[at]126.Com
2004年08月12日初稿
-------------------------------
1. 關於 OllyScript
2. 目前情況
2.1 v0.92最新更新
3. 文件
3.1 語言概述
3.1.1 保留變數
3.1.2 指令
3.2 標籤
3.3 註釋
3.4 選單
4. 嵌入其他的外掛
5. 如何聯絡我
6. 特許與原始碼
7. 鳴謝!
------------------------------
1. 關於 OllyScript
-------------------
OllyScript 是 OllyDbg偵錯程式的一個外掛。我個人認為,OllyDbg是目前最好的程式級偵錯程式。
這個偵錯程式的最大的特色之一就是她的外掛體系,這是使得使用者能夠更為有效的擴充套件她的功能。
OllyScript 是一種通過類組合語言的指令碼,來控制OllyDbg自動執行的外掛。
在除錯程式時,常常都是僅僅為了要找到某幾個關鍵點,而不得不做大量的重複工作。
而通過使用我的指令碼,您就可以做到“寫一次指令碼,無限使用” [write a script once and for all]。
------------------------------
2. 目前情況(200年7月10日)
----------------------------
v0.92
修正了一個關於指令碼同步的大Bug(感謝loveboom!)。
GN 指令行為更新[behaviour updated]。
MOV 指令可以將字串寫入記憶體。
v0.91
修正了一個關於應用程式暫停的Bug。
增加GN指令。
ASM指令返回$RESULT。
v0.9
OllyScript目前的下載量已經超過一萬次了!這意味著超過2Gb的網路下載流量。這個結果對我來說還不錯!因為我要參與一個xray系統專案,這個專案要花去我不少的時間,所以開發這個外掛的步伐可能要放慢了。真的對不起大家了。
2.1 最新更新
---------------
+ 新的指令:ASK, BPL, BPLCND, COB, COE, EVAL, EXEC/ENDE, GN, TICND, TOCND
+ 在除錯程式中執行程式碼
+ ADD和EVAL指令支援串操作。
+ 輸入對話方塊
+ 記錄斷點[Logging breakpoints]
+ 去除EOB和EOE指令
+ 條件跟蹤
+ 獲得地址名
# ASM指令返回彙編命令長度,儲存在$RESULT中
# 修正程式暫停時發生崩潰的Bug
# 修正JBE指令的Bug,希望這是最後一個關於跳轉指令的Bug
# OllyScript 目前只完全支援OllyDbg v1.10。對於其他版本並不一定完全相容。
------------------------------
3. 文件
----------------
在這個版本中,附帶了兩個指令碼例子(tElock098.osc 和 UPX.osc)。
這兩個指令碼,可以迅速找到對應殼的入口。
3.1 語言
------------
OllyScript指令碼語言是一個種類彙編的語言。
在後面的文件中, “源運算元” 和 “目的運算元”表示以下含義:
- 十六進位制常數,既沒有字首也沒有字尾。 (例如:是00FF, 而不是 0x00FF 和 00FFh的形式)
- 變數,這個變數必須在使用前用Var進行定義
- 一個32位暫存器 (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP)。
目前尚不支援非32位暫存器,但是您可以使用SHL/SHR 和 AND指令來獲得這它們的值。
- 一個被中括號括起來的記憶體地址 (例如:[401000] 指向記憶體地址為401000裡存放分資料,
[ecx] 指向記憶體地址為暫存器ecx裡存放分資料).
- 一個標誌位,帶有感嘆號字首(!CF, !PF, !AF, !ZF, !SF, !DF, !OF)
- 字串,也可叫資料序列。其格式為: #6A0000# (數值在兩個“#”號之間),兩個“#”號之間必須包含至少有一個數值。
- 包含“?”萬用字元的字串。比如 #6A??00# 或者 #6?0000#
33.1.1 保留變數
------------------------
$RESULT
-------
<RESULT>
儲存某些函式的返回值,比如FIND函式,等等。
$VERSION
--------
<VERSION>
儲存OllyScript,的版本資訊
例:
cmp $VERSION, "0.8" //比較是否大於 0.8版
ja version_above_08
3.1.2 指令
--------------
#INC "檔名"
---------
<INClude>
將一個指令碼檔案的內容包含到另外一個指令碼檔案中
例:
#inc "anotherscript.txt"
#LOG
----
<LOG>
開始記錄執行指令
指令會顯示在OllyDbg的log視窗中,每條記錄前都會加上“-->”的字首
例:
#log
ADD 目的運算元,源運算元
-------------
<ADD>
源運算元與目的運算元相加,並把相加的結果儲存到目的運算元中。
例:
add x, 0F
add eax, x
add [401000], 5
add y, " times" // 如果在次之前y="1000" ,則在執行完此指令之後y="1000 times"
AI
--
<Animate Into>
在OllyDbg中執行“自動步入” [Animate into]操作。
例:
ai
AN 地址
-------
<ANalyze>
從指定處,對程式碼進行分析。
例:
an eip // 相當於在OllyDbg中按 Ctrl+A鍵
AND 目的運算元, 源運算元
-------------
<AND>
源運算元與目的運算元進行邏輯與操作,並將結果儲存到到目的運算元中。
例:
and x, 0F
and eax, x
and [401000], 5
ASK 問題
------------
<ASK>
顯示一個提示輸入框,讓使用者輸入,並將結果儲存轉保留變數$RESULT中(如果使用者按了取消鍵,則$RESULT=0)。
例:
ask "Enter new EIP"
cmp $RESULT, 0
je cancel_pressed
mov eip, $RESULT
ASM 地址, 指令
-----------------
<ASseMble>
修改指定地址的指令。
並將修改後的彙編指令長度儲存到保留變數$RESULT中
例:
asm eip, "mov eax, ecx" //將當前指令修改為 mov eax,ecx
AO
--
<Animate Over>
在OllyDbg中執行“自動步過” [Animate over]操作。
例:
ao
BC 地址
-------
<BreakPoint Clear>
清除指定地址的斷點。
例:
bc 401000
bc x
bc eip
BP addr
--------
<BreakPoint>
在指定地址設斷點
例:
bp 401000
bp x
bp eip
BPCND 地址, 條件
----------------
<BreakPoint on CoNDition>
在指定地址處,設定條件斷點。
例:
bpcnd 401000, "ECX==1" //當 程式碼執行到401000且 ecx等於1 時,程式暫停
BPL 地址, 表示式
--------------
<BreakPoint of Logging>
在指定地址處設定記錄斷點,將表示式的結果記錄到記錄視窗中。
例:
bpl 401000, "eax" // 每次執行到401000時,都將eax暫存器的結果記錄
BPLCND 地址, 表示式, 條件
-----------------------
<BreakPoint of Logging on CoNDition>
在指定地址處設定記錄斷點,如果條件為真時,將表示式的結果記錄到記錄視窗中。
例:
bplcnd 401000, "eax", "eax > 1" // 如果執行到401000時,滿足eax>1,則將eax暫存器的結果記錄
BPMC
----
<BreakPoint Memory Clear>
清除記憶體斷點。
例:
bpmc
BPHWC 地址
----------
<BreakPoint HardWare Clear>
刪除指定地址處的硬體斷點。
例:
bphwc 401000 //清除 401000處的斷點
BPHWS 地址, 模式
----------------
<BreakPoint HardWare Set>
在指定地址,設定硬體斷點。有三種模式: "r" - 讀取, "w" - 寫入 或者 "x" - 執行.
例:
bphws 401000, "x" //當執行到此地址時發生中斷
BPRM 地址, 大小
---------------
<BreakPoint on Read Memory>
在指定地址處,設定一個記憶體讀取斷點。 “大小” 是指記憶體中的位元組大小。
例:
bprm 401000, FF //一個位元組
BPWM 地址, 大小
---------------
<BreakPoint on Write Memory>
在指定地址處,設定一個記憶體寫入斷點。“大小” 是指記憶體中的位元組大小。
例:
bpwm 401000, FF
CMP 目的運算元, 源運算元
-------------
<CoMPare>
比較 目的運算元與源運算元的大小,和其對應的彙編指令作用相同。
例:
cmp y, x
cmp eip, 401000
CMT 地址, 字串
--------------
<CoMmenT>
在指定地址處,加入註釋。
例:
cmt eip, "這是入口" //當前地址處 加上 “這是入口”的註釋
COB
---
<Continue On Breakpoint>
發生中斷後,讓指令碼繼續執行(移除EOB指令)
例:
COB
COE
---
<Continue On Exception>
發生異常後,讓指令碼繼續執行(移除EOE指令)
例:
COE
DBH
---
<DeBugger Hided>
隱藏偵錯程式
例:
dbh
DBS
---
<DeBugger Show>
對隱藏的偵錯程式操作進行恢復,不再隱藏。
例:
dbs
DEC 變數
-------
<DECrement by 1>
對變數進行減一操作
例:
dec v
DM 地址, 大小, 檔名
-------------------
<Dump Memory>
從指定地址處開始,在記憶體中提取指定大小的資料,並儲存到指定的檔案中
例:
dm 401000, 1F, "c:\dump.bin"
DMA 地址, 大小, 檔名
-------------------
<Dump Memory Appended>
從指定地址處開始,在記憶體中提取指定大小的資料,並儲存到指定的檔案中;如果指定檔案已存在,則將資料追加到指定檔案尾部。
例:
dma 401000, 1F, "c:\dump.bin"
DPE 檔名, 入口
----------------
<Dump Process with Entry point>
提取執行模組到指定檔案中。
“入口”用來設定入口地址。
例:
dpe "c:\test.exe", eip //入口為當前地址,儲存為C盤下test.exe
EOB 標籤
---------
<Execution On Breakpoint>
在下次中斷髮生時,跳轉到指定標籤處。
例:
eob SOME_LABEL
EOE 標籤
---------
<Execution On Exception>
在下次異常發生時,跳轉到指定標籤處。
例:
eoe SOME_LABEL
ESTI
----
<Exception STep Into>
相當於在OllyDbg按 SHIFT-F7。
例:
esti
ESTO
----
<Exception STep cOntinue>
相當於在OllyDbg按 SHIFT-F9。
例:
esto
EVAL
----
<EVALuate>
計算含義變數的表示式。
變數必須已經在指令碼中宣告。插到字串中時,要放在用大括號{}中。
結果儲存在保留變數$RESULT中Sets the reserved $RESULT variable
例:
var x
mov x, 1000
eval "x的值是 {x}" // 執行後$RESULT為 "x的值是 00001000"
EXEC/ENDE
---------
<EXECute/END of Execute>
對當前除錯程式,執行在EXEC和ENDE之間的指令。
有大括號的,會被大括號中的變數的值替代。
例:
// 以下是做移動操作
var x
var y
mov x, "eax"
mov y, "0DEADBEEF"
exec
mov {x}, {y} // mov eax, 0DEADBEEF 將被執行
mov ecx, {x} // mov ecx, eax 將被執行
ende
// 以下是呼叫除錯程式的ExitProcess函式
exec
push 0
call ExitProcess
ende
ret
FILL 地址, 長度, 值
---------------------
<FILL>
從指定地址開始,在記憶體中填充為指定長度的某個值
例:
fill 401000, 10, 90 // 10位元組的 NOP 指令
FIND 地址, 查詢內容
---------------
<FIND>
從指定地址開始在記憶體中查詢指定的內容。
如果查詢成功,地址會儲存到保留變數$RESULT中,否則$RESULT將等於 0。
查詢的串支援萬用字元“??”(見下面的例子)。
例:
find eip, #6A00E8# // 查詢一個Call,其的第一個引數為0 (push 0)
find eip, #6A??E8# // 查詢一個帶引數的Call
FINDOP 地址, 查詢內容
-----------------
<FIND OPcode>
從指定地址開始查詢指定一個指令,這個指令是以指定內容為開始的。
如果查詢成功,地址會儲存到保留變數$RESULT中,否則$RESULT將等於 0。
查詢的串支援萬用字元“??”(見下面的例子)。
例:
findop 401000, #61# // find next POPAD
findop 401000, #6A??# // find next PUSH of something
譯者注:
對比一下FIND 和FINDDOP的區別:
地址 資料 程式碼
00401007 B8 3300 MOV EAX, 33
0040100C 33F6 XOR ESI, ESI
find 401007, #33# //$RESULT等於401008
finddop 401007, #33# //$RESULT等於40100C
GN 地址
-------
<Get Name>
獲得指定地址的符號名(比如指向API函式)。
符號名將儲存到保留變數$RESULT中。如果符號名是一個API函式,則$RESULT_1儲存連結庫名(比如 kernal32)而 $RESULT_2儲存符號名(比如 ExitProcess)。
例:
gn 401000
GPA 函式名, 動態連結庫名
-------------
<Get Procedure Address>
在指定的動態連結庫中,獲得指定函式的地址。
如果查詢成功,地址會儲存到保留變數$RESULT中,否則$RESULT將等於 0。
在設定API函式斷點時,這個指令非常有效。
例:
gpa "MessageBoxA", "user32.dll" // 這條指令執行後,$RESULT等於函式MessageBoxA的地址,您可以使用"bp $RESULT"設定斷點。
GO 地址
-------
<GO>
執行到指定地址處 (相當於SoftICE中的 G 命令)
例:
go 401005
GMI 地址, 資訊
--------------
<Get Module Info>
獲得指定地址所在模組的相關資訊。
“資訊”可以是模組基地址[MODULEBASE], 模組大小[MODULESIZE], 程式碼段基地址[CODEBASE] 或者 程式碼段大小[CODESIZE]
(如果您想在將來的版本中,獲得更多的資訊,請聯絡我)。
資訊會儲存到保留變數$RESULT中 (如果沒有找到資訊,則$RESULT等於0).
例:
GMI eip, CODEBASE // 這條指令執行後,$RESULT等於當前所在模組的程式碼段基地址。
INC 變數
-------
<INCrement by 1>
對變數進行加一操作
例:
inc v
JA 標籤
--------
<Jump if Above>
在cmp命令後使用. 和其對應的彙編指令作用相同.
例:
ja SOME_LABEL
JAE 標籤
---------
<jump if Above or Equal>
cmp. 和其對應的彙編指令作用相同.
例:
jae SOME_LABEL
JB 標籤
--------
<Jump if Below>
在cmp命令後使用. 和其對應的彙編指令作用相同.
例:
jb SOME_LABEL
JBE 標籤
---------
<Jump if Below or Equal>
在cmp命令後使用。和其對應的彙編指令作用相同.
例:
jbe SOME_LABEL
JE 標籤
--------
<Jump if Equal>
在cmp命令後使用. 和其對應的彙編指令作用相同.
例:
je SOME_LABEL
JMP 標籤
---------
<JuMP>
跳轉到指定標籤.
例:
jmp SOME_LABEL
JNE 標籤
---------
<Jump if Not Equal>
在cmp命令後使用. 和其對應的彙編指令作用相同.
例:
jne SOME_LABEL
LBL 地址, 字串
--------------
<LaBel Insert>
在指定地址處插入一個標籤
例:
lbl eip, "NiceJump"
LOG 源運算元
-------
<log>
將源運算元輸出到OllyDbg的記錄視窗[log window]中。
如果源運算元 是一個字串常量,則原樣記錄。
如果源運算元 是一個變數或一個暫存器,則記錄名稱及其存放的數值
例:
log "Hello world" // 記錄為 "Hello world"
var x
mov x, 10
log x // 記錄為 "x = 00000010"
MOV 目的運算元, 源運算元
-------------
<MOVe>
將源運算元移動到目的運算元中。
源運算元可以是一個十六進位制序列格式#某個十六進位制序列#,例如:#1234#。
提醒:十六進位制序列的位長只能是偶數,比如2, 4, 6, 8等等。
例:
mov x, 0F
mov y, "Hello world"
mov eax, ecx
mov [ecx], #00DEAD00BEEF00#
mov !CF, 1
mov !DF, !PF
mov [403000], "Hello world"
MSG 訊息
-----------
<MeSsaGe>
將指定訊息,顯示到一個對話方塊中。
例:
MSG "指令碼暫停"
MSGYN message
-----------
<MeSsaGe Yes or No>
將指定訊息,顯示到一個對話方塊中,這個對話方塊有“是”、“否”按鈕。
如果點“是”,保留變數 $RESULT 等於1,否則保留變數$RESULT等於0 。
例:
MSGYN "繼續?"
OR 目的運算元, 源運算元
-------------
<OR>
源運算元和目的運算元做邏輯或操作,並將結果儲存到到目的運算元中。
例:
or x, 0F
or eax, x
or [401000], 5
PAUSE
-----
<PAUSE>
暫停指令碼執行。可以通過外掛選單恢復指令碼執行。
例:
pause
REPL addr, find, repl, len
--------------------------
REPL 地址, 查詢字串, 替換字串, 長度
--------------------------
<REPLace>
在指定地址開始,在指定長度位元組內,用“替換字串”替換“查詢字串”。
允許使用萬用字元
例:
repl eip, #6a00#, #6b00#, 10
repl eip, #??00#, #??01#, 10
repl 401000, #41#, #90#, 1F
RET
---
<RETurn>
退出指令碼。
例:
ret
RTR
---
<Run To Return>
相當於在OllyDbg中執行 "Run to return" [Ctrl+F9]操作。
例:
rtr
RTU
---
<Run To User code>
相當於在OllyDbg中執行 "Run to user code"[Alt+F9] 操作。
例:
rtu
RUN
---
<RUN>
相當於在OllyDbg中按 F9。
例:
run
SHL 目的運算元, n
-------------
左移目的運算元,n位元位;並將結果儲存到到目的運算元中。
例:
mov x, 00000010
shl x, 8 // x is now 00001000
SHR目的運算元, n
-------------
<SHift Right>
右移目的運算元,n 位元位;並將結果儲存到到目的運算元中。
例:
mov x, 00001000
shr x, 8 // x is now 00000010
STI
---
<STep Into>
相當於在OllyDbg中按 F7,單步步入。
例:
sti
STO
---
<STep Over>
相當於在OllyDbg中按 F8,單步步過。
例:
sto
SUB dest, src
-------------
Substracts src from dest and stores result in dest
Example:
sub x, 0F
sub eax, x
sub [401000], 5
TI
--
<Trace Into>
相當於在OllyDbg中執行 "Trace into" 操作。
例:
ti
TICND cond
----------
<Trace Into Condition>
執行 "Trace into" 操作,直到條件為真時停止。
例:
ticnd "eip > 40100A" // 當 eip > 40100A 時停止
TO
--
<Trace Over>
相當於在OllyDbg中執行 "Trace over" 操作。
例:
to
TOCND cond
----------
<Trace Over Condition>
執行 "Trace over" 操作,直到條件為真時停止。
例:
tocnd "eip > 40100A" // 當 eip > 40100A 時停止
VAR
---
<VARiable>
在指令碼中,宣告一個變數。
必須在變數使用先宣告。
例:
var x
XOR 目的運算元, 源運算元
-------------
<XOR>
源運算元與目的運算元進行異或操作,並將結果儲存到到目的運算元中。
例:
xor x, 0F
xor eax, x
xor [401000], 5
3.2 標籤
----------
定義標籤,要在標籤名後面要加上一個冒號.
例:
SOME_LABEL:
3.3 註釋
------------
您可以使用“//”在任何地方進行註釋。
塊註釋必須另外起一行並以 “/*”做為開始,以“*/”作為結束,“*/”也必須另起一行。
例:
/*
您的註釋
*/
3.4 選單
---------
OllyScript的主選單包含了下面幾項:
- Run script...[執行指令碼...]: 使用者選擇一個指令碼,並執行這個指令碼。
- Abort [中止]: 中止指令碼執行
- Pause [暫停]: 暫停指令碼執行
- Resume[恢復]: 恢復指令碼執行
- About [關於]: 顯示此外掛資訊
------------------------------
4. 嵌入其他的外掛
---------------------------------
您可以在您的外掛中呼叫OllyScrip,並且執行一個指令碼。
使用類似於下面的程式碼進行呼叫:
HMODULE hMod = GetModuleHandle("OllyScript.dll");
if(hMod) // 檢測是否被其他外掛載入
{
// 獲得輸出函式地址
int (*pFunc)(char*) = (int (*)(char*)) GetProcAddress(hMod, "ExecuteScript");
if(pFunc) // 檢查是否獲得輸出函式
pFunc("myscript.txt"); // 執行輸出函式
}
------------------------------
5. 如何聯絡我
-------------
您可以在論壇提交問題,也可以用IRC 在EFnet的給SHaG發訊息。當然您也可以直接寫信給我,我的信箱是:shag(at)apsvans.com。
------------------------------
6. 特許與原始碼
--------------------------
過一段時間,我打算賣這個外掛,你想繼續使用的話必須要交很高的費用!:P,嘿嘿,開個玩笑。
嚴肅的說,只要您需要,您可以免費使用這個外掛及其原始碼。
但是請您在您的文件和版權對話方塊中,標註上我的名字。
如果您的工程,大規模的使用我了的程式碼。也請您通知我,我會關心一下的。
這個外掛的原始碼可以隨時提供給您。 如果您需要原始碼的話,請發郵件!
------------------------------
7. 鳴謝!
----------
對於所有提交Bug、編寫指令碼以及提供寶貴建議的朋友,我表示感謝。
感謝R@dier提供Dump引擎。
當然,特別要感謝Olly,是他開發出瞭如此優秀的偵錯程式!
------------------------------
相關文章
- Linux設定中文幫助文件、常見目錄、幫助命令2020-11-27Linux
- 急需java開發工具的中文幫助文件!2004-11-28Java
- jdk幫助文件2024-10-04JDK
- jQuery 幫助文件 api2018-08-30jQueryAPI
- Linux幫助文件2018-07-26Linux
- 平臺幫助文件2020-09-25
- java API 幫助文件2008-09-16JavaAPI
- kafka官方幫助文件2024-08-07Kafka
- ExtJs2.2中文版API幫助文件2009-11-26JSAPI
- api和api幫助文件2024-06-17API
- 替換NULL值幫助文件2020-12-25Null
- Git檢視本地幫助文件2018-05-13Git
- LDTP幫助文件翻譯版2013-08-21
- HTML+CSS 幫助文件API2011-09-05HTMLCSSAPI
- ArcGIS開發幫助文件地址2012-09-19
- Python檢視模組幫助/文件2019-01-30Python
- 由struts原始碼生成幫助文件2013-10-17原始碼
- Remote Desktop Manager_幫助文件2016-02-03REM
- 那位大哥有javapackage api幫助文件2005-01-29JavaPackageAPI
- Oracle 官方Java Jdk1.8_API幫助文件+Android 開發幫助文件(中英文版)2018-09-09OracleJavaJDKAPIAndroid
- Java開發必備:java幫助文件網址下載或線上幫助2016-07-05Java
- Sandcastle入門:建立C#幫助文件2008-06-24ASTC#
- JavaWeb名詞解釋及幫助文件2024-07-02JavaWeb
- man 命令顯示簡體中文幫助2020-10-15
- 給你的WP應用加上幫助文件2014-08-28
- CodeSmith自帶的幫助文件中FAQ2011-05-19MIT
- Slackware LILO 安裝幫助文件(轉)2007-08-10
- Microsoft Visual Studio 2012 文件 下載地址 vs2012 中文幫助文件2014-12-19ROS
- 如何生成java api document 相似的文件幫助(2)2016-09-11JavaAPI
- 如何生成java api document 相似的文件幫助(1)2016-09-11JavaAPI
- Linux 常用基本命令 檢視幫助文件2017-07-11Linux
- DWR幫助文件-dwr.xml檔案的配置2007-09-27XML
- 文件管理系統如何幫助企業高效發展2022-08-25
- 也進軍前端~前端框架:ElementUI圖示幫助文件2018-03-21前端框架UI
- Install VMware Tools in a Linux Guest(摘自vmware幫助文件)2011-05-05Linux
- 幫助文件:使用VNCServer遠端連線伺服器2016-03-19VNCServer伺服器
- Mac/Linux 安裝中文版 man 幫助命令2019-02-21MacLinux
- Xcode常用外掛使用及自動生成幫助文件2015-03-18XCode