OD腳本指令集


聲明:

        1.本指令集搜集自各論壇、博客,歡迎補充討論


OD腳本指令集


在后面的文檔中, “源操作數” 和 “目的操作數”表示以下含義:
- 十六進制常數,既沒有前綴也沒有后綴。 (例如:是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#
$RESULT <RESULT> 保存某些函數的返回值,比如FIND函數運行后的結果,等等。
在ODbgScript的腳本調試窗口,你能觀察到它的變化,並且可以修改它.
 
$VERSION <VERSION> ODBGScript的版本信息,它是系統保留變量名. 例:
cmp $VERSION, "1.47"  //比較是否大於 1.47版
ja version_above_147  
 
#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 目的操作數, 源操作數 
 
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 地址 <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 轉換字符串變量到緩沖區 例:
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
!注: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,
 
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 地址大小 釋放由ALLOC申請的內存.   Example:
 alloc 1000
 free $RESULT, 1000
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 地址 獲得指定地址處的解釋  
GCI 地址, 信息 獲得制定地址的匯編指令信息
"info"可以是:
-匯編指令字符串例:gci eip,COMMAND
 就象用OPCODE eip一樣
-目標地址,例: gci eip,DESTINATION
  用於jump/call/return指令
-命令長度,例: gci eip,SIZE
-類型, 例:gci eip,TYPE
-條件,例:gci eip,CONDITION
返回值:$RESULT
-得到指令目標地址(DESTINATION) 
  比如:
004B3DF0   0F85 D7010000   jnz     004B3FCD
EIP:004B3DF0 
gci eip,DESTINATION
這里的$RESULT等於004B3FCD
GMEMI 地址, 信息 獲得指定地址處內存的信息.
信息可以是 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"設置斷點。
 
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> 例:
jae SOME_LABEL
 
JB 標簽 <Jump if Below> 例:
jb SOME_LABEL
 
JBE 標簽 <Jump if Below or Equal> 例:
jbe SOME_LABEL
 
JE 標簽 <Jump if Equal> 例:
je SOME_LABEL
 
JNE 標簽 <Jump if Not Equal> 例:
jne SOME_LABEL
 
JMP 標簽 <JuMP> 跳轉到指定標簽. 例:
jmp SOME_LABEL
 
KEY vkcode [, shift [, ctrl]] 仿真按下鍵盤.
這個命令可以模仿OD中任意快捷鍵的功能
比如腳本ctrl+F2重新載入功能就可以通過KEY 71,0,1來模擬
vkcode(虛擬鍵碼)的具體值可以查詢masm環境下的windows.inc文件
比如:
VK_F2                                equ 71h
所以模擬ctrl+f2 就是 KEY 71,0,1
這里的vkcode都是16進制的
  Example:
key 20
key 20, 1 //Shift+space
key 20, 0, 1 //Ctrl+space
LBL 地址, 字符串 <LaBel Insert> 在指定地址處插入一個標簽 例:
lbl eip, "NiceJump"
 
LC 清理LOG窗口  
LCLR 清理Script Log窗口  
LEN str 獲得字符串長度,結果放在$RESULT   Example:
len "NiceJump"
msg $RESULT
LM 地址, 大小, 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 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 地址 反匯編指定地址處的代碼.
$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 地址 回溯指定地址的匯編命令   Example:
preop eip
READSTR 地址,maxsize 從addr處讀指定大小的字符串   Example:
    readstr 401000,15
REF 地址 相當於在OllyDbg按 Ctrl R.   Example:
continue:
REF eip
log $RESULT
log $RESULT_1
log $RESULT_2
cmp $RESULT,0
jne continue
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 寫數據給文件 (覆蓋)   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
您可以使用“//”在任何地方進行注釋。  
塊注釋必須另外起一行並以 “”作為結束,“*/”也必須另起一行。  


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM