ODbgscript 1.82.x Document

OllyScript腳本語言是一個種類彙編的語言。你使用它來控制ODbgScript和腳本運行.
 
在後面的文檔中, 「源操做數」 和 「目的操做數」表示如下含義:
- 十六進制常數,既沒有前綴也沒有後綴。 (例如:是00FF, 而不是 0x00FF 和 00FFh的形式)
  十進制常數,在後綴中加點. (例如:100. 128.也能夠是浮點數128.56,浮點數只能保留小數點後2位)
- 變量,這個變量必須在使用前用Var進行定義
- 32位寄存器 (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP)。
  16位寄存器 (AX, BX, CX, DX, SI, DI, BP,SP)
  8位的寄存器(AL, AH, ... DL, DH)
- 被中括號括起來的內存地址 (例如:[401000]指向內存地址爲401000裏存放分數據, 
  [ecx] 指向內存地址爲寄存器ecx裏存放分數據).
- 一個標誌位,帶有感嘆號前綴(!CF, !PF, !AF, !ZF, !SF, !DF, !OF)
- 字符串,也可叫數據序列。其格式爲: #6A0000#(數值在兩個「#」號之間),兩個「#」號之間必須包含至少有一個數值。
                             "1234567ABCDEF"
- 包含「?」通配符的字符串。好比 #6A??00# 或者 #6?0000#
 
3.1.1 保留變量
------------------------
 
$RESULT
-------
<RESULT>
保存某些函數的返回值,好比FIND函數運行後的結果,等等。
在ODbgScript的腳本調試窗口,你能觀察到它的變化,而且能夠修改它.
 
 
$VERSION
--------
<VERSION>
ODBGScript的版本信息,它是系統保留變量名.
例:
cmp $VERSION, "1.47"  //比較是否大於 1.47版
ja version_above_147  
 
 
3.1.2 指令
----------------------------------------------
 
#INC "文件名"  
---------
 
一個腳本文件包含另一個腳本.就像調用子程序同樣.兩個腳本中的變量名不能相同.
例:
#inc "test.txt"    
 
 
#LOG
---------
開始記錄運行指令
指令會顯示在OllyDbg的log窗口中,每條記錄前都會加上「-->」的前綴
例:
#log
 
 
ADD 目的操做數,源操做數
---------
<ADD>
源操做數與目的操做數相加,並把相加的結果保存到目的操做數中,支持字符串相加.
例: 
add x, 0F         //x=x+F
add eax, x        //eax=eax+x
add [401000], 5   //[401000]=[401000]+5
浮點數相加

CMP 目的操做數, 源操做數php

 
 
AI
------------
<Animate Into>
在OllyDbg中執行「自動步入」 [Animate into]操做。
至關於在OllyDbg中按下CTRL+F7
例:
ai
 
ALLOC 大小
----------
申請內存, 你能讀/寫/執行.
例:
  alloc 1000        //新申請內存,大小爲1000,返回結果$RESULT放着申請內存的開始地址.
  free $RESULT, 1000
 
AN 地址
-------
<ANalyze>
從指定地址處,對代碼進行分析。
例:
an eip //   至關於在OllyDbg中按 Ctrl+A鍵
 
 
AND 目的操做數, 源操做數
-------------
<AND>
源操做數與目的操做數進行邏輯與操做,並將結果保存到到目的操做數中。
例: 
and x, 0F               //x=x&&f
and eax, x              //eax=eax&&x
and [401000], 5          //[401000]=[401000]&&5
 
 
AO
--
<Animate Over>
在OllyDbg中執行「自動步過」 [Animate over]操做。
至關於在OllyDbg中按下CTRL+F8
例:
ao
 
ASK 問題
------------
<ASK>
顯示一個提示輸入框,讓用戶輸入,結果保存變量$RESULT中(若是用戶按了取消鍵,則$RESULT=0)。
$RESULT_1中放着輸入的長度.
(注:程序將判讀你輸入的是字符,$RESULT_1的結果是輸入字符數的數目,整型/2,中文數*2)
例:
ask "Enter new EIP"
cmp $RESULT, 0
je cancel_pressed
mov eip, $RESULT
 
 
ASM 地址, 指令
-----------------
<ASseMble>
修改指定地址的指令。
並將修改後的彙編指令長度保存到保留變量$RESULT中
例:
asm eip, "mov eax, ecx" //將當前指令修改成 mov eax,ecx
 
