好友
阅读权限 40
听众
最后登录 1970-1-1
前言
NonaWrite出来时,还真以为以后在OD中写补丁代码是个比较爽的事,但写着写着,就发现还是不爽,
当有很多跳转时,就变得更痛苦了,最坏的情况是改一个地方,可能所有跳转都得改变。罪魁祸首就是没有标号
功能,这也是SkyPatch要实现的。
2009.07.02
版本1.3
重写汇编功能模块
修正
1,汇编后的代码没有优化
2,长跳转问题
3,菜单显示问题
2009.06.27
修正BUG1
描述:
如写入的字串变量 $str 放在 VA 地址 00A00000 以后,则类似 push $str 这样的指令无法构建。
错误的命令位于行: 18 PUSH a17250 Unknown identifier 构建失败
修正BUG2
一些语句与OD汇编的代码不一样,导致二进制字节串错位。
谢谢大家的提醒与支持
----------------------------------------------------------------------------------------------------------
2006.12.26
版本1.1
修正了一些Bug
添加了patch数据的导出功能,使用也做了一下调整,脚本写好后,先要编译一下,直到没有错误
然后你可使用patch功能直接在当前调试的文件中打补丁,或直接把patch数据导出到一个文件中,
目前只是提供了C 和delphi两种格式的数据形式。
2006.12.10
版本1.0
一、安装
只要把SkyPatch.dll这个文件放到OllyDbg 的插件目录下,把RAEdit.dll这个文件放到OllyDBG的根目录下
(注:RAEdit.dll千万不能放到插件目录下,否则OD会认为也是个插件,如你已安装了NonaWrite,也请先把插件目
录下RAEdit.dll移到其他目录,其实NonaWrite没用到RAEdit.dll)。安装好后,就可通过OllyDbg 的插件菜单和
相关菜单上访问这个插件了。
二、使用
SkyPatch是一个全新的,与NonaWrite类似的,用来帮助你在 OllyDbg 中写补丁代码的插件,有了它,这回
你会发现在OD中写补丁代码真的是个比较爽的事。
界面比较简单,
一个代码编辑窗口,借用KetilO(RadASM 的作者) 的 RAEdit 控件 (非常感谢)
一个信息输出窗口
四个按键,分别实现汇编补丁代码,打开脚本文件(扩展名为odp或txt),
保存脚本,关闭主界面
剩下的就是你写脚本的事了,但在写之前一定还请你先看完下面的说明
三、语法
支持所有的能在 OllyDbg "汇编"窗口中输入的命令,并添加了标号和块注释功能。
===============================================================================
标号
标号不能重名,
标号要单独一行
分为以下几类
--------------------------------------------------------------------------------
一般标号
格式:@xxx:
说明:以“@”开始,“:”结尾,中间可是任意的26个字母和数字的组合
参考:
@loop3:
xor ecx,ecx
--------------------------------------------------------------------------------
串标号
格式:$xxx
说明:以“@”开始,空格“ ”结尾,中间可是任意的26个字母和数字的组合,
串标号后面可跟用“”引起的字符串,编译后会自动在串后加0,或
用##引起的十六进制字符串,大小必须是2的倍数
串标号可在代码中引用
参考:
$str1 "this is the first string"
"jjjs this is the first string"
$str2 #45efe3003455667898df2256009980000#
mov esi,$str2 ;在代码中引用串标号
--------------------------------------------------------------------------------
语句块结束标号
格式:@$xxx:
说明:以“@$”开始,“:”结尾,中间可是任意的26个字母和数字的组合
这个标号刚开始只想用于串块后标识串块结束地址,后面发现有时
在语句后也有用
参考:
@0x00405E64:
jmp @start ;从0x00405E64跳出
@$backinit: ;再跳回上一次跳出的下一句处
@0x00402690: ;EIP标号,标识串块开始
$str1 "this is the first string"
"jjjs this is the first string"
$str2 #45efe3003455667898df2256009980000#
@$: ;语句结束标号,标识串块结束
--------------------------------------------------------------------------------
EIP标号
格式:@0xxxx:
EIP标号 = 语句结束标号 ± 十六进制的常数(前面包含 0x 前缀):
说明:有两种形式的eip标号,一、以“@0x”开始,“:”结尾,中间可是任意的十六进制地址
二、EIP标号以“@”开始,连着任意的26个字母和数字的组合的标识,“=”后面是一
个表达式(标号[一般标号|EIP标号|语句块结束标号] [加或减] 一个十六进制的常数),
最后以“:”结尾
参考:
@0x00402690: ;EIP标号,标识串块开始
$str1 "this is the first string"
"jjjs this is the first string"
$str2 #45efe3003455667898df2256009980000#
@$: ;语句结束标号,标识串块结束
@start = @$ + 0x4: ;与串块结束相隔4个字节开始写代码
call 406210
================================================================================
注释,分为单行注释和块注释
--------------------------------------------------------------------------------
单行注释
格式:;xxxxxxxx
说明:以“;”开始标识,可注一整行或跟在代码后
--------------------------------------------------------------------------------
块注释
格式:/*xxxxxxx*/
说明:以“/*”开始标识,以“*/”结束标识
--------------------------------------------------------------------------------
四、一个实例
参见包中的test1.odp补丁脚本
五、感谢
感谢olly开发出这么好的工具,试目以待2。0的到来
感谢KetilO(RadASM 的作者) 的 RAEdit 控件 (非常感谢)
最后,如此插件能对你有所帮助,那我的目的就达到了,也真诚希望各位多提宝贵意见
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。