• 标 题:也谈写OllyScript脚本之Career和心声
  • 作 者:askformore
  • 时 间:004-09-25,16:39
  • 链 接:http://bbs.pediy.com

也谈写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