一、几个概念

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中具体的操作            

ida分析 java_ida分析 java

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

F5/tab:功能都是查看伪c代码,但tab可以在伪c代码和汇编之间相互切换,且切换时光标位置相同

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盘