ASMTXT 文件 
-----------------
<ASseMble>
彙編指定文件中的指令。
將彙編指令長度保存到保留變量$RESULT中
並將彙編指令行數保存到保留變量$RESULT_1中
例:
asmtxt EIP,"myasm.txt"//將myasm.txt文件中的asm轉成opcode後寫入EIP.
 
 
ATOI str [, base=16.]
-----------------
轉換字符串到16進制整型,[能夠將任何進制轉成16進制整型]
返回結果放到 $RESULT 
例:
itoa "F"        //字符串"F"轉成了整型,結果會等於F
itoa "10", 10.   //字符串"10"表明十進制,結果會等於A
 
BC 地址
-------
<BreakPoint Clear>
清除指定地址的斷點。
例:
bc 401000        //清除401000處的斷點
bc x             //清除X(變量值)處的斷點
bc eip           //清除當前EIP處的斷點
 
BP addr
--------
<BreakPoint>
在指定地址設斷點
例:
bp 401000        //在401000處下斷點
bp x             //在X(變量值)處下斷點 
bp eip           //在當前EIP處下斷點
 
BPCND 地址, 條件
----------------
<BreakPoint on CoNDition>
在指定地址處,設置條件斷點。
例:
bpcnd 401000, "ECX==1" //當 代碼執行到401000且 ecx等於1 時,程序暫停
 
BPD 函數字符串
---------------
清除調用函數斷點,函數爲字符串表示.
例:
bpd "GetVersion"   //取消呼叫GetVersion的斷點
 
 
BPHWC 地址
----------
<BreakPoint HardWareClear>
刪除指定地址處的硬件斷點。
例:
bphwc 401000 //清除 401000處的斷點
bphwc //不接地址默認清楚所有 等同於bphwcall
 
BPHWCALL
-----------
清除全部的硬件斷點
例:
BPHWCALL    //清除全部的硬件斷點
 
 
BPHWS 地址, 模式
----------------
<BreakPoint HardWare Set>
在指定地址,設置硬件斷點。有三種模式: "r" - 讀取, "w" - 寫入 或者 "x" - 執行.
此斷點只支持1個字節的動做.
例:
bphws 401000, "x" //當執行到此地址時產生中斷.
Bphws 401000,"r"  //當讀取401000的時候產生中斷
 
 
BPL 地址, 表達式
--------------
<BreakPoint of Logging>
在指定地址處設置記錄斷點,將表達式的結果記錄到記錄窗口中。
例:
bpl 401000, "eax" // 每次執行到401000時,都將eax寄存器的結果記錄
 
 
BPLCND 地址, 表達式, 條件
-----------------------
<BreakPoint of Logging onCoNDition>
在指定地址處設置記錄斷點,若是條件爲真時,將表達式的結果記錄到記錄窗口中。
例:
bplcnd 401000, "eax", "eax > 1" //若是執行到401000時,知足eax>1,則將eax寄存器的結果記錄
 
 
BPMC
----
<BreakPoint Memory Clear>
清除內存斷點。
例:
bpmc
 
 
BPRM 地址, 大小
---------------
<BreakPoint on ReadMemory>
在指定地址處,設置一個內存讀取斷點。 「大小」 是指內存中的字節大小。
例:
bprm 401000, FF //在401000中設置內存讀斷點,內存中的大小爲FF
 
 
BPWM 地址, 大小
---------------
<BreakPoint on WriteMemory>
在指定地址處,設置一個內存寫入斷點。「大小」 是指內存中的字節大小。
例:
bpwm 401000, FF  //在401000中設置內存寫斷點,內存中的大小爲FF
 
 
BPX 函數字符串
---------------
設置調用函數斷點,函數爲字符串表示.
返回下了斷點的地址數量,結果保存在保留變量$RESULT中.
例:
bpx "GetVersion"   //下呼叫GetVersion斷點,斷下的語句爲call [xxxxx]
 
BUF var
-------
轉換字符串變量到緩衝區(string/dword variable to a Buffer)
Example: 
mov s, "123"
buf s
log s // output "#313233#
 
CMP 目的操做數, 源操做數
-------------
<CoMPare>
比較 目的操做數與源操做數的大小,和其對應的彙編指令做用相同。
能夠是各類數值,甚至能夠是字符串(對大小不敏感).
例: 
cmp y, x        //比較兩個變量(Y和X)的大小,
cmp eip, 401000   //比較EIP和401000的大小
這裏能夠設置比較的數的長度 好比 cmp [eip],#ff25#,2 這裏比較EIP所在的指令 前兩個字節是不是FF25
測試代碼以下:
00581DAC   $- FF25 C0B55B00 jmp     dword ptr [5BB5C0]


CMT 地址, 字符串
--------------
<CoMmenT>
在指定地址處,加入註釋。
例:
cmt eip, "這是入口" //當前地址處 加上「這是入口」的註釋
 
COB
---
<Continue On Breakpoint>
發生中斷後,讓腳本繼續執行(移除EOB指令)
例:
COB
 
