一直不太会用OD2.0的运行跟踪,所以便有了这个脚本,记录从od载入点到程序运行这期间的全部已执行的指令或者某个范围的已执行指令。可控制记录循环深度,只记录程序用户空间的指令(其中我只记录了比较关心的jxx指令,其他只记地址,当然也可修改),过滤系统空间指令。
因脚本使用了新增加的DOJS(==$$)、switch、tmsg、ends和改进的var等命令,所以需要odbgscript2.18版,详见传送门。
为处理记录循环深度问题,脚本中还使用了超级字符串和超级数组的想法,详见传送门。
代码不到200行,索性贴出来吧。其中loopnum为记录循环深度,结果记录文件默认位置z,自己可更改。我测试结果如附图。
如果有脚本暂停或出错的情况,原因可能是1、od把某个线程挂起了,需按T图标测试恢复运行某个线程即可,其他线程状态不变。也可使用rat命令,但不保证全程有效。
2、目标程序的某个特别反汇编语句未在脚本中进行处理,可参照我的处理方式进行。
//==================== 记录已执行指令的脚本1.5 by ssarg =====================//
//==================== 脚本环境:ODBGScript2.18 =====================//
//---------------------------------------变量声明,loopnum为记录循环深度-----
var cureip,count,counts,jxxs="b",endaddr,minaddr,destaddr,askres
var startaddr,nextaddr1,nextaddr2,urfilepath,maxaddr,label
var filepath="D:\h1\tools\output\chm11.txt",loopnum=300
//--------------------------------------------判断脚本插件是否2.18版本-------
ifb $VERSION, "2.18"
tmsg "ODBGScript版本低,不能运行。最新下载:https://bbs.pediy.com/thread-218670.htm",0
ends
endif
//--------------------------------------------获取调试路径及地址最大最小值---
gpi EXEFILENAME
mov urfilepath,$RESULT
key 23 //到最后一行取地址
gsl CPUDASM
mov maxaddr,$RESULT
key 24 //到第一行取地址
gsl CPUDASM
mov minaddr,$RESULT
//key 9d //返回到OD原始载入点,可省略
//------------------------------------------------询问全程还是范围记录-------
toask:
ask "范围记录(S)还是全程记录(F), s or f ?"
$$ "'@$RESULT@'.toLowerCase()"
switch $RESULT
default:
tmsg "输入错误,请重新输入或取消。",0
jmp toask
breaks
case 0:
exit:
tmsg "已取消或无输入。。。",2.
ends
breaks
case s:
reask:
ask "请按格式输入: 起始地址 , 结束地址 ,如:400000 , 500000"
ifeq $RESULT,0
jmp exit
else
mov askres, $RESULT
call checkin
call record
mov label,"l1"
endif
breaks
case f:
mov label,"l2"
call record
jmp l2
endsw
//------------------------------------------------------------处理范围地址---
l0:
cmp startaddr,eip
je l1
bp startaddr
erun
bc startaddr
l1:
ifeq eip,endaddr
ends
endif
//---------------------------------------------------查找 call,rep,jxx 语句---
l2:
bphwcall
bca
mov cureip,eip
opcode eip
$$ "let rx=/call|rep|j/gi,b='@$RESULT_1@'.split(' '),a=b[0].match(rx);if(a!=null){'l'+a}else{'lother'}"
jmp $RESULT
//---------------------------------------------------------处理jxx语句并记录---
lj:
gci cureip,DESTINATION
mov destaddr, $RESULT
ifa destaddr,maxaddr
call retsky
else
inc count
itoa count,10.
mov counts,$RESULT
mov nextaddr2,eip
gci eip,SIZE
add nextaddr2, $RESULT
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-3-18 10:41
被ssarg编辑
,原因: