逆向工程思路( 二 )


od使用各种窗口+断点逼近目标代码,ida使用同类窗口+交叉引用逼近目标代码 。ida力图通过强化交叉引用能力来弥补断点缺失造成的能力损失,但毕竟交叉引用是断点的弱化版,所以动态调试效果应该来说会比静态调试好,至于还需要静态调试可能是比如病毒等不好动态调试正如老虎不宜随便放出笼来观察一样 。
4.2.1 ida界面

逆向工程思路

文章插图
1----导航带 。整条就是-线性地址定间,点哪主视图窗口就显示哪 。
2-----函数窗口 。程序自己的函数列表,双击函数就可以去到其实义处 。由于编译时不会保存原始函数名,所以如果没有源代码本程序的函数是列不出原始函数名的,只会用形式表示(表示其地址,注意这里说的是“如果没有源代码”,如果有源代码比如你打开的是vc项目debug文件夹下的exe他就能列出原始函数名);至于ida能识别出系统函数名也不是因为保存有原始函数名而是因为ida能把系统函数汇编代码与系统函数名对应上 。另外注意这里只是用户自写的或静态链接入的系统函数,动态链接库的函数在窗口中 。
3----反汇编窗口 。和od的反汇编窗口类似,不过这里能显示非代码段部分 。
4----其他窗口 。包括十六进制窗口、导出窗口、导入窗口、结构体窗口、枚举窗口、字符串窗口、名称窗口、段窗口等,和od相比少了寄存器窗口和堆栈窗口其他基本都是一样 。所有窗口都可以通过菜单----view----Open 来打开 。
5---输出窗口 。ida输出日志的窗口 。
4.2.2 交叉引用
我们前面说过交叉引用里断点的弱化版,我们这里具体来看一下交叉引用长什么样 。不过首先要再次说明动态调试也可以有交叉引用,只是动态调试本身可运行程序,没有很大必要去搞交叉引用而已 。
引用----或者叫调用、使用,比如jmp、call等
交叉引用---既有正向从调用者地址跳转到被调用者地址的链接,也具有反向从被调用者地址跳转回调用者地址链接的引用 。也叫交叉参考 。
交叉引用又分为代码交叉引用和数据交叉引用,代码交叉引用指的是代码之间的调用与被调用,数据交叉引用指代码与数据间的调用与被调用,使用上其实没有什么区别都是双击交叉引用链接就跳转到其调用或被调用处 。这里只介绍交叉引用的各成分,具体长什么样见下节演示 。
交叉引用会被用“;CODE XREF: .text:↑j”的格式标出,各成分解析如下:
;----注释符号
CODE----表示是代码交叉引用,如果是DATA则表示数据交叉引用 。
XREF----交叉引用(Cross )的缩写
.text----表示其引用处在代码段
【逆向工程思路】----引用处的的地址,另外有可能会是_main+4等相对写法都一个意思
↑----表示引用地址在当前地址上方,相应的↓就表示在当前地址的下方
j----在代码交叉引用中可以是j或p;j表示跳转流jump,即jmp等跳转指令的引用,在高级语言即if;p表示调用流,即call指令的引用,在高级语言就是函数调用
在数据交叉引用中可以是r或w,r表示读引用,w表示写引用
4.2.3 ida绕过登录限制演示
假设我们使用和od一样的思路,从函数入手,首先说因为很多地方都可能调用所以确定哪个调用的指令才是登录处调用的的指令是困难的 。其次还是由于无法运行我们得逐条指令分析才能知道哪里是弹出报错窗口 。所以函数入手思路确定目标代码的起始地址和结束地址都是困难的 。
报错时弹出了“好意思,和你不熟”语句我们不防从该句入手 。首先菜单--------text查找该字符串,找到其在处,然后通过双击数据交叉引用,跳到到数据调用处 。