首页
社区
课程
招聘
[原创] $$ 记录已执行指令的odbgscript2.18脚本
发表于: 2017-4-26 23:52 6403

[原创] $$ 记录已执行指令的odbgscript2.18脚本

2017-4-26 23:52
6403

       一直不太会用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         


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2019-3-18 10:41 被ssarg编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (11)
雪    币: 465
活跃值: (667)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
论坛的发帖编辑,字体上色及改大小好像有问题。
2017-4-27 08:29
0
雪    币: 465
活跃值: (667)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
修正一处手误,第159行,jb    l1改为jmp    l1.
2017-4-27 10:06
0
雪    币: 3199
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持,2.0版本用的少,
2017-4-27 10:31
0
雪    币: 465
活跃值: (667)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5

脚本做了下优化,改动:f记录的话,不执行l1标签。最后checkin标签,简化了下语句,功能不变。版本1.1。

2017-4-27 22:20
0
雪    币: 465
活跃值: (667)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
修正进制转换错误:第83句ln=@loopnum#更正为ln=0x@loopnum#
2017-5-12 16:55
0
雪    币: 465
活跃值: (667)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
用新命令和语法逻辑重写了一遍。
2018-12-20 10:05
0
雪    币: 465
活跃值: (667)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
修正一处进制转换错误:
在最后一个注释段落中,//----------------------------------------call调用5:loopnum循环控制-----------
第三行中 ln=@loopnum@ 改为 ln=parseInt('@loopnum@',16) ,其他不变。
正文代码已改。
最后于 2019-1-13 20:27 被ssarg编辑 ,原因:
2019-1-7 16:55
0
雪    币: 465
活跃值: (667)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
用2.18版新命令改写。
2019-2-19 09:52
0
雪    币: 73
活跃值: (923)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这个功能不错。还有就是想问下楼主,涉及到不同DLL之间的call,比如A调用B中的函数,这个代码能支持吗?还是说只支持本模块代码空间的
最后于 2019-2-19 10:20 被zx_348891编辑 ,原因:
2019-2-19 10:19
0
雪    币: 465
活跃值: (667)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
11
kongfubull 这个功能不错。还有就是想问下楼主,涉及到不同DLL之间的call,比如A调用B中的函数,这个代码能支持吗?还是说只支持本模块代码空间的
在目标程序空间内,脚本命令支持ms的api直接调用,具体查看odbgscript2.18的帮助文档。
2019-2-19 11:33
0
雪    币: 73
活跃值: (923)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
多谢。
2019-3-18 02:54
0
游客
登录 | 注册 方可回帖
返回
//