COE
---
<Continue OnException>(移除EOE指令)
發生異常後,讓腳本繼續執行
例:
COE
 
DBH
---
<DeBuggerHided> 
隱藏調試器
例:
dbh
 
DBS
---
<DeBugger Show>
對隱藏的調試器操做進行恢復,再也不隱藏。
例:
dbs
 
DEC 變量
-------
<DECrement by 1>
對變量進行減一操做
例:
dec v          //V=V-1
 
 
DIV 目的操做數, 源操做數
-------------
<div>
源操做數與目的操做數進行除法操做,並將結果保存到到目的操做數中。
例: 
div x, 0F       //X=X/0F
div eax, x      //eax=eax/x
div [401000], 5  //[401000]/5
 
 
DM 地址, 大小, 文件名
-------------------
<Dump Memory>
從指定地址處開始,在內存中提取指定大小的數據,並保存到指定的文件中
例:
dm 401000, 1F, "c:\dump.bin"
 
DMA 地址, 大小, 文件名
-------------------
<Dump Memory Appended>
從指定地址處開始,在內存中提取指定大小的數據,並保存到指定的文件中;如
果指定文件已存在,則將數據追加到指定文件尾部。
例:
dma 401000, 1F, "c:\dump.bin"
 
DPE 文件名, 入口
----------------
<Dump Process with Entrypoint>
提取執行模塊到指定文件中。
「入口」用來設定入口地址。
這個命令用來抓取文件,仍是比較好用的,由於直接利用了OD強大的內存管理功能.
例:
dpe "c:\test.exe", eip //入口爲當前地址,保存爲C盤下test.exe
 
EOB 標籤
---------
<Execution On Breakpoint>
在下次中斷髮生時,跳轉到指定標籤處。
此功能和EOE命令經常讓新手疑惑不解,其實就是碰見中斷作腳本的流程轉向.
若是還有不懂,請看下文的答疑解惑章節.
例:
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
通常來講用這個 不用F9多 由於Shift+F9 忽略異常運行
 
EVAL 
----
<EVALuate>
計算含義變量的表達式。
變量必須已經在腳本中聲明。
注意:插到字符串中時,要放在大括號{ }中。
結果保存在保留變量$RESULT中.
這句和其它語句結合將產生不少的變化,用好它將讓你的腳本十分靈活.
例:
var x
mov x, 1000
eval "x的值是 { x }" // 執行後$RESULT爲 "x的值是00001000"
 
 
EXEC/ENDE
---------
<EXECute/END of Execute>
對當前調試進程,執行在EXEC和ENDE之間的指令。
有這個命令就是你能夠直接跳入進程,對進程進行直接控制.
它的原理就是取當前進程的信息進行保存,而後新分配一個代碼內存區(可讀/寫/執行.大小1000)
調用OD彙編器將你的彙編語句轉成OPcode,將OPcode拷貝到代碼區,而後將EIP指向你的代碼開頭.
而後將控制權交給你.執行完後將EIP歸還原位,而後將控制權交還ODbgScript.
這裏的好處就是讓你以很高的效率來避免在較慢的腳本環境運行須要高效的操做.
!注意:因爲進程控制權交給你了,那麼,你的代碼有效性將只有你本身來控制了.
!注意:執行後不保存現場.這都須要你來作工做.(要保存現場,你可使用pushad,popad)
有大括號的,會被大括號中的變量的值替代。
例:
// 如下是作移動操做
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 addr,len,value
-------------------------
從地址addr開始填充長度爲len的值value
!注:value的值最大8個字節,能夠爲寄存器值,標誌位值,變量值,16進制值,10進制值,[]指針操做數.
如:
fill 401000,10,90       //NOP 10h個字節
fill 401000,ff,[eax]      //取出[eax]值,填充到401000,長度爲ff
fill 401000,ff,$RESULT    //將變量$RESULT的值填充到401000,長度爲ff
 
FIND 地址, 查找內容 ,[最大大小]
---------------
<FIND>
從指定地址開始在內存中查找指定的內容。
若是查找成功,地址會保存到保留變量$RESULT中,不然$RESULT將等於 0。
查找的串支持通配符「??」(見下面的例子)。
##中的爲HEX,""中的爲字符串,什麼都不帶的爲內存數據
!注:輸入的16進制字符必須是成偶數
   從1.52版開始支持直接變量和數據查找.
例:
find eip, #6A00E8# // 查找一個Call,其的第一個參數爲0 (push 0)
find eip, #6A??E8# // 查找一個帶參數的Call,一個?表明一個字符常量
find eip,"kernel32.dll" //查找字符串"kernel32.dll"
find eip,"ker???32.d??" //查找帶通配符的?字符串,一個?表明一個字符串常量
                       (請注意這裏的通配符?和HEX中的?不一樣)
 
