OD插件的編寫,用VC6寫的,大家可以下來學(xué)習(xí)學(xué)習(xí),獻(xiàn)給不會(huì)的朋友-OD
V1.65.2(2007/09/5)
+ BPHWC 不帶參數(shù)將刪除所有硬件斷點(diǎn)
+ BC 不帶參數(shù)將刪除所有斷點(diǎn)
+ BD 不帶參數(shù)將禁止所有斷點(diǎn)
+ BPGOTO 遇見斷點(diǎn)自動(dòng)跳轉(zhuǎn)到標(biāo)簽
+ buf 轉(zhuǎn)換字符串為ASCII碼到緩沖區(qū)
+ GCI 求制定地址的匯編命令信息
+ call 調(diào)用標(biāo)簽子程序,用RET返回
+ TICK 腳步運(yùn)行時(shí)間
+ 腳本行編輯功能
+ 如果腳本重新引導(dǎo),但腳本斷點(diǎn)所在行不變化,將繼續(xù)保持
* findcmds 修正錯(cuò)誤
* 一些小的BUG修正
1. 關(guān)于 ODbgScript
-------------------
ODbgScript 是OLLYDBG調(diào)試器的一個(gè)插件。我個(gè)人認(rèn)為,OllyDbg是目前最好的程序級(jí)調(diào)試器。
這個(gè)調(diào)試器的最大的特色之一就是她的插件體系,這是使得用戶能夠更為有效的擴(kuò)展她的功能。
ODbgScript 是一種通過類匯編語言的腳本,來控制OllyDbg自動(dòng)運(yùn)行的插件。
在調(diào)試程序時(shí),常常都是僅僅為了要找到某幾個(gè)關(guān)鍵點(diǎn),而不得不做大量的重復(fù)工作。
而通過使用我的腳本解釋器,您就可以做到“寫一次腳本,無限使用”
ODbgScript相對(duì)OllyScript最大的升級(jí)是你擁有了一個(gè)腳本的調(diào)試運(yùn)行窗口,你能很好的控制腳本和觀察
腳本的運(yùn)行狀態(tài),在ODbgScript的調(diào)試窗口中,你可以單步執(zhí)行你的腳本,可以手工執(zhí)行腳本命令,可以在你
的腳本上下斷點(diǎn),甚至可以調(diào)整你的變量值.這對(duì)于你調(diào)試你的腳本是有所幫助的,在插件窗口你可以選擇腳
本運(yùn)行窗口,它就出來了.
ODbgScript還有一個(gè)日志窗口(LOG),它的開發(fā)還不那么完善,我相信在不久的將來,它能為你展現(xiàn)它強(qiáng)大的
功能.
------------------------------
2. 目前情況(2007年5月2日)
----------------------------
V1.48-
2006-5-20開始,ODbgScript由hnhuqiong在Epsylon3開放源碼的基礎(chǔ)上進(jìn)行本地化以及繼續(xù)升級(jí).
v1.0-v1.47
OllyScript變成ODbgScript,帶有新的圖形界面,從2005-11-4開始由Epsylon3繼承SHaG繼續(xù)開發(fā).
(未知原因從2006-2-6后Epsylon3沒有為OllyScript進(jìn)行新的升級(jí).)
v0.92
OllyScript目前的下載量已經(jīng)超過一萬次了!這意味著超過2Gb的網(wǎng)絡(luò)下載流量。這個(gè)結(jié)果對(duì)我來說還不錯(cuò)!
因?yàn)槲乙獏⑴c一個(gè)xray系統(tǒng)項(xiàng)目,這個(gè)項(xiàng)目要花去我不少的時(shí)間,所以開發(fā)這個(gè)插件的步伐可能要放慢了。
真的對(duì)不起大家了。
(2004年7月10日起SHaG基本放棄對(duì)OllyScript的開發(fā),但他開放了他的源碼.)
2.1 最新更新(+:增加功能 *:BUG修正 -:去掉功能 #:測(cè)試功能)
V1.65.2(2007/09/15)
+ BPHWC 不帶參數(shù)將刪除所有硬件斷點(diǎn)
+ BC 不帶參數(shù)將刪除所有斷點(diǎn)
+ BD 不帶參數(shù)將禁止所有斷點(diǎn)
+ BPGOTO 遇見斷點(diǎn)自動(dòng)跳轉(zhuǎn)到標(biāo)簽
+ buf 轉(zhuǎn)換字符串為ASCII碼到緩沖區(qū)
+ GCI 求制定地址的匯編命令信息
+ call 調(diào)用標(biāo)簽子程序,用RET返回
+ TICK 腳步運(yùn)行時(shí)間
+ 腳本行編輯功能
+ 如果腳本重新引導(dǎo),但腳本斷點(diǎn)所在行不變化,將繼續(xù)保持
* findcmds 修正錯(cuò)誤
* 一些小的BUG修正
V1.54(2007/06/01)
+GMI 功能擴(kuò)展,現(xiàn)可得到如下信息
MODULEBASE: 模塊基地址
MODULESIZE: 模塊大小
CODEBASE: 代碼段基地址
CODESIZE: 代碼段大小
DATABASE: 數(shù)據(jù)段基地址
RESBASE: 資源段基地址
RESSIZE: 資源段大小
IDATATABLE: 輸入表基地址(Base address of import data table)
entry: 模塊入口
nsect: 節(jié)數(shù)目(Number of sections in the module)
V1.53(2007/05/03)
+ pop,push,test,xchg命令
+ findcmds(查找命令序列)
* 更換官方PLUGIN重新編譯,消除DBH,DBS的BUG
* 引導(dǎo)/執(zhí)行腳本順序紊亂的重大BUG修復(fù)(內(nèi)部引用NRU和MRU混亂),這個(gè)BUG困擾了我很久
原版一直有這個(gè)BUG,以前不太注意,最近調(diào)試多才下決心解決了這個(gè)問題.
V1.52
# 中文說明做了大規(guī)模的補(bǔ)充和命令解釋以及例子
# 為兼容以前版本的腳本,去掉了類C的操作符.
# 添加了asmtxt(調(diào)文本asm文件匯編后寫入指定地址, asm文件不支持jmp類匯編)
+ 添加了bpx,bpd功能(下,禁止調(diào)用函數(shù)斷點(diǎn));
+ 添加了opentrace功能(打開跟蹤)
+ 添加了setoption功能(調(diào)設(shè)置菜單)
+ 添加了GAPI功能(判斷指定地址API)
+ 添加了READSTR功能(讀地址中指定大小的字符串)
+ 支持16位寄存器(ax,bx...)
+ find命令全面升級(jí),可以直接支持變量和內(nèi)存數(shù)據(jù)以及字符串,并支持搜索范圍
+ findop命令全面升級(jí),可以直接支持變量和內(nèi)存數(shù)據(jù),并支持搜索范圍
+ 添加了findcmd功能(查找命令);
* 修正編輯變量數(shù)量不能大于50的問題
* var BUG修正
* GN功能修正,以便和GAPI區(qū)別
* GCMT 錯(cuò)誤修正(感謝VOLX BUG報(bào)告)
* 修正ASM匯編代碼按照最優(yōu)模式處理,和OD匯編處理匯編相同(感謝liuyilin BUG報(bào)告)
* 一些程序內(nèi)部Bug調(diào)整
v1.51
* 內(nèi)部函數(shù)(getFLTOperatorPos)重大BUG修正(感謝FLY,xxxx BUG報(bào)告)
v1.50 release
* an引用的api錯(cuò)誤修正
* len錯(cuò)誤修正
* 一些小的錯(cuò)誤
+ 添加在腳本窗口中雙擊高亮功能
V1.49
# MSG,MSGYN消息框彈出回歸0.92版模式
# 增加NEG,NOT,ROL,ROR命令
# (內(nèi)部增加GetBYTEOpValue函數(shù))
+ 腳本運(yùn)行窗口增加運(yùn)行到光標(biāo)處菜單功能(F4)
+ GMI增加DATABASE,RESBASE,RESSIZE的操作數(shù)
+ MUL,DIV命令
* 修正本地化不準(zhǔn)確問題
* 修正MOV 緩沖區(qū)崩潰問題
* 修正exec/ende不釋放內(nèi)存問題
* 修正一些小問題
* 修正asm指令中的錯(cuò)誤
* 修正exec/ende中的錯(cuò)誤(script_pos計(jì)數(shù)錯(cuò)誤,ende被跳過執(zhí)行)
v1.48bata (2006-5-20)
# MUL,DIV命令
# 腳本運(yùn)行窗口增加運(yùn)行到光標(biāo)處菜單功能(F4)
# 本地化
# 適當(dāng)?shù)脑黾恿艘恍╊A(yù)判讀語句,防止用戶錯(cuò)誤造成崩潰
* 修正BPWM的問題
* 修正一些字符串定義錯(cuò)誤
* 修正一些函數(shù)的聲明錯(cuò)誤(CreateOperands==)
* 修正緩沖區(qū)太小,造成OD崩潰.
- 上一版本未開發(fā)的函數(shù)從類中去除(LogRegNr,Process)
3. 文檔
----------------
在這個(gè)版本中,附帶了兩個(gè)腳本例子(tElock098.osc 和 UPX.osc)。
這兩個(gè)腳本,可以迅速找到對(duì)應(yīng)殼的入口。
3.1 語言
------------
OllyScript腳本語言是一個(gè)種類匯編的語言。你使用它來控制ODbgScript和腳本運(yùn)行.
在后面的文檔中, “源操作數(shù)” 和 “目的操作數(shù)”表示以下含義:
- 十六進(jìn)制常數(shù),既沒有前綴也沒有后綴。 (例如:是00FF, 而不是 0x00FF 和 00FFh的形式)
十進(jìn)制常數(shù),在后綴中加點(diǎn). (例如:100. 128. 也可以是浮點(diǎn)數(shù)128.56,浮點(diǎn)數(shù)只能保留小數(shù)點(diǎn)后2位)
- 變量,這個(gè)變量必須在使用前用Var進(jìn)行定義
- 32位寄存器 (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP)。
16位寄存器 (AX, BX, CX, DX, SI, DI, BP, SP)
8位的寄存器(AL, AH, ... DL, DH)
- 被中括號(hào)括起來的內(nèi)存地址 (例如:[401000] 指向內(nèi)存地址為401000里存放分?jǐn)?shù)據(jù),
[ecx] 指向內(nèi)存地址為寄存器ecx里存放分?jǐn)?shù)據(jù)).
- 一個(gè)標(biāo)志位,帶有感嘆號(hào)前綴(!CF, !PF, !AF, !ZF, !SF, !DF, !OF)
- 字符串,也可叫數(shù)據(jù)序列。其格式為: #6A0000# (數(shù)值在兩個(gè)“#”號(hào)之間),兩個(gè)“#”號(hào)之間必須包含至少有一個(gè)數(shù)值。
"1234567ABCDEF"
- 包含“?”通配符的字符串。比如 #6A??00# 或者 #6?0000#
3.1.1 保留變量
------------------------
$RESULT
-------
保存某些函數(shù)的返回值,比如FIND函數(shù)運(yùn)行后的結(jié)果,等等。
在ODbgScript的腳本調(diào)試窗口,你能觀察到它的變化,并且可以修改它.
$VERSION
--------
ODBGScript的版本信息,它是系統(tǒng)保留變量名.
例:
cmp $VERSION, "1.47" //比較是否大于 1.47版
ja version_above_147
3.1.2 指令
----------------------------------------------
#INC "文件名"
---------
一個(gè)腳本文件包含另外一個(gè)腳本.就像調(diào)用子程序一樣.兩個(gè)腳本中的變量名不能相同.
例:
#inc "test.txt"
#LOG
---------
開始記錄運(yùn)行指令
指令會(huì)顯示在OllyDbg的log窗口中,每條記錄前都會(huì)加上“-->”的前綴
例:
#log
ADD 目的操作數(shù),源操作數(shù)
---------
源操作數(shù)與目的操作數(shù)相加,并把相加的結(jié)果保存到目的操作數(shù)中,支持字符串相加.
例:
add x, 0F // x=x+F
add eax, x //eax=eax+x
add [401000], 5 //[401000]=[401000]+5
浮點(diǎn)數(shù)相加
add x,16.50 //x=x+16.50
(字符串相加)
add y, " times" // 如果在次之前y="1000" ,則在執(zhí)行完此指令之后y="1000 times"
AI
------------
在OllyDbg中執(zhí)行“自動(dòng)步入” [Animate into]操作。
相當(dāng)于在OllyDbg中按下CTRL+F7
例:
ai
ALLOC 大小
----------
申請(qǐng)內(nèi)存, 你能讀/寫/執(zhí)行.
例:
alloc 1000 //新申請(qǐng)內(nèi)存,大小為1000,返回結(jié)果$RESULT放著申請(qǐng)內(nèi)存的開始地址.
free $RESULT, 1000
AN 地址
-------
從指定地址處,對(duì)代碼進(jìn)行分析。
例:
an eip // 相當(dāng)于在OllyDbg中按 Ctrl+A鍵
AND 目的操作數(shù), 源操作數(shù)
-------------
源操作數(shù)與目的操作數(shù)進(jìn)行邏輯與操作,并將結(jié)果保存到到目的操作數(shù)中。
例:
and x, 0F //x=x&&f
and eax, x //eax=eax&&x
and [401000], 5 //[401000]=[401000]&&5
AO
--
在OllyDbg中執(zhí)行“自動(dòng)步過” [Animate over]操作。
相當(dāng)于在OllyDbg中按下CTRL+F8
例:
ao
ASK 問題
------------
顯示一個(gè)提示輸入框,讓用戶輸入,結(jié)果保存變量$RESULT中(如果用戶按了取消鍵,則$RESULT=0)。
$RESULT_1中放著輸入的長度.
(注:程序?qū)⑴凶x你輸入的是字符,$RESULT_1的結(jié)果是輸入字符數(shù)的數(shù)目,整型/2,中文數(shù)*2)
例:
ask "Enter new EIP"
cmp $RESULT, 0
je cancel_pressed
mov eip, $RESULT
ASM 地址, 指令
-----------------
修改指定地址的指令。
并將修改后的匯編指令長度保存到保留變量$RESULT中
例:
asm eip, "mov eax, ecx" //將當(dāng)前指令修改為 mov eax,ecx
ASMTXT 文件
-----------------
匯編指定文件中的指令。
將匯編指令長度保存到保留變量$RESULT中
并將匯編指令行數(shù)保存到保留變量$RESULT_1中
例:
asmtxt EIP,"myasm.txt" //將myasm.txt文件中的asm轉(zhuǎn)成opcode后寫入EIP.
ATOI str [, base=16.]
-----------------
轉(zhuǎn)換字符串到16進(jìn)制整型,[可以將任何進(jìn)制轉(zhuǎn)成16進(jìn)制整型]
返回結(jié)果放到 $RESULT
例:
itoa "F" //字符串"F"轉(zhuǎn)成了整型,結(jié)果會(huì)等于F
itoa "10", 10. //字符串"10"代表十進(jìn)制,結(jié)果會(huì)等于A
BC 地址
-------
清除指定地址的斷點(diǎn)。
例:
bc 401000 //清除401000處的斷點(diǎn)
bc x //清除X(變量值)處的斷點(diǎn)
bc eip //清除當(dāng)前EIP處的斷點(diǎn)
BP addr
--------
在指定地址設(shè)斷點(diǎn)
例:
bp 401000 //在401000處下斷點(diǎn)
bp x //在X(變量值)處下斷點(diǎn)
bp eip //在當(dāng)前EIP處下斷點(diǎn)
BPCND 地址, 條件
----------------
在指定地址處,設(shè)置條件斷點(diǎn)。
例:
bpcnd 401000, "ECX==1" //當(dāng) 代碼執(zhí)行到401000且 ecx等于1 時(shí),程序暫停
BPD 函數(shù)字符串
---------------
清除調(diào)用函數(shù)斷點(diǎn),函數(shù)為字符串表示.
例:
bpd "GetVersion" //取消呼叫GetVersion的斷點(diǎn)
BPHWC 地址
----------
刪除指定地址處的硬件斷點(diǎn)。
例:
bphwc 401000 //清除 401000處的斷點(diǎn)
BPHWCALL
-----------
清除所有的硬件斷點(diǎn)
例:
BPHWCALL //清除所有的硬件斷點(diǎn)
BPHWS 地址, 模式
----------------
在指定地址,設(shè)置硬件斷點(diǎn)。有三種模式: "r" - 讀取, "w" - 寫入 或者 "x" - 執(zhí)行.
此斷點(diǎn)只支持1個(gè)字節(jié)的動(dòng)作.
例:
bphws 401000, "x" //當(dāng)執(zhí)行到此地址時(shí)產(chǎn)生中斷.
Bphws 401000,"r" //當(dāng)讀取401000的時(shí)候產(chǎn)生中斷
BPL 地址, 表達(dá)式
--------------
在指定地址處設(shè)置記錄斷點(diǎn),將表達(dá)式的結(jié)果記錄到記錄窗口中。
例:
bpl 401000, "eax" // 每次執(zhí)行到401000時(shí),都將eax寄存器的結(jié)果記錄
BPLCND 地址, 表達(dá)式, 條件
-----------------------
在指定地址處設(shè)置記錄斷點(diǎn),如果條件為真時(shí),將表達(dá)式的結(jié)果記錄到記錄窗口中。
例:
bplcnd 401000, "eax", "eax > 1" // 如果執(zhí)行到401000時(shí),滿足eax>1,則將eax寄存器的結(jié)果記錄
BPMC
----
清除內(nèi)存斷點(diǎn)。
例:
bpmc
BPRM 地址, 大小
---------------
在指定地址處,設(shè)置一個(gè)內(nèi)存讀取斷點(diǎn)。 “大小” 是指內(nèi)存中的字節(jié)大小。
例:
bprm 401000, FF //在401000中設(shè)置內(nèi)存讀斷點(diǎn),內(nèi)存中的大小為FF
BPWM 地址, 大小
---------------
在指定地址處,設(shè)置一個(gè)內(nèi)存寫入斷點(diǎn)!按笮 是指內(nèi)存中的字節(jié)大小。
例:
bpwm 401000, FF //在401000中設(shè)置內(nèi)存寫斷點(diǎn),內(nèi)存中的大小為FF
BPX 函數(shù)字符串
---------------
設(shè)置調(diào)用函數(shù)斷點(diǎn),函數(shù)為字符串表示.
返回下了斷點(diǎn)的地址數(shù)量,結(jié)果保存在保留變量$RESULT中.
例:
bpx "GetVersion" //下呼叫GetVersion斷點(diǎn),斷下的語句為 call [xxxxx]
BUF var
-------
轉(zhuǎn)換字符串變量到緩沖區(qū)(string/dword variable to a Buffer)
Example:
mov s, "123"
buf s
log s // output "#313233#
CMP 目的操作數(shù), 源操作數(shù)
-------------
比較 目的操作數(shù)與源操作數(shù)的大小,和其對(duì)應(yīng)的匯編指令作用相同。
可以是各種數(shù)值,甚至可以是字符串(對(duì)大小不敏感).
例:
cmp y, x //比較兩個(gè)變量(Y和X)的大小,
cmp eip, 401000 //比較EIP和401000的大小
CMT 地址, 字符串
--------------
在指定地址處,加入注釋。
例:
cmt eip, "這是入口" //當(dāng)前地址處 加上“這是入口”的注釋
COB
---
發(fā)生中斷后,讓腳本繼續(xù)執(zhí)行(移除EOB指令)
例:
COB
COE
---
發(fā)生異常后,讓腳本繼續(xù)執(zhí)行
例:
COE
DBH
---
隱藏調(diào)試器
例:
dbh
DBS
---
對(duì)隱藏的調(diào)試器操作進(jìn)行恢復(fù),不再隱藏。
例:
dbs
DEC 變量
-------
對(duì)變量進(jìn)行減一操作
例:
dec v //V=V-1
DIV 目的操作數(shù), 源操作數(shù)
-------------
源操作數(shù)與目的操作數(shù)進(jìn)行除法操作,并將結(jié)果保存到到目的操作數(shù)中。
例:
div x, 0F //X=X/0F
div eax, x //eax=eax/x
div [401000], 5 //[401000]/5
DM 地址, 大小, 文件名
-------------------
從指定地址處開始,在內(nèi)存中提取指定大小的數(shù)據(jù),并保存到指定的文件中
例:
dm 401000, 1F, "c:\dump.bin"
DMA 地址, 大小, 文件名
-------------------
從指定地址處開始,在內(nèi)存中提取指定大小的數(shù)據(jù),并保存到指定的文件中;如
果指定文件已存在,則將數(shù)據(jù)追加到指定文件尾部。
例:
dma 401000, 1F, "c:\dump.bin"
DPE 文件名, 入口
----------------
提取執(zhí)行模塊到指定文件中。
“入口”用來設(shè)定入口地址。
這個(gè)命令用來抓取文件,還是比較好用的,因?yàn)橹苯永昧薕D強(qiáng)大的內(nèi)存管理功能.
例:
dpe "c:\test.exe", eip //入口為當(dāng)前地址,保存為C盤下test.exe
EOB 標(biāo)簽
---------
在下次中斷發(fā)生時(shí),跳轉(zhuǎn)到指定標(biāo)簽處。
此功能和EOE命令常常讓新手迷惑不解,其實(shí)就是遇見中斷做腳本的流程轉(zhuǎn)向.
如果還有不懂,請(qǐng)看下文的答疑解惑章節(jié).
例:
eob SOME_LABEL
EOE 標(biāo)簽
---------
在下次異常發(fā)生時(shí),跳轉(zhuǎn)到指定標(biāo)簽處。
例:
eoe SOME_LABEL
ESTI
----
相當(dāng)于在OllyDbg按 SHIFT-F7。
例:
esti
ESTO
----
相當(dāng)于在OllyDbg按 SHIFT-F9。
例:
esto
EVAL
----
計(jì)算含義變量的表達(dá)式。
變量必須已經(jīng)在腳本中聲明。
注意:插到字符串中時(shí),要放在大括號(hào){ }中。
結(jié)果保存在保留變量$RESULT中.
這句和其它語句結(jié)合將產(chǎn)生很多的變化,用好它將讓你的腳本十分靈活.
例:
var x
mov x, 1000
eval "x的值是 { x }" // 執(zhí)行后$RESULT為 "x的值是00001000"
EXEC/ENDE
---------
<EXECute/END of Execute>
對(duì)當(dāng)前調(diào)試進(jìn)程,執(zhí)行在EXEC和ENDE之間的指令。
有這個(gè)命令就是你可以直接跳入進(jìn)程,對(duì)進(jìn)程進(jìn)行直接控制.
它的原理就是取當(dāng)前進(jìn)程的信息進(jìn)行保存,然后新分配一個(gè)代碼內(nèi)存區(qū)(可讀/寫/執(zhí)行.大小1000)
調(diào)用OD匯編器將你的匯編語句轉(zhuǎn)成OPcode,將OPcode拷貝到代碼區(qū),然后將EIP指向你的代碼開頭.
然后將控制權(quán)交給你.執(zhí)行完后將EIP歸還原位,然后將控制權(quán)交還ODbgScript.
這里的好處就是讓你以很高的效率來避免在較慢的腳本環(huán)境運(yùn)行需要高效的操作.
!注意:由于進(jìn)程控制權(quán)交給你了,那么,你的代碼有效性將只有你自己來控制了.
!注意:執(zhí)行后不保存現(xiàn)場(chǎng).這都需要你來做工作.(要保存現(xiàn)場(chǎng),你可以使用pushad,popad)
有大括號(hào)的,會(huì)被大括號(hào)中的變量的值替代。
例:
// 以下是做移動(dòng)操作
var x
var y
mov x, "eax"
mov y, "0DEADBEEF"
exec
mov {x},{y} // 到進(jìn)程中新開的代碼區(qū)去,mov eax,0DEADBEEF 將被執(zhí)行
mov ecx, {x} //mov ecx, eax 將被執(zhí)行
ende
// 以下是調(diào)用調(diào)試程序的ExitProcess函數(shù)
exec
push 0
call ExitProcess
ende
ret
FILL addr,len,value
-------------------------
從地址addr開始填充長度為len的值value
!注:value的值最大8個(gè)字節(jié),可以為寄存器值,標(biāo)志位值,變量值,16進(jìn)制值,10進(jìn)制值,[]指針操作數(shù).
如:
fill 401000,10,90 //NOP 10h個(gè)字節(jié)
fill 401000,ff,[eax] //取出[eax]值,填充到401000,長度為ff
fill 401000,ff,$RESULT //將變量$RESULT的值填充到401000,長度為ff
FIND 地址, 查找內(nèi)容 ,[最大大小]
---------------
從指定地址開始在內(nèi)存中查找指定的內(nèi)容。
如果查找成功,地址會(huì)保存到保留變量$RESULT中,否則$RESULT將等于 0。
查找的串支持通配符“??”(見下面的例子)。
##中的為HEX,""中的為字符串,什么都不帶的為內(nèi)存數(shù)據(jù)
!注:輸入的16進(jìn)制字符必須是成偶數(shù)
從1.52版開始支持直接變量和數(shù)據(jù)查找.
例:
find eip, #6A00E8# // 查找一個(gè)Call,其的第一個(gè)參數(shù)為0 (push 0)
find eip, #6A??E8# // 查找一個(gè)帶參數(shù)的Call,一個(gè)?代表一個(gè)字符常量
find eip,"kernel32.dll" //查找字符串"kernel32.dll"
find eip,"ker???32.d??" //查找?guī)ㄅ浞?字符串,一個(gè)?代表一個(gè)字符串常量
(請(qǐng)注意這里的通配符?和HEX中的?不同)
find eip,15ff //查找內(nèi)存數(shù)據(jù)15ff(代碼為ff115)
(mov tmp,#ff15#
find eip,tmp ) //查找變量tmp中的數(shù)值,tmp=ff15
(mov tmp,"kernel32.dll"
find eip,tmp ) //查找變量tmp中的字符串"kernel32.dll"
(mov tmp,15ff
find eip,tmp //查找變量tmp中的內(nèi)存數(shù)據(jù)15ff(注意和#ff15#區(qū)別)
(ask "輸入需要的數(shù)據(jù)"
find eip,$RESULT //輸入的為#ff15#,"Kernel32.dll",15ff就同上面三例子
find eip,#ff15#,ff //從EIP開始,FF大小范圍內(nèi),查找字符ff15,
FINDCMD 地址, 查找內(nèi)容
-----------------
從指定地址開始查找指定一個(gè)命令。
如果查找成功,地址會(huì)保存到保留變量$RESULT中,否則$RESULT將等于 0。
例:
findcmd 401000, "push eax" // find "push eax"
FINDCMDS 地址, 查找內(nèi)容
-----------------
從指定地址開始查找指定命令序列。
如果查找成功,地址會(huì)保存到保留變量$RESULT中,否則$RESULT將等于 0。
注:命令序列分割請(qǐng)使用;號(hào)(分號(hào)).
例:
findcmd 401000, "push eax;mov eax,edx" // 尋找"push eax和mov eax,edx"命令序列
FINDOP 地址, 查找內(nèi)容,[查找范圍]
-----------------
從指定地址開始查找指定一個(gè)指令,這個(gè)指令是以指定內(nèi)容為開始的。
如果查找成功,地址會(huì)保存到保留變量$RESULT中,否則$RESULT將等于 0。
查找的串支持通配符“??”(見下面的例子)。
注意:findop由于是opcode查找,不支持字符串查找.
findop和find的區(qū)別是findop查找到的必須是opcode.
1.52起支持直接變量和內(nèi)存數(shù)據(jù)
例:
findop 401000, #61# // find next POPAD
findop 401000, #6A??# // find next PUSH of something
譯者注:
對(duì)比一下FIND 和FINDDOP的區(qū)別:
地址 數(shù)據(jù) 代碼
00401007 B8 3300 MOV EAX, 33
0040100C 33F6 XOR ESI, ESI
find 401007, #33# //$RESULT等于401008
finddop 401007, #33# //$RESULT等于40100C
FINDMEM what [, StartAddr]
--------------------------
從整個(gè)內(nèi)存開始在內(nèi)存中查找指定的內(nèi)容
如果查找成功,地址會(huì)保存到保留變量$RESULT中,否則$RESULT將等于 0。
查找的串支持通配符“??”(見下面的例子)。
Example:
findmem #6A00E8# // find a PUSH 0 followed by some kind of call
findmem #6A00E8#, 00400000 // search it after address 00400000
FREE
FREE 地址 大小
-----------
釋放由ALLOC申請(qǐng)的內(nèi)存.
Example:
alloc 1000
free $RESULT, 1000
GAPI
GAPI 地址
------------
獲得指定代碼處的API調(diào)用信息
API信息保存到保留變量$RESULT中。
如果符號(hào)名是一個(gè)API函數(shù),則
$RESULT保存API信息
$RESULT_1保存鏈接庫名(比如 kernal32)
$RESULT_2保存符號(hào)名(比如 ExitProcess)。
$RESULT_3保存調(diào)用地址XXXX(比如 call xxxxx)
注意:這個(gè)和GN的區(qū)別是GN必須指向IAT地址
而GAPI直接給出代碼地址就可得出API
還有如果你是在此處下了軟件斷點(diǎn),請(qǐng)先清除斷點(diǎn)再用此句,因?yàn)檐浖䲠帱c(diǎn)修改了代碼為CC
這里如果不清除此處的軟件斷點(diǎn),將造成這句不能很好的識(shí)別.
例:
GAPI 401000 (call kernal32.ExitProcess)
GAPI EIP //查看當(dāng)前代碼是否是API調(diào)用,不是則返回0
GCMT addr
---------
獲得指定地址處的解釋
GCI addr, info
--------------
獲得制定地址的匯編指令信息
"info" can be :
- 匯編指令字符串 (like OPCODE)
- 目標(biāo)地址 of jump/call/return
- 命令長度(OPCODE)
- TYPE for asm command string (one of C_xxx, see OllyDbg Plugin API)
GMEMI addr, info
----------------
獲得指定地址處內(nèi)存的信息.
信息可以是 MEMORYBASE, MEMORYSIZE or MEMORYOWNER
Example:
GMEMI addr, MEMORYBASE // After this $RESULT is the address to the memory base of the memory block to which addr belongs
GMI 地址, 信息
--------------
獲得指定地址所在模塊的相關(guān)信息。
“信息”可以是
MODULEBASE: 模塊基地址(base address of module in the memory space of debugged process)
MODULESIZE: 模塊大小(total size occupied by module, not necessarily contiguous memory)
CODEBASE: 代碼段基地址
CODESIZE: 代碼段大小(size of executable code, as stays in COFF header. In some cases, OllyDbg may correct definitely invalid code size)
DATABASE: 數(shù)據(jù)段基地址
RESBASE: 資源段基地址
RESSIZE: 資源段大小
IDATATABLE: 輸入表基地址(base address of import data table, as stays in COFF header)
entry: 模塊入口(ddress of module's entry point, as stays in COFF header)
nsect: 節(jié)數(shù)目(Number of sections in the module)
(如果您想在將來的版本中,獲得更多的信息,請(qǐng)聯(lián)系我)。
信息會(huì)保存到保留變量$RESULT中 (如果沒有找到信息,則$RESULT等于0).
例:
GMI eip, CODEBASE // 這條指令執(zhí)行后,$RESULT等于當(dāng)前所在模塊的代碼段基地址。
GN 地址
-------
獲得指定IAT地址的符號(hào)名(比如指向API函數(shù))。
符號(hào)名將保存到保留變量$RESULT中。
如果符號(hào)名是一個(gè)API函數(shù),則
$RESULT是符號(hào)名
$RESULT_1保存鏈接庫名(比如 kernal32)
$RESULT_2保存符號(hào)名(比如 ExitProcess)。
例:
gn 450100
GO 地址
-------
執(zhí)行到指定地址處
例:
go 401005
GPA 函數(shù)名, 動(dòng)態(tài)鏈接庫名
-------------
在指定的動(dòng)態(tài)鏈接庫中,獲得指定函數(shù)的地址。
如果查找成功,地址會(huì)保存到保留變量$RESULT中,否則$RESULT將等于 0。
在設(shè)置API函數(shù)斷點(diǎn)時(shí),這個(gè)指令非常有效。
例:
gpa "MessageBoxA", "user32.dll" // 這條指令執(zhí)行后,$RESULT等于函數(shù)MessageBoxA的地址,您可以
使用"bp $RESULT"設(shè)置斷點(diǎn)。
GPI key
-------------
獲得進(jìn)程的信息.
這個(gè)信息可以是HPROCESS,PROCESSID,HMAINTHREAD,MAINTHREADID,MAINBASE,PROCESSNAME,EXEFILENAME,CURRENTDIR,SYSTEMDIR
GPP key
--------------
find API parameters number and types
HANDLE x, y, class
---------------------
返回指定點(diǎn)(16進(jìn)制)子窗口指定類的句柄
INC 變量
-------
對(duì)變量進(jìn)行加一操作
例:
inc v
ITOA n [, base=16.]
-----------------
轉(zhuǎn)化一個(gè)整數(shù)到字符串
結(jié)果放在 $RESULT
Example:
itoa F
itoa 10., 10.
JA 標(biāo)簽
--------
在cmp命令后使用. 和其對(duì)應(yīng)的匯編指令作用相同.
例:
ja SOME_LABEL
JAE 標(biāo)簽
---------
cmp. 和其對(duì)應(yīng)的匯編指令作用相同.
例:
jae SOME_LABEL
JB 標(biāo)簽
--------
在cmp命令后使用. 和其對(duì)應(yīng)的匯編指令作用相同.
例:
jb SOME_LABEL
JBE 標(biāo)簽
---------
在cmp命令后使用。和其對(duì)應(yīng)的匯編指令作用相同.
例:
jbe SOME_LABEL
JE 標(biāo)簽
--------
在cmp命令后使用. 和其對(duì)應(yīng)的匯編指令作用相同.
例:
je SOME_LABEL
JMP 標(biāo)簽
---------
跳轉(zhuǎn)到指定標(biāo)簽.
例:
jmp SOME_LABEL
JNE 標(biāo)簽
---------
在cmp命令后使用. 和其對(duì)應(yīng)的匯編指令作用相同.
例:
jne SOME_LABEL
KEY vkcode [, shift [, ctrl]]
--------------------------
仿真按下鍵盤.
Example:
key 20
key 20, 1 //Shift+space
key 20, 0, 1 //Ctrl+space
LBL 地址, 字符串
--------------