IDAPro(简称IDA)是DataRescue公司( www.datarescue.com)出品的一款交互式反汇编工具,它功能强大、操作复杂,要完全掌握它,需要很多知识。IDA最主要的特性是交互和多处理器。操作者可以通过对IDA的交互来指导IDA更好地反汇编,IDA并不自动解决程序中的问题,但它会按用户的指令找到可疑之处,用户的工作是通知IDA怎样去做。比如人工指定编译器类型,对变量名、结构定义、数组等定义等。这样的交互能力在反汇编大型软件时显得尤为重要。多处理器特点是指IDA支持常见处理器平台上的软件产品。IDA支持的文件类型非常丰富,除了常见的PE格式,还支持Windows,DOS,UNIX,Mac,Java,.NET等平台的文件格式。
使用IDA打开exe文件

IDA会自己选择处理器的类型,一般默认即可。

进入IDA后,左侧是函数窗口,双击函数,即可跳转到对应的视图

在对应的视图按下F5,可以进入该函数的伪代码视图

如果不小心关闭了某个视图或者函数窗口,在窗口(windows)->重置桌面(rese desktop),重置界面

IDA-view有两种视图模式,快捷键空格切换视图模式
在IDA-view,右键->图形视图(graph view)

图形视图(graph view)可以看到程序的分支结构,比如可以看到if else的两个分支最终分别执行了哪些函数,图中有箭头表示, 绿色就是代表判断条件成功,红色代表判断失败,蓝色的表示普通的调用逻辑。

在IDA-view,右键->文本视图(text view)

文本视图(text view)看上去就类似OD一样,看到了汇编指令

视图(view)->打开子视图(open subviews)->字符串视图(strings),快捷键shift + F12

可以看到程序中出现的字符串

此时关闭HEX视图(hex view),双击'well done!',则会在反汇编视图(IDA-view)定位到字符串出现的位置:

光标移到这里,按下键盘字母x,查看他的交叉引用,可以看到这个变量、函数在何处被调用:

a:将数据转换为字符串
esc:回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)
shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置
ctrl+w:保存ida数据库
ctrl+s:选择某个数据段,直接进行跳转
ctrl+鼠标滚轮:能够调节流程视图的大小
x:对着某个函数、变量按该快捷键,可以查看它的交叉引用g:直接跳转到某个地址
n:更改变量的名称
y:更改变量的类型
/:在反编译后伪代码的界面中写下注释
:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多
;:在反汇编后的界面中写下注释
ctrl+shift+w:拍摄IDA快照
u: undefine,取消定义函数、代码、数据的定义

这是一个CHAR类型的数组,IDA识别出的长度是200。
我们也可以自己创建数组。在操作IDA的时候,经常会遇到需要创建数组的情况,尤其是为了能方便我们看字符串的时候,创建数组显得非常必要,以下我随便找了个数据来创建数组 首先点击选中你想要转换成数组的一块区域(我选中了26行)

在菜单栏中选择: 编辑(edit)->数组(array)

创建好了以后,就变成了这样,1A dup(0)代表数组中有0x1A个(26个)0x00:

如果看着不直观,可以快速修改数组设置,右键->数组(array),取消勾选Use “dup" construct:

保存,可以看到是一个长度26的数组

创建结构体是在IDA的structures窗口中进行的

这个程序没有结构体,换一个程序,蓝色部分是结构体

右键->隐藏/取消隐藏(hide/unhide),来显示、隐藏结构体的内容,快捷键ctrl + (小键盘+号)/快捷键ctrl + (小键盘-号)

点击unhide后可以看到该结构体的内容:

右键->添加结构类型(Add struct type),快捷键insert,可以创建结构体/联合体

在弹出的窗口中,可以编辑结构体的名字

这底下有三个复选框
第一个表示显示在当前结构体之前(就会排列在第一位,否则排列在你鼠标选定的位置)
第二个表示是否在窗口中显示新的结构体
第三个表示是否创建联合体。需要注意的是,结构体的大小是它所包含的字段大小的总和,而联合体的大小则等于其中最大字段的大小
在单击ok以后,就定好了一个空的结构体:

将鼠标放在ends这一行,单击快捷键D即可添加结构体成员,成员的命名默认是以field_x表示的,x代表了该成员在结构体中的偏移

同时,可以把鼠标放在结构体成员所在的行,按D,就可以切换不同的字节大小
默认情况下可供选择的就只有db,dw,dd (1,2,4字节大小)
• db 指 “define byte”,在内存中保留1字节,
• dw 指 “define word” (在内存中保留2字节),
• dd 指 “define double-word” (在内存中保留4字节).
如果想添加新的类型,可以在option-->setup datatypes(快捷键Alt+D),进行设置

当勾选了5和9之后,使用D切换结构体成员的类型会出现新的类型(需要注意每个类型的长度不同)

对目标类型,右键->数组(array)可以将目标类型的结构体成员,转化为数组类型的结构体成员,快捷键:小键盘(+) + (*)

这样就创建出来元素长度为4,数组长度4*16的数组结构体成员了


如果要删除结构体,那么对着结构体按下delete键即可删除
如果要删除成员,则对着成员按下u (undefine)但是需要注意的是,这里只是删除了成员的名字,而没有删除它所分配的空间
按下**u**删除了中间的DebugInfo的成员:

光标移到这里,按下x交叉引用

在反汇编窗口,双击结构体,进入结构中:

在结构中发现之前删除的结构体成员,其所占的内存空间并没有被删除:

4个db数据,也就是之前删除结构体成员:dd类型的DebugInfo
这时如果要删除掉这些空间,就需要回到结构体视图,在原来数组成员所在的第一行中按下Ctrl+S,或者(Edit-->shrink struct types)就可以真正的删除掉成员

点击确定,移除4个字节:

再回反汇编窗口查看,之前占用的空间已经释放

给结构体的成员重命名可以用快捷键N

实际上,IDA有提供一个更方便的创建结构体的方法,就是直接写代码导入
在视图(View)->打开子视图(0pen Subviews)->本地类型(Local Types)中可以看到本地已有的结构体

在该窗口中右击insert,保存结构体

但同时我们发现structure视图里面,并没有这个结构体,我们需要对着my_structure右击,选择synchronize to idb

在结构体视图(structures)就可以看到刚刚保存的结构体了

我们在IDA中创建好了结构体以后,就是去应用它了快捷键Y可以更改函数、变量的类型和参数

修改完成,如果没有变化,按下F5刷新

IDA修复堆栈平衡
有时IDA会提示反编译失败,可能是因为堆栈不平衡导致的,目前暂时没有遇到这种情况,先存下大佬们的笔记,后续遇到了再观摩
[推荐]IDA sp-analysis failed 不能F5的 解决方案之(一):https://bbs.pediy.com/thread-140002.htm
[推荐]IDA sp-analysis failed 不能F5的 解决方案之(二) :https://bbs.pediy.com/thread-158896.htm