ida pro静态分析

Posted keepcuriosity

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ida pro静态分析相关的知识,希望对你有一定的参考价值。

一、几个概念

1. 反汇编与反编译
源代码程序-->可执行程序,需要经过编译器-->汇编器-->链接器;用来撤销编译和汇编的过程,称之为反编译和反汇编
反汇编:从机器码到汇编代码
反编译:以汇编代码或机器码到高级语言
 
2. 常见的指令架构
指令架构:x86、ARM、MIPS
x86主要应用于pc机上,主要有两种语法表示汇编代码:Intel和AT&T
ARM主要应用于移动端,它的分类也很多,这里不展开
MIPS主要应用于路由器等设备上
 
3. 反汇编的主要方法
反汇编的主要方法:线性扫描、递归下降
 
4. ida
ida是一种递归下降的反汇编器,它支持静态分析和动态调试程序,尤其是在静态分析领域,ida是一款神器
下面介绍了ida静态分析程序的相关约定
ida的命名方式与虚拟地址和栈帧变量有关,常见的有以下几个
    sub_xxxx  地址xxxx处的子例程(过程/方法)
    loc_xxxx  地址xxxx处的一个指令
    byte_xxxx  位置xxxx处的8位数据
    unk_xxxx  位置xxxx处的大小未知的数据


栈是程序运行是的一种数据传输方式,ida在静态分析中提供了栈视图来方便用户的使用
    .text:00401020 ; Attributes: bp-based frame
    .text:00401020
    .text:00401020 ; int __cdecl sub_401020(char *)
    .text:00401020 sub_401020  proc near   ; CODE XREF: sub_401005↑j
    .text:00401020
    .text:00401020 var_4C  = byte ptr -4Ch        //IDA提供的一个摘要栈视图,列出栈帧内被直接引用的每一个变量,以及大小与帧指针的偏移量
    .text:00401020 var_C   = byte ptr -0Ch         // var_为局部变量名称的前缀,后面表示变量与被保存的帧指针之间距离
    .text:00401020 var_4   = dword ptr -4
    .text:00401020 arg_0   = dword ptr  8         // 函数参数名以arg_为前缀,后面表示与最顶端参数之间的相对距离(十六进制)
    .text:00401020
    .text:00401020 push ebp ;  
    .text:00401021 mov ebp, esp
    .text:00401023 sub esp, 4Ch
    .text:00401026 push ebx

 下图为ida通过两种寄存器ESP和EBP来表示栈

二、ida中具体的操作            技术分享图片

1、静态分析中常用快捷键

shift+F12 : strings
shift+F7 :segments
alt+t :text search
ctrl+t: next text
g :快速查找到对应地址
shift+e :提取数据
Enter:跟进函数实现,查看标号对应的地址
Esc  返回跟进处
A  解释光标处的地址为一个字符串的首地址
B  十六进制数与二进制数转换
C  解释光标处的地址为一条指令
D  解释光标处的地址为数据
H  十六进制数与十进制数转换
K  将数据解释为栈变量
X  转换视图到交叉参考模式
 
2、ida 对于结构体的定义及标识
 
结构体:IDA会根据文件的类型自动加载相应的类型库,如vc6win(VisualC++6.0),用户做底层分析时,可以添加mssdk(windows.h)、ntddk(ntddk.h)等。这些库中有相应的结构体,用户分析代码时,可以直接引用。可以通过快捷键”Shitft+F11“,打开加载类型库窗口,然后用鼠标右键选择”Load Type Library(或快捷键Insert)“,在弹出的窗口中选择相应类型库。
选择好类型库后就可以查看内置数据结构了。选择菜单”View/Open subviews/Structure就可以打开结构体管理窗口。按Insert键,在弹出的窗口中选择”Add Standard Structure“,打开标准结构库窗口查找需要的结构名,然后就可以正常使用这些库了。? 在默认情况下,IDA会加载常用的结构,程序类常用的结构体会显示出来,在WNDCLASSA结构一行单击右键,在弹出的菜单中选择Unhide,快捷键是Ctrl++可展开结构,程序相应代码处直接以结构体显示。收起结构的快捷键是Ctrl+-。
定义新的结构体
打开结构体窗口,按下Insert键增加一个新的结构体类型,命名为student。把光标停留在student结构的ends一行,按D键可以键入数据(如id、age)等,重复D键可以在db、dw、dd间切换,直到变成dd,表示是dword类型。而按A键则是键入ASCII字符(如name)为结构体成员。通过N键可以修改相应名称。
创建好结构体后,可以将鼠标放在要被定义的这个位置处,然后执行菜单”Edit/Structs/Sturcuvar“命令,或者快捷键alt+Q,然后选择student结构体。这时对应的数据会被标识为相应的结构体。然后在对应的代码位置x00401006处,选择需要重新定义的数据,如[esi+18h] 通过”Edit/Operand types/Offset/Offset(Struct)“或者快捷键T可将相应位置的代码修改为有意义的结构体名称。

 

三、在linux中安装ida
wine安装(官网)-->安装ida(不安装python27 x64)-->下载 Python 2.7 的 MSI 文件,命令行下执行:wine64 msiexec /i python-2.7.15.amd64.msi
wine安装的文件在/home/.wine/drive_c/中,这个相当与windows的c盘

以上是关于ida pro静态分析的主要内容,如果未能解决你的问题,请参考以下文章

《恶意代码分析实战》-第五章 IDA Pro(含20种必备操作技能)

使用IDA Pro的REobjc模块逆向Objective-C二进制文件

Windows破解&逆向-CrackMe_1实例(使用IDA Pro修改静态区资源)

IDA Pro代码破解揭秘的内容简介

静态分析:IDA逆向代码段说明 textidatardatadata

IDA Pro代码破解揭秘的编辑推荐