最近由于工作需要分析2模块之间的接口,由于导出的是类没有函数按手动撸几天OD,年纪大了感觉撸不动了,花了几天时间小改进了一下方法这里分享给有需要的朋友们,抛砖引玉,希望大牛们拍砖轻一点给点鼓励:
首先第一个脚本的作用: 对虚表函数用注释来标上你需要的函数名根据需表位置自动标上名称而不重复.
var startaddress//开始读表的位置
var vfpfunname//函数打头
var strfun//这个起始标签
var fladd//存地址用的
ask "请输入虚表起始地址"//是4个字节不是函数地址
mov startaddress,$RESULT//脚本运行时你输入的地址
ask "请输入虚表标签标识"//函数名通过这个自动打标签的前缀便于识别
mov vfpfunname,$RESULT//标签前缀存这个变量
mov strfun,1//标的函数名第一个值以后自动类加
LOOPWRITEVFUN://这边就是循环去取得虚表的地址打上标注
bp [startaddress]//函数位置那边下个断点
eval "{vfpfunname}_{strfun}"//格式化标签名
CMT [startaddress],$RESULT//在函数位置打上标签
add startaddress,4//函数地址存储格式就是4个字节一个函数地址
inc strfun//序号每个函数名自动通过这个函数累加
cmp strfun,400//检查一下函数数量你可以自己更改这边限制100个,
jbe continuelop//没有超出限制大小继续
MSGYN "超过100个函标记了是否需要退出"
cmp $RESULT,1//人工选是否退出根据选择执行脚本,如果你的虚表很大可以改大限制大小这边就方便超过1-2函数不想改代码的
jz overscr//退出脚本
continuelop:
//下面判断是否到了虚表尾部
mov fladd,[startaddress]//取出地址中的位置
cmp 0,[fladd]//检查是否到了虚表尾部了,通常情况下编译器会在虚表最后
jnz LOOPWRITEVFUN//循环
overscr:
ret
以上脚本都详细标注各种用法和如何改进了有需要的朋友可以更进一步发挥一下,有好的改进记得分享一份给我.
过程用法我上几张图片说明:(图片下部我简单标注下用法)
OD在数据窗口找到你需要的虚表地址
运行脚本输入刚才地址(注意:脚本运行是需要断下程序才开始跑以前我不懂闹了不少笑话)
接着你就输入个性的标签吧!!!
运行结果就是看得到了注释里多不少的按顺序的标签也帮你自动下了断点。
到这边第一个脚本也就完成了接着开始跑第二个脚本:
var lognum
var cmtstr//保存注释
var testval
mov lognum,1
MSGYN "清理日记文件模式吗?"
cmp $RESULT,0
jz loopbrk//不清理直接累加继续
LCLR//清理运行日记可以有可无主要是我懒得看那么多日志就自动清理下
wrt "c:\\outlog.txt","开始" //文件名可以自己定义
loopbrk://打上一个标签用来做循环用
run//执行
GCMT eip//获取注释
mov cmtstr,$RESULT//提起一个注释
cmp cmtstr,"savelog"//你在这个地址下断点标上savelog标注那么就会跳过去自动记录字串内容这边你可以手动在strcpy之类的地方下个断打上特殊注释提数据到文件
jz outlog//如果是碰到标签为savelog就保存系统log
eval "->{lognum}::{cmtstr}\r\n"//不是自己特定的注释那么就直接把注释写入日志文件这行十格式化数据
wrta "c:\\outlog.txt",$RESULT//字串写入文件
jmp contineloop//继续循环吧
outlog://标志打下做为输出字串功能
getlog "c:\\outlog.txt",[esp+8],100//输出到日志文件这个函数是我通过修改插件源码重新编译而得,自己可以下修改这边我限制最大100个字节从
//需要的话到我空间去下一个,[esp+8],是地址,100是最大长度
contineloop://下一个循环
inc lognum//日志标签用来格式化数据
jmp loopbrk//循环
ret
通过第二个脚本我们就可以轻松的记录下程序跑的路径了,对于分析函数之间的调用和逻辑关系有不少帮助。
好了写到这边希望能给需要使用OD脚本的人有所帮助,本来这篇文章是写在CSDN的考虑到调试还是看雪更多人需要就顺便发过来蹭点热度吧;
我发个附件给需要的人用上
getlog这个函数,这个函数你们自己可以去修改掉或用别的函数替代,我只是想一步完成几步的事情吧脚本插件给添加了一个函数。