OD插件的编写,用VC6写的,大家可以下来学习学习,献给不会的朋友-OD
V1.65.2(2007/09/5)+ BPHWC 不带参数将删除所有硬件断点+ BC 不带参数将删除所有断点+ BD 不带参数将禁止所有断点+ BPGOTO 遇见断点自动跳转到标签+ buf 转换字符串为ASCII码到缓冲区+ GCI 求制定地址的汇编命令信息+ call 调用标签子程序,用RET返回+ TICK 脚步运行时间+ 脚本行编辑功能+ 如果脚本重新引导,但脚本断点所在行不变化,将继续保持* findcmds 修正错误* 一些小的BUG修正
1. 关于 ODbgScript-------------------ODbgScript 是OLLYDBG调试器的一个插件。我个人认为,OllyDbg是目前最好的程序级调试器。这个调试器的最大的特色之一就是她的插件体系,这是使得用户能够更为有效的扩展她的功能。ODbgScript 是一种通过类汇编语言的脚本,来控制OllyDbg自动运行的插件。在调试程序时,常常都是仅仅为了要找到某几个关键点,而不得不做大量的重复工作。 而通过使用我的脚本解释器,您就可以做到“写一次脚本,无限使用” ODbgScript相对OllyScript最大的升级是你拥有了一个脚本的调试运行窗口,你能很好的控制脚本和观察脚本的运行状态,在ODbgScript的调试窗口中,你可以单步执行你的脚本,可以手工执行脚本命令,可以在你的脚本上下断点,甚至可以调整你的变量值.这对于你调试你的脚本是有所帮助的,在插件窗口你可以选择脚本运行窗口,它就出来了.ODbgScript还有一个日志窗口(LOG),它的开发还不那么完善,我相信在不久的将来,它能为你展现它强大的功能.------------------------------2. 目前情况(2007年5月2日)----------------------------V1.48-2006-5-20开始,ODbgScript由hnhuqiong在Epsylon3开放源码的基础上进行本地化以及继续升级.v1.0-v1.47OllyScript变成ODbgScript,带有新的图形界面,从2005-11-4开始由Epsylon3继承SHaG继续开发.(未知原因从2006-2-6后Epsylon3没有为OllyScript进行新的升级.)v0.92OllyScript目前的下载量已经超过一万次了!这意味着超过2Gb的网络下载流量。这个结果对我来说还不错!因为我要参与一个xray系统项目,这个项目要花去我不少的时间,所以开发这个插件的步伐可能要放慢了。真的对不起大家了。(2004年7月10日起SHaG基本放弃对OllyScript的开发,但他开放了他的源码.)2.1 最新更新(+:增加功能 *:BUG修正 -:去掉功能 #:测试功能)V1.65.2(2007/09/15)+ BPHWC 不带参数将删除所有硬件断点+ BC 不带参数将删除所有断点+ BD 不带参数将禁止所有断点+ BPGOTO 遇见断点自动跳转到标签+ buf 转换字符串为ASCII码到缓冲区+ GCI 求制定地址的汇编命令信息+ call 调用标签子程序,用RET返回+ TICK 脚步运行时间+ 脚本行编辑功能+ 如果脚本重新引导,但脚本断点所在行不变化,将继续保持* findcmds 修正错误* 一些小的BUG修正V1.54(2007/06/01)+GMI 功能扩展,现可得到如下信息MODULEBASE: 模块基地址MODULESIZE: 模块大小CODEBASE: 代码段基地址CODESIZE: 代码段大小DATABASE: 数据段基地址RESBASE: 资源段基地址RESSIZE: 资源段大小IDATATABLE: 输入表基地址(Base address of import data table)entry: 模块入口nsect: 节数目(Number of sections in the module)V1.53(2007/05/03)+ pop,push,test,xchg命令+ findcmds(查找命令序列)* 更换官方PLUGIN重新编译,消除DBH,DBS的BUG* 引导/执行脚本顺序紊乱的重大BUG修复(内部引用NRU和MRU混乱),这个BUG困扰了我很久原版一直有这个BUG,以前不太注意,最近调试多才下决心解决了这个问题.V1.52# 中文说明做了大规模的补充和命令解释以及例子# 为兼容以前版本的脚本,去掉了类C的操作符.# 添加了atxt(调文本a文件汇编后写入指定地址, a文件不支持jmp类汇编)+ 添加了bpx,bpd功能(下,禁止调用函数断点);+ 添加了opentrace功能(打开跟踪)+ 添加了setoption功能(调设置菜单)+ 添加了GAPI功能(判断指定地址API)+ 添加了READSTR功能(读地址中指定大小的字符串)+ 支持16位寄存器(ax,bx...)+ find命令全面升级,可以直接支持变量和内存数据以及字符串,并支持搜索范围+ findop命令全面升级,可以直接支持变量和内存数据,并支持搜索范围+ 添加了findcmd功能(查找命令);* 修正编辑变量数量不能大于50的问题* var BUG修正 * GN功能修正,以便和GAPI区别* GCMT 错误修正(感谢VOLX BUG报告)* 修正ASM汇编代码按照最优模式处理,和OD汇编处理汇编相同(感谢liuyilin BUG报告)* 一些程序内部Bug调整v1.51 * 内部函数(getFLTOperatorPos)重大BUG修正(感谢FLY,xxxx BUG报告)v1.50 release* an引用的api错误修正* len错误修正* 一些小的错误+ 添加在脚本窗口中双击高亮功能V1.49# MSG,MSGYN消息框弹出回归0.92版模式# 增加NEG,NOT,ROL,ROR命令# (内部增加GetBYTEOpValue函数)+ 脚本运行窗口增加运行到光标处菜单功能(F4)+ GMI增加DATABASE,RESBASE,RESSIZE的操作数+ MUL,DIV命令* 修正本地化不准确问题* 修正MOV 缓冲区崩溃问题* 修正exec/ende不释放内存问题* 修正一些小问题* 修正a指令中的错误* 修正exec/ende中的错误(script_pos计数错误,ende被跳过执行)v1.48bata (2006-5-20)# MUL,DIV命令# 脚本运行窗口增加运行到光标处菜单功能(F4)# 本地化# 适当的增加了一些预判读语句,防止用户错误造成崩溃* 修正BPWM的问题* 修正一些字符串定义错误* 修正一些函数的声明错误(CreateOperands==)* 修正缓冲区太小,造成OD崩溃.- 上一版本未开发的函数从类中去除(LogRegNr,Process)3. 文档----------------在这个版本中,附带了两个脚本例子(tElock098.osc 和 UPX.osc)。 这两个脚本,可以迅速找到对应壳的入口。3.1 语言------------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-------保存某些函数的返回值,比如FIND函数运行后的结果,等等。在ODbgScript的脚本调试窗口,你能观察到它的变化,并且可以修改它.$VERSION--------ODBGScript的版本信息,它是系统保留变量名.例:cmp $VERSION, 1.47 //比较是否大于 1.47版ja version_above_147 3.1.2 指令----------------------------------------------#INC 文件名 ---------一个脚本文件包含另外一个脚本.就像调用子程序一样.两个脚本中的变量名不能相同.例:#inc test.txt #LOG---------开始记录运行指令指令会显示在OllyDbg的log窗口中,每条记录前都会加上“-->”的前缀例:#logADD 目的操作数,源操作数---------源操作数与目的操作数相加,并把相加的结果保存到目的操作数中,支持字符串相加.例: add x, 0F // x=x+Fadd eax, x //eax=eax+xadd [401000], 5 //[401000]=[401000]+5浮点数相加add x,16.50 //x=x+16.50(字符串相加)add y, times // 如果在次之前y=1000 ,则在执行完此指令之后y=1000 timesAI------------在OllyDbg中执行“自动步入” [Animate into]操作。相当于在OllyDbg中按下CTRL+F7例:aiALLOC 大小----------申请内存, 你能读/写/执行.例:alloc 1000 //新申请内存,大小为1000,返回结果$RESULT放着申请内存的开始地址.free $RESULT, 1000AN 地址-------从指定地址处,对代码进行分析。例:an eip // 相当于在OllyDbg中按 Ctrl+A键AND 目的操作数, 源操作数-------------源操作数与目的操作数进行逻辑与操作,并将结果保存到到目的操作数中。例: and x, 0F //x=x&&fand eax, x //eax=eax&&xand [401000], 5 //[401000]=[401000]&&5AO--在OllyDbg中执行“自动步过” [Animate over]操作。相当于在OllyDbg中按下CTRL+F8例:aoASK 问题------------显示一个提示输入框,让用户输入,结果保存变量$RESULT中(如果用户按了取消键,则$RESULT=0)。$RESULT_1中放着输入的长度.(注:程序将判读你输入的是字符,$RESULT_1的结果是输入字符数的数目,整型/2,中文数*2)例:ask Enter new EIPcmp $RESULT, 0je cancel_pressedmov eip, $RESULTASM 地址, 指令-----------------修改指定地址的指令。并将修改后的汇编指令长度保存到保留变量$RESULT中例:a eip, mov eax, ecx //将当前指令修改为 mov eax,ecxASMTXT 文件 -----------------汇编指定文件中的指令。将汇编指令长度保存到保留变量$RESULT中并将汇编指令行数保存到保留变量$RESULT_1中例:atxt EIP,mya.txt //将mya.txt文件中的a转成opcode后写入EIP.ATOI str [, base=16.]-----------------转换字符串到16进制整型,[可以将任何进制转成16进制整型]返回结果放到 $RESULT 例:itoa F //字符串F转成了整型,结果会等于Fitoa 10, 10. //字符串10代表十进制,结果会等于ABC 地址-------清除指定地址的断点。例:bc 401000 //清除401000处的断点bc x //清除X(变量值)处的断点bc eip //清除当前EIP处的断点BP addr--------在指定地址设断点例:bp 401000 //在401000处下断点bp x //在X(变量值)处下断点 bp eip //在当前EIP处下断点BPCND 地址, 条件----------------在指定地址处,设置条件断点。例:bp 401000, ECX==1 //当 代码执行到401000且 ecx等于1 时,程序暂停BPD 函数字符串---------------清除调用函数断点,函数为字符串表示.例:bpd GetVersion //取消呼叫GetVersion的断点BPHWC 地址----------删除指定地址处的硬件断点。例:bphwc 401000 //清除 401000处的断点BPHWCALL-----------清除所有的硬件断点例:BPHWCALL //清除所有的硬件断点BPHWS 地址, 模式----------------在指定地址,设置硬件断点。有三种模式: r - 读取, w - 写入 或者 x - 执行.此断点只支持1个字节的动作.例:bphws 401000, x //当执行到此地址时产生中断.Bphws 401000,r //当读取401000的时候产生中断BPL 地址, 表达式--------------在指定地址处设置记录断点,将表达式的结果记录到记录窗口中。例:bpl 401000, eax // 每次执行到401000时,都将eax寄存器的结果记录BPLCND 地址, 表达式, 条件-----------------------在指定地址处设置记录断点,如果条件为真时,将表达式的结果记录到记录窗口中。例:bpl 401000, eax, eax > 1 // 如果执行到401000时,满足eax>1,则将eax寄存器的结果记录BPMC----清除内存断点。例:bpmcBPRM 地址, 大小---------------在指定地址处,设置一个内存读取断点。 “大小” 是指内存中的字节大小。例:bprm 401000, FF //在401000中设置内存读断点,内存中的大小为FFBPWM 地址, 大小---------------在指定地址处,设置一个内存写入断点。“大小” 是指内存中的字节大小。例:bpwm 401000, FF //在401000中设置内存写断点,内存中的大小为FFBPX 函数字符串---------------设置调用函数断点,函数为字符串表示.返回下了断点的地址数量,结果保存在保留变量$RESULT中.例:bpx GetVersion //下呼叫GetVersion断点,断下的语句为 call [xxxxx]BUF var-------转换字符串变量到缓冲区(string/dword variable to a Buffer)Example: mov s, 123buf slog s // output #313233#CMP 目的操作数, 源操作数-------------比较 目的操作数与源操作数的大小,和其对应的汇编指令作用相同。可以是各种数值,甚至可以是字符串(对大小不敏感).例: cmp y, x //比较两个变量(Y和X)的大小,cmp eip, 401000 //比较EIP和401000的大小CMT 地址, 字符串--------------在指定地址处,加入注释。例:cmt eip, 这是入口 //当前地址处 加上“这是入口”的注释COB---发生中断后,让脚本继续执行(移除EOB指令)例:COBCOE---(移除EOE指令)发生异常后,让脚本继续执行例:COEDBH--- 隐藏调试器例:dbhDBS---对隐藏的调试器操作进行恢复,不再隐藏。例:dbsDEC 变量-------对变量进行减一操作例:dec v //V=V-1DIV 目的操作数, 源操作数-------------
钱汇平台