OllyScript v0.92中文幫助文件

看雪資料發表於2015-11-15

以下內容為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,是他開發出瞭如此優秀的偵錯程式!

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

相關文章