IDA实例

IDA实例教程

 

1 软件环境

 

       静态分析有很多好处,例如加壳的程序(尽管对于高手来说这并不会耗费太多时间),我们不需要寻找OEP,也不需要解除自校验,只要修复IAT,DUMP下来就可以动手分析了。假如你需要修改程序,可以使用内存补丁技术。动态与静态,调试器与反汇编器结合可以简化分析任务,帮助我们理解代码。因此掌握一种反汇编器是非常必要的。IDA可以说是这方面的首选工具,它为我们提供了丰富的功能,以帮助我们进行逆向分析。这从IDA复杂的工作界面便可以知道。

 

种类繁多的工具栏

 

       在分辨率不高的情况,这些工具栏与反汇编窗口挤在小屏幕里,看起来不爽。我一般把它关闭(查看=>工具栏=>主工具栏)以获得更好的视觉效果。当我们需要这些功能的时候,直接使用快捷键就可以了。下面是常用快捷键的清单:

 

快捷键

功能

注释

C

转换为代码

一般在IDA无法识别代码时使用这两个功能整理代码

D

转换为数据

A

转换为字符

N

为标签重命名

方便记忆,避免重复分析。

添加注释

R

把立即值转换为字符

便于分析立即值

H

把立即值转换为10进制

Q

把立即值转换为16进制

B

把立即值转换为2进制

G

跳转到指定地址

 

X

交叉参考

便于查找API或变量的引用

SHIFT+/

计算器

 

ALT+ENTER

新建窗口并跳转到选中地址

这四个功能都是方便在不同函数之间分析(尤其是多层次的调用)。具体使用看个人喜好

ALT+F3

关闭当前分析窗口

ESC

返回前一个保存位置

CTRL+ENTER

返回后一个保存位置

 

       在工具栏下面的便是工作窗口。主要的窗口分页有“IDA View-A”、“Name”、“Strings”、“Exports”和“Imports”。对于后面3项相信大家都不会陌生了,它们分别是字符参考,输出函数参考和输入函数参考。Name是命名窗口,在那里可以看到我们命名的函数或者变量。这四个窗口都支持索引功能,可以通过双击来快速切换到分析窗口中的相关内容,使用起来十分方便。

 

简单输入几个字符即可定位目标

 

         IDA View-A是分析窗口,支持两种显示模式,除了常见的反汇编模式之后,还提供图形视图以及其他有趣的功能。

 

IDA的反汇编窗口

 

一般我们在分析的时候,并不关心程序的机械码,所以IDA为我们自动隐藏了这些信息。如果你有需要,可以通过以下步骤来设置:

 

选项=>常规=>反汇编=>显示反汇编行部分=>机械码字节数=>修改为你允许显示的大小

 

       现在让我们以论坛脱壳版块置顶帖的那个经典为例,看看图形视图的表现。首先我们到以下连接下载:http://bbs.pediy.com/upload/bbs/unpackfaq/notepad.upx.rar

 

你能通过图形视图及其缩略图快速找到壳的出口吗?

 

       如图所示,标签40EA0E便是壳的出口代码的地址。在OD中直接跳到该地址,下断点,然后运行到该处,再单步便能看到OEP了。假如希望通过跳转法找OEP,相信图形视图比你在OD一个一个跳转跟随,要快得多。

       再来看看这个壳的另类脱法。直接运行该程序, DUMP下来,再使用IMPORTREC的IAT AutoSearch功能修复输入表。用IDA打开修复了输入表的DUMP文件。在IMPORT窗口随便选一个API,随便通过交叉参考跳转到一个函数的代码。

 

此处为文件输入表的位置

 

       我选了RegQueryValueExA,通过交叉参考,来到Sub_402488处的函数代码。

 

       用鼠标拖动缩略图中的虚线框到上方,便能看到该CALL的头部了。然后按下图指示操作:

 

在函数标记上点击鼠标右键

 

       处于最上层的函数,便是OEP了,使用PE工具修改文件入口为10CC。现在函数可以正常工作了。这个方法的原理是通常我们写程序都有如下流程:

 

Main proc

                     //代码

                     CALL  FUN1

                     //代码

                     CALL  FUN2

                     //代码

END proc

 

       所以处于函数调用最上层的便是MAIN函数了。当然这个方法局限性很大,这里只是对该功能的一种介绍。我们留意到图表功能有两个选项,在上面的例子中,我们使用的是“交叉参考到”。我想细心的朋友大概能通过“交叉参考来自”左边的小图标猜出它的用途了。该功能可以显示目标函数调用了什么函数,当然也包括API。这样除了观察函数的输入参数来判断是否关键CALL之外,又多了一个参考途径。

 

你可能感兴趣的:(re)