一个关于ollydbg跟踪各种算法的汇总站点
地址
http://www.iespana.es/OllyDBG/Criptograf%EDa.html附件是说明的西班牙文转英文的翻译!
附件:introduction.rar
http://bbs.pediy.com/upload/file/2004/9/introduction.rar_714.rar转贴自askformore :
1楼 2004-09-25,16:39
--------------------------------------------------------------------------------
也谈写OllyScript脚本之Career和心声
也谈写OllyScript脚本之Career(for 0.92)
现在喜欢用Ollydbg的人相信比较多……
近来,喜欢上写OllyScript脚本,又爱又恨。脚本写得比较烂和慢,原因是汇编命令没认识几个,逻辑思维差,不过认识的还能在OllyScript脚本找到,OllyScript是那么让人和爱可亲,却又是(一般地说)比较难灵活运用,运行还欠些好的透明度。个人认为,脚本和我们写程序(我可没写过真正的程序)一样,先是你有了主题(target:目标),然后用你认为可行的方式进行组织“框架”,(用OS的“法规”)填饱草图,一番潇洒的“文笔”(写命令)后,马上就要进入天堂和地狱的测试考验。如果你是“算死草”--逻辑思维很强的老手,多数直接奔向天堂;但地狱又经常向我等傻瓜招手,屡屡折磨我们。
以下是我写脚本的 Career 和心声(还很烂):
1.注意变量的声明,最好写在一起声明(在开头,同在一个脚本里的都是全局的了),以便报错时,能快速查找(虽然脚本有报错行,但我相信你不想去拉滚动条)
2.弄清变量的真正含义(声明后在赋值后才能确定,有字符、16进制数值串、32位地址或数值):
for example:
var addr
mov addr,[esp+10]//不支持间接计算,这样脚本不会报错,但你一运行就知利害
var addr
var code
mov addr,401000 //缺少这行赋值,addr是0,会带来非法操作
mov addr,#9876543210ABCDEF# // 这条本是想存放16进制串到addr,应该这样 mov [addr],#9876543210ABCDEF# ,且addr应是个有效地址
3.注意命令作用的变更:
find类命令应该用得比较多吧
for example:
find eip,#ABCDEF# // 0.85版是从eip所在的内存块image地址开始搜索
//0.92版是从eip所指地址开始搜索
findop //此命令,是查找真正的命令--一眼就能看到的,如你要找的命令附近有花指令的,使用是找不到的。
4.尽量写成模块功能(精简为上),以便写注释、移植、(用#inc命令)组装和查找错误(第1个运行的脚本定义的变量是全局的,它到第2、3..脚本有效,全局变量值改变后可返回到上一脚本,与全局变量同名变量重新声明无效),包含脚本方面的作用我还在糊涂中。
for example:
//下面的功能简单:不难看出是交换a、b两个数
var a
var b
var c
mov a,12
mov b,10
mov c,a
mov a,b
mov b,c
log a //记录交换后的结果
log b
ret
遗憾的是大家都比较少写模块功能脚本,缺乏加强交流测试认证(可能功能细小,大家怕写了没人理会),只想写一气呵成、一起包办的专门版本脚本(开始我都认为该这样写)--有的显得相当长篇,难以理解,方法各有特点,一般只有作者本人可以读懂,这样长让作者写注释都要瞄来瞄去,心情欠佳(比如:对付某版本某加壳,作者都希望脚本简短,可多数事与愿为)就不起劲;模块化(一定的功能)可能还未被人重视的原故吧,我个人觉得应该多向这方面考虑出发写一下,好比C语言,就是个大家都普遍了解的例子,模块化一些功能--贵精求精,使之标准化==Public,容易移植,往后,我们要写起脚本来就轻松得多,因为功能已经得到测试认可,只需利用在其模块上修改一些变量或参数等,用#inc或粘贴在适当位置作连接就可事半功倍....
5.在循环设计和判断方面上,应该多考虑错误发生的可能性,调试或运行时可在其中放入pause和log somthing 或step以便监察运行当中的闪失漏洞。比如:我所遇到过的某变量a是的地址变量,在循环中突然变成了0,如果它是参与地址访问,哈哈,后果...
6.认真检查变量对象的名称是否误写了,比如:esp写成了ebp,运行的话,脚本是无法为你检出错误的,因为这些是不需要声明的。
7.我不是程序员,也不是专家,仅是a boy,所说的都是错误中的心声,希望大家都来分享你自己的脚本“心声”,多多少少总会有的,不管它是喜与忧,是不懂还是半懂,只有加强交流和实践,脚本编写方面总会取得一定的成果的。大家很少谈写脚本的心得,猜测原因大概是写脚本的一般都不是真正的程序员(程序员引以为傲的是自己能写程序搞顶吧)或者认为提出要谈论的就一定是高手,然而你写出的功能脚本也有可能是不太实用或实际的,但我认为你愿意跟别人交流已经很不错了--即使那是事实。写脚本比较花时间(有时一个脚本花上好几天,主要是调试)--首先你要取得调试方面的收获,然后又要花尽脑汁去描绘脚本,测试,调试修复,再测试……直到成功,写完后发布,又要经历同样的测试,不难想象,他们(包括我)害羞、没空、希望交流又没人组织和提供交流的固定地点……我可是那一类不想做组织和leader的家伙,当然自己也没什么本事嘛!希望有位中国同志站出来...呵呵,鼓掌中……推举一下loveboom怎么样………
last:
我也有写脚本的问题,好些命令也没机会实践:
象是 0.92的<EXECute/END>对当前调试进程,执行在EXEC和ENDE之间的指令。
exec
push 0
call ExitProcess
ret
ende
我没有执行成功,理解能力差吧,也不知它如何使其能够执行,call ExitProcess 这个OS能理解翻译吗?还有的是call函数一般都要用到句柄参数等,这个命令的执行缺乏透明度,里面干了什么不得而知,有朋友可告知其运用的实例吗?
呵呵,看完了,我可不是练打字呀,希望能大家发动互相交流。如果脚本写得好的话,会有一些惊喜的亮点,很多Ollydbg的其它插件都可以隐居山林了呀……
顺便来一个脚本(不知如何):
// 抵达aspr首次堆栈出现硬盘指纹
//作用:如题,方便大家在aspr定位,比如填写注册信息或什么!欢迎大家测试反馈!
var drc
var test
var zero
var count
mov count,0
dbh
eob break
loop:
esto
inc count
mov drc,esp
add drc,28
mov zero,drc
sub zero,4
mov zero,[zero]
mov drc,[drc]
cmp zero,0
jne loop
cmp drc,0
je loop
mov test,drc
and test,FF000000
cmp test,0
jne loop
final:
log eip
log drc
sub drc,4
cmp [drc],0C
jne loop
log "下面count是使用脚本以来的异常统计:"
log count
cmt eip,"祝贺,你成功抵达首次堆栈出现硬盘指纹的异常!"
ret
break:
msgyn "现在脚本发现不明的断点中断,请选择是否继续Pass异常?Y/N"
cmp $RESULT,0
je end
jmp loop
end:
msg "你选择了结束脚本,Bye Bye!"
ret
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
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. 特许与源代码
--------------------------
过一段时间,我打算卖这个插件,你想继续使用的话必须要交很高的费用!,嘿嘿,开个玩笑。
严肃的说,只要您需要,您可以免费使用这个插件及其源代码。
但是请您在您的文档和版权对话框中,标注上我的名字。
如果您的工程,大规模的使用我了的代码。也请您通知我,我会关心一下的。
这个插件的源代码可以随时提供给您。 如果您需要源代码的话,请发邮件!
------------------------------
7. 鸣谢!
----------
对于所有提交Bug、编写脚本以及提供宝贵建议的朋友,我表示感谢。
感谢R@dier提供Dump引擎。
当然,特别要感谢Olly,是他开发出了如此优秀的调试器!