find eip,15ff     //查找內存數據15ff(代碼爲ff115)
(mov tmp,#ff15#
 find eip,tmp )   //查找變量tmp中的數值,tmp=ff15
(mov tmp,"kernel32.dll"
find eip,tmp  )   //查找變量tmp中的字符串"kernel32.dll"
(mov tmp,15ff
 find eip,tmp    //查找變量tmp中的內存數據15ff(注意和#ff15#區別)
(ask "輸入須要的數據"
find eip,$RESULT      //輸入的爲#ff15#,"Kernel32.dll",15ff就同上面三例子
 
find eip,#ff15#,ff //從EIP開始,FF大小範圍內,查找字符ff15,
 
 
FINDCMD 地址, 查找內容
-----------------
<FIND command>
從指定地址開始查找指定一個命令。 
若是查找成功,地址會保存到保留變量$RESULT中,不然$RESULT將等於 0。
例:
findcmd 401000, "push eax" // find "push eax"
 
 
FINDCMDS 地址, 查找內容
-----------------
<FIND command>
從指定地址開始查找指定命令序列。 
若是查找成功,地址會保存到保留變量$RESULT中,不然$RESULT將等於 0。
注:命令序列分割請使用;號(分號).
 
例:
findcmd 401000, "push eax;mov eax,edx" //    尋找"push eax和mov eax,edx"命令序列
 
 
FINDOP 地址, 查找內容,[查找範圍]
-----------------
<FIND OPcode>
從指定地址開始查找指定一個指令,這個指令是以指定內容爲開始的。 
若是查找成功,地址會保存到保留變量$RESULT中,不然$RESULT將等於 0。
查找的串支持通配符「??」(見下面的例子)。
注意:findop因爲是opcode查找,不支持字符串查找.
    findop和find的區別是findop查找到的必須是opcode.
1.52起支持直接變量和內存數據
例:
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
 
 
FINDMEM what [, StartAddr]
--------------------------
從整個內存開始在內存中查找指定的內容
若是查找成功,地址會保存到保留變量$RESULT中,不然$RESULT將等於 0。
查找的串支持通配符「??」(見下面的例子)。
Example:
findmem #6A00E8# // find a PUSH 0 followed by some kind ofcall
findmem #6A00E8#, 00400000 // search it after address00400000
此命令查找十六進制的變量有爲有效,由於Find不會把變量固然一個十六進制來查找。

FREE
FREE 地址 大小
-----------
釋放由ALLOC申請的內存.
Example:
 alloc 1000
 free $RESULT, 1000
 
GAPI
GAPI 地址
------------
得到指定代碼處的API調用信息
API信息保存到保留變量$RESULT中。
若是符號名是一個API函數,則
$RESULT保存API信息
$RESULT_1保存連接庫名(好比 kernal32)
$RESULT_2保存符號名(好比 ExitProcess)。
$RESULT_3保存調用地址XXXX(好比 call xxxxx)
注意:這個和GN的區別是GN必須指向IAT地址
    而GAPI直接給出代碼地址就可得出API
    還有若是你是在此處下了軟件斷點,請先清除斷點再用此句,由於軟件斷點修改了代碼爲CC
這裏若是不清除此處的軟件斷點,將形成這句不能很好的識別.
例:
GAPI 401000   (callkernal32.ExitProcess)
GAPI EIP   //查看當前代碼是不是API調用,不是則返回0
 
 
GCMT addr
---------
得到指定地址處的解釋
 
GCI addr, info
--------------
得到制定地址的彙編指令信息
 

"info"能夠是:
-彙編指令字符串 例:gci eip,COMMAND
 就象用OPCODE eip同樣
-目標地址 ,例: gci eip,DESTINATION
  用於jump/call/return指令
-命令長度,例: gci eip,SIZE
-類型, 例:gci eip,TYPE
-條件,例:gci eip,CONDITION
返回值:$RESULT
windows

 
-獲得指令目標地址(DESTINATION) 
好比 :
004B3DF0   0F85 D7010000   jnz     004B3FCD
EIP:004B3DF0  
gci eip,DESTINATION
這裏的$RESULT等於004B3FCD

SIZE 和 TYPE 能夠判斷出一條指令 修復花指令頗有用 好比:
  1. 004B52FD   /2E:EB 01                     jmp     short 004B5301  
  2. 004B5300   |F0:8D740D D3                 lock lea esi, dword ptr [ebp+ecx-2D]       
  3. 004B5305    2BF1                         sub     esi, ecx  
修復帶參數的EB花指令 經過SIZE和3 TYPE和58 就能夠尋找修復 TYPE的值是經過 gci 004B52FD,TYPE獲得的 而後用於判斷其餘地方是否同樣

GMEMI addr, info
----------------
得到指定地址處內存的信息.
信息能夠是 MEMORYBASE, MEMORYSIZE or MEMORYOWNER
Example:
GMEMI addr, MEMORYBASE // After this $RESULT is the address tothe memory base of the memory block to which addr belongs
 
GMI 地址, 信息
--------------
<Get Module Info>
得到指定地址所在模塊的相關信息。
「信息」能夠是
  MODULEBASE:   模塊基地址(baseaddress of module in the memory space of debugged process)
  MODULESIZE:   模塊大小(totalsize occupied by module, not necessarily contiguous memory)
  CODEBASE:    代碼段基地址
  CODESIZE:    代碼段大小(size of executable code, as stays in COFFheader. In some cases, OllyDbg may correct definitely invalid codesize)
  DATABASE:    數據段基地址
  RESBASE:     資源段基地址
  RESSIZE:     資源段大小
  IDATATABLE:   輸入表基地址(baseaddress of import data table, as stays in COFF header)
  entry:       模塊入口(ddressof module's entry point, as stays in COFF header)
  nsect:       節數目(Numberof sections in the module)
(若是您想在未來的版本中,得到更多的信息,請聯繫我)。
信息會保存到保留變量$RESULT中 (若是沒有找到信息,則$RESULT等於0).
例:
GMI eip, CODEBASE // 這條指令執行後,$RESULT等於當前所在模塊的代碼段基地址。
 
GN 地址
-------
<Get Name>
得到指定IAT地址的符號名(好比指向API函數)。
符號名將保存到保留變量$RESULT中。
若是符號名是一個API函數,則
$RESULT是符號名
$RESULT_1保存連接庫名(好比 kernal32)
$RESULT_2保存符號名(好比 ExitProcess)。
例:
gn 450100
 
GO 地址
-------
<GO>
執行到指定地址處 
例:
go 401005
 
GPA 函數名, 動態連接庫名
-------------
<Get Procedure Address>
在指定的動態連接庫中,得到指定函數的地址。
若是查找成功,地址會保存到保留變量$RESULT中,不然$RESULT將等於 0。
在設置API函數斷點時,這個指令很是有效。(API斷點API)
例:
gpa "MessageBoxA", "user32.dll" //這條指令執行後,$RESULT等於函數MessageBoxA的地址,您能夠
使用"bp $RESULT"設置斷點。
 
GPI key
-------------
得到進程的信息.
這個信息能夠是HPROCESS,PROCESSID,HMAINTHREAD,MAINTHREADID,MAINBASE,
PROCESSNAME,EXEFILENAME,CURRENTDIR,SYSTEMDIR

CURRENTDIR:當前PE文件全路徑目錄


GPP key
--------------
find API parameters number and types
 
HANDLE x, y, class
---------------------
返回指定點(16進制)子窗口指定類的句柄
 
 
INC 變量
-------
<INCrement by 1>
對變量進行加一操做
例:
inc v
 
ITOA n [, base=16.]
-----------------
轉化一個整數到字符串
結果放在 $RESULT 
Example:
itoa F
itoa 10., 10.
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
 
KEY vkcode [, shift [, ctrl]]
--------------------------
仿真按下鍵盤.
Example:
key 20
key 20, 1 //Shift+space
key 20, 0, 1 //Ctrl+space

這個命令能夠模仿OD中任意快捷鍵的功能 
好比腳本ctrl+F2從新載入功能 就能夠經過KEY 71,0,1來模擬
vkcode(虛擬鍵碼)的具體值能夠查詢masm環境下的windows.inc文件 
好比:
VK_F2                                equ 71h
因此 模擬ctrl+f2 就是 KEY 71,0,1
這裏的vkcode都是16進制的

LBL 地址, 字符串
--------------
<LaBel Insert>
在指定地址處插入一個標籤
例:
lbl eip, "NiceJump"
 
LC
----
清理LOG窗口
 
LCLR
----
清理Script Log窗口
 
LEN str
--------------
得到字符串長度,結果放在$RESULT
Example:
len "NiceJump"
msg $RESULT
LM addr, size, filename
-------
引導Dm文件進內存
Example:
  lm 0x401000, 0x100, "test.bin"
  
LOG 源操做數
-------
<log>
將源操做數輸出到OllyDbg的記錄窗口[log window]中。
若是源操做數 是一個字符串常量,則原樣記錄。
若是源操做數 是一個變量或一個寄存器,則記錄名稱及其存放的數值
例:
log "Hello world" // 記錄爲 "Hello world"
var x
mov x, 10
log x // 記錄爲 "x = 00000010" 
 
MOV 目的操做數, 源操做數,最大字節
-------------
<MOV>
將源操做數移動到目的操做數中。
源操做數能夠是一個十六進制序列格式#某個十六進制序列#,例如:#1234#。
提醒:十六進制序列的位長只能是偶數,好比2, 4, 6, 8等等。
例: 
mov x, 0F                     //將F傳給變量x
mov y, "Hello world"            //將字符串"Hello world"傳給變量y
mov eax, ecx                   //同彙編
mov [ecx], #00DEAD00BEEF00#      //將##內的內容傳到ecx的地址中
mov !CF, 1                    //賦值!CF標誌寄存器爲1
mov !DF, !PF                  //將!PF賦值給!DF
mov [403000], "Hello world"      //直接將字符串"Helloworld"傳送到403000的地址中
mov eax,[401000],1             //只取401000地址中的一個字節長度的內容傳送到eax中(新功能)
 
MSG 消息
-----------
<MeSsaGe>
將指定消息,顯示到一個對話框中。
例:
MSG "腳本暫停"
 
MSGYN message
-----------
<MeSsaGe Yes or No>
將指定消息,顯示到一個對話框中,這個對話框有「是」、「否」按鈕。
若是點「是」,保留變量 $RESULT 等於1,不然保留變量$RESULT等於0 。
例:
MSGYN "繼續?"
 
 
MUL 目的操做數, 源操做數
-------------
<mul>
源操做數與目的操做數進行乘法操做,並將結果保存到到目的操做數中。
例: 
mul x, 0F
mul eax, x
mul [401000], 5
 
NEG 操做數
-------------
<NEG>
操做數作取補操做,並將結果保存到到操做數中。
例: 
NEG x, 0F
NEG eax
NEG [401000]
 
NOT 操做數
-------------
<NOT>
操做數作邏輯非操做,並將結果保存到到操做數中。
例: 
NOT x, 0F
NOT eax
NOT [401000]
 
 
OPCODE addr
-----------
反彙編指定地址處的代碼.
$RESULT是opcode
$RESULT_1是彙編代碼
$RESULT_2是字節數
若是不是opcode,$RESULT_2將返回0
Example: 
opcode 00401000
 
opentrace
------------
打開運行跟蹤功能,關閉它請使用TC
 
 
OR 目的操做數, 源操做數
-------------
<OR>
源操做數和目的操做數作邏輯或操做,並將結果保存到到目的操做數中。
例: 
or x, 0F
or eax, x
or [401000], 5
 
PAUSE
-----
<PAUSE>
暫停腳本運行。能夠經過插件菜單恢復腳本運行。
例:
pause
 
 
PREOP addr
----------
回溯指定地址的彙編命令
注意: 這個命令並不能真實的反映EIP前的包含jmp的命令
Example:
preop eip
 
 
READSTR addr,maxsize
-----------
從addr處讀指定大小的字符串
Example:
    readstr 401000,15
 
REF addr
--------
至關於在OllyDbg按 Ctrl R.
$RESULT variable is set to the first referenceaddr 
$RESULT_1 to the opcode (text asmcommand) 
$RESULT_2 to the comment (like referencewindow). 
Repeat "REF addr" until $RESULT=0 to get next refs
Example:
continue:
REF eip
log $RESULT
log $RESULT_1
log $RESULT_2
cmp $RESULT,0
jne continue
 
REPL addr, find, repl, len
--------------------------
REPL 地址, 查找字符串, 替換字符串, 長度
--------------------------
<REPLace>
在指定地址開始,在指定長度的字節範圍內,用「替換字符串」替換「查找字符串」。
容許使用通配符
例:
repl eip, #6a00#, #6b00#, 10
repl eip, #??00#, #??01#, 10
repl 401000, #41#, #90#, 1F
 
RESET
---------------------------
OD從新加載程序(至關於ctlr+f2)
 
 
RET
---
<RETurn>
退出腳本。
例:
ret
 
REV
---
字節反轉.(注意是字節反轉,不是位反轉)
Example:
rev 01020304 //$RESULT = 04030201
 
ROL 目的操做數, n
-------------
循環左移目的操做數,n比特位;並將結果保存到到目的操做數中。
例:
mov x, 00000010
ROL x, 8 // x is now 00001000
 
 
ROR 目的操做數, n
-------------
循環右移目的操做數,n比特位;並將結果保存到到目的操做數中。
例:
mov x, 00000010
ROR x, 8 
 
 
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>
讓OD繼續運行
至關於在OllyDbg中按 F9。
例:
run
 
SCMP dest, src
-------------
字符串比較. 
Example: 
cmp x, "KERNEL32.DLL"
cmp [eax], "Hello World"
SCMPI dest, src
-------------
字符串比較(大小寫不敏感)
Example: 
cmp sVar, "KERNEL32.DLL"
cmp [eax], "Hello World"
 
SETOPTION
-------------
調出調試設置(Option)菜單,設置好後按肯定後繼續執行腳本
注意:此選項是爲了能夠在執行腳本的過程當中能夠調出調試設置異常,跟蹤等等設置
 
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
-------------
源數據減目的數據
Example: 
sub x, 0F
sub eax, x
sub [401000], 5
 
 
TC
--
至關於在OllyDbg中 "關閉運行跟蹤"
Example:
tc
 
TI
--
至關於在OllyDbg中按 CTRL-F7,單步跟蹤。
Example:
ti
TICND cond
----------
<Trace Into Condition>
執行 "Trace into" 操做,直到條件爲真時中止。
例:
ticnd "eip > 40100A" // 當 eip >40100A 時中止
 
 
TICK [var [,reftime]]
-------------------
腳步運行時間(microsec)
若是是2次變量,則得出爲時間差
Example:
tick time
msg time //time since script startup
tick time,time
msg $RESULT //time since last TICK, DWORD value
 
TO
--
<Trace Over>
至關於在OllyDbg中執行 "Trace over" 操做。
例:
to
 
TOCND cond
----------
<Trace Over Condition>
執行 "Trace over" 操做,直到條件爲真時中止。
例:
tocnd "eip > 40100A" // 當 eip >40100A 時中止
 
VAR
---
<VARiable>
在腳本中,聲明一個變量。
必須在變量使用先聲明。
注意:變量名最好是由字母和數字組合成的容易識別的變量名
    +-*/等等符號最好不要附加在變量中,以避免引發不可預測的錯誤
因爲爲了兼容之前的系統,請不要將A,B,C,D,E,F做爲變量.
例: 
var tmp
 
XOR 目的操做數, 源操做數
-------------
<XOR>
源操做數與目的操做數進行異或操做,並將結果保存到到目的操做數中。
例: 
xor x, 0F
xor eax, x
xor [401000], 5
 
WRT file, data
-------------
寫數據給文件 (覆蓋)
Numbers are wrote as strings... for the moment
Example: 
wrt "out.txt", "Data:\r\nOk\r\n"
wrt sFile, ebx
 
WRTA file, data
-------------
附加數據到文件中(文件結尾)
Example: 
wrta sFile, "hello world\r\n"
若是文件不存在 將會建立文件

IFA,IFAE,IFB,IFBE IFG,IFGE,IFL,IFLE IFEQ/IFNEQ..ELSE/ENDIF
-------------
這些命令是構建IF塊的,相似於高級語言的語法,具體含義與彙編相似。
Example: 
 
ifneq $RESULT,0
    ifa flg,$RESULT
        mov flg,$RESULT
    endif
endif


3.2 標籤
----------
定義標籤,要在標籤名後面要加上一個冒號.
例:
SOME_LABEL:
 
3.3 註釋
------------
您可使用「//」在任何地方進行註釋。
塊註釋必須另外起一行並以 「」做爲結束,「*/」也必須另起一行。
 
 
 
摘自互聯網
 
 
 
 
{
【翻譯】編寫IDA插件      

--------------------------------------------------------------------------------
標 題: 【翻譯】編寫IDA插件
做 者: 月中人
時 間: 2006-08-29,08:48
鏈 接: http://bbs.pediy.com/showthread.php?t=31185 
}

{
 兩篇已翻譯好的有關IDA插件開發的文章      

--------------------------------------------------------------------------------
標 題: 兩篇已翻譯好的有關IDA插件開發的文章
做 者: jhlqb
時 間: 2006-09-02,12:00
鏈 接: http://bbs.pediy.com/showthread.php?t=31384
 }

有關IDA的手工脫殼,推薦一篇:

{

【翻譯】用IDA的調試器來手工脫殼(PE格式文件)      

--------------------------------------------------------------------------------
標 題: 【翻譯】用IDA的調試器來手工脫殼(PE格式文件)
做 者: 4nil
時 間: 2005-01-14,09:35
鏈 接: http://bbs.pediy.com/showthread.php?t=9811
 
【轉帖】[翻譯]IDA Plugin 編寫基礎 
http://bbs.pediy.com/showthread.php?t=42209
}

介紹一篇IDA的ABC文章:
{

IDA簡易教程:
http://www.pediy.com/practise/IDA.htm

}


OD的腳本編寫:
{

標 題: 調試好幫手ODbgScript 入門系列(一)-認識ODbgScript【原創】
做 者: hnhuqiong
時 間: 2006-05-21,21:16
鏈 接: http://bbs.pediy.com/showthread.php?t=26029 }    附Ollydbg經常使用快捷鍵:  Alt+E → Modules窗口,查找輸入函數  Ctrl+N → 查找名稱標誌,選擇你要下斷的內容  Shift+F9 → 強制繼續執行跟蹤或稱攔截信息步進跟蹤  F12 → 暫時中止  F10 → 打開反彙編選項菜單  F9 → 運行鍵  F8 → 單步跟蹤結束  F7 → 單步跟蹤  F3 → 打開快捷鍵  F2 → 下斷點快捷鍵  Ctrl+F9 → 返回到跟蹤  Ctrl+F8 → 自動步進掃描,按F12可中止  Ctrl+F7 → 同上,功能略有不一樣  Ctrl+F6 → 回到OL主窗口  Ctrl+F2 → 從新開始  Art+F2 → 結束跟蹤  Enter → 進制轉換計算  Art+L → 打開日誌窗口  Art+C → 快速回到程序入口  Ctrl+S → 打開查找命令次序窗口  Shift+F2 → 打開附加選項窗口  Shift+F4 → 打開條件對話窗  Ctrl+E → 編輯機器碼  Ctrl+G → 輸入跟隨地址  Space → 填充或修改彙編內容(NOP修改)  ----------------------------------------------------------------------------------- OD的支持的命令  表達式  CALC 表達式 -------------計算表達式的值  ? 表達式  --------------同上  表達式 ---------------(第一個字符不能是字母) 同上  WATCH表達式------------- 添加監視  W 表達式 ---------------同上  反彙編器  AT 表達式------------- 在反彙編中跟隨  FOLLOW--------------- 表達式 同上  ORIG ----------------前往實際的 EIP  * ------------------同上  轉存和堆棧  D 表達式----------- ---在轉存中跟隨  DUMP 表達式 -------------同上  DA [表達式]------- ------轉存爲彙編格式  DB [表達式] -------------轉存爲十六進制(hex)字節格式  DC [表達式] -------------做爲ASCII 文本轉存  DD [表達式] -------------做爲地址(堆棧格式)轉存  DU [表達式] -------------做爲 UNICODE 文本轉存  DW [表達式]------------- 轉存爲十六進制(hex)字格式  STK 表達式-------------- 在堆棧中跟隨  彙編  A 表達式 [,命令]----------- 在地址處彙編  標號和註釋  L 表達式, 標號 ------------爲地址指派符號標號  C 表達式, 註釋 ------------在地址處做註釋  斷點命令  BP 表達式 [,條件] -----------在地址處設置 INT3 斷點  BPX 標號 ----------------在當前模塊內部的每一個調用外部'標號'處設置斷點  BC 表達式 ---------------刪除地址處的斷點  MR 表達式1 [,表達式2] ---------設置訪問範圍的內存斷點  MW 表達式1 [,表達式2] ---------設置寫入範圍的內存斷點  MD -------------------移除內存斷點  HR 表達式 ---------------在訪問地址處設置一個字節的硬件斷點  HW 表達式 ---------------在寫入地址處設置一個字節的的硬件斷點  HE 表達式 ---------------在執行地址處設置硬件斷點  HD [表達式] --------------移除地址處的硬件斷點  跟蹤命令  STOP -----------------暫停執行  PAUSE -----------------同上  RUN ------------------運行程序  G [表達式] ---------------運行到地址處  GE [表達式] --------------跳過意外的句柄並運行到地址處  S -------------------單步進入  SI------------------- 同上  SO -------------------單步跳過  T [表達式] ---------------跟蹤進入到地址處  TI [表達式] ---------------同上  TO [表達式] ---------------跟蹤跳過到地址處  TC 條件 -----------------跟蹤進入到條件處  TOC 條件 -----------------跟蹤跳過到條件處  TR --------------------執行到返回  TU --------------------執行到用戶代碼  OllyDbg 窗口  LOG -------------------查看日誌窗口  MOD -------------------查看可執行模塊  MEM -------------------查看內存窗口  CPU -------------------查看 CPU 窗口  CS --------------------查看調用堆棧  BRK --------------------查看斷點窗口  OPT --------------------編輯選項  雜項命令  EXIT -------------------關閉 OllyDbg  QUIT -------------------同上  OPEN [文件名] --------------打開待調試的可執行文件  CLOSE ------------------關閉調試的程序  RST -------------------從新載入當前程序  HELP -------------------顯示本幫助  HELP OllyDbg ---------------顯示 OllyDbg 幫助  HELP API函數幫助完整文件名 --------顯示 API
相關文章
相關標籤/搜索