自制反汇编逆向分析工具 迭代第五版本 (二)

本篇介绍的是,逆向分析工具第五版中另一个功能,寄存器访问分布图,包括栈空间的调配情况。

函数中的局部变量,分别使用了栈内存单元和寄存器两种资源来充当。编译器不一定为局部变量分配栈内存单元,而为局部变量分配对应的栈内存单元也不一定按照局部变量定义的顺序来安排,尤其是在优化选项打开的情况下。局部变量和存储单元(栈内存单元以及寄存器单元)如何对应,都是由编译器统一进行调配的。本功能是通过图示的方式,帮助了解,追踪分析和判断寄存器和栈单元调配的情况,从而帮助区分寄存器的有效范围或者是在某段范围的作用(,如从内存单元中加载好并多次访问,或者只是用于数据传送的中间寄存器,又或者是用作短距离的现场保护等)。还有就是,即使编译器为局部变量分配了相应的栈内存单元,也不一定就能说某个栈单元就是某一个局部变量,原因也是一样,栈单元会在函数的不同阶段进行调配,例如某一局部变量在函数体内只在开始处使用了,之后就没有任何访问操作,编译器就会根据具体情况,将其相应的栈单元进行回收重新指派被另一个局部变量所对应。

下面先来看寄存器的调配图。

使用条带打点的方式,打点记录下按代码流顺序,寄存器访问的情况。

绿色点表示读访问。

红色点表示写访问,(作为目的操作数)。

蓝色点表示寻址访问,(就是寄存器寻址访问内存单元)

浅红色水平连接线表示寄存器间的数据传送。

与第二版的反汇编代码相应图共同运作,对过滤的寄存器的垂直条带调配显示区域,以浅灰色高亮。

下面是对寄存器rbx进行过滤的效果图。

 

可以看到rbx分别在0~200B和200~400+B分别有不同的用途。

 

接下来就是关于栈单元的调配。

在x64下栈单元都使用rbp的相对寻址进行访问,不同于32位有些编译器用esp相对寻址,msvc就是这样一个。

首先是将r反汇编代码中访问到的栈内存单元,搜集到选项列表,通过选项列表可以看到哪些栈内存单元被访问到了。

选定一个栈内存单元相对地址,在寄存器调配图的rbp寄存器调配条带状显示区域中就作出相应的显示。

橙色高亮指定的栈内存单元访问的指令位置。

浅橙色垂直连线,连接的是指定栈内存单元被修改的两个相邻位置,也是反映这一栈内存单元的不同有效范围。

黑色点表示对指定栈内存单元进行了读访问的指令位置。配合浅橙色连线共同反映线指定内存单元的使用范围。

下面是指定-0x38(%rbp)栈单元的效果图:

 

 

这个功能回收重用了第四版中,基于JmpBlock-inline的分析策略其中的一个子功能,就是分析跳转入口处的寄存器调配依赖。因为每次跳转不单只是rip指向了另一处,同时跳转目的地也要是承接跳转处寄存器的调配。或者这样说,每次跳转都相当于一次尾调用,调用的汇编函数,使用任意的寄存器作为输入参数,(不遵从高级语言编译代码使用的传参规则。)返回地址可以被优化忽略。

 

posted on 2016-04-18 17:17  bbqz007  阅读(344)  评论(0编辑  收藏  举报