[关闭]
@oro-oro 2015-10-28T06:40:34.000000Z 字数 5916 阅读 18490

一、《IDA Pro权威指南》入门笔记

IDAForAndroid


1. 准备 libhello-jni.so

  1. $ cd android-ndk-r10d/samples/hello-jni/
  2. $ ndk-build
  3. [arm64-v8a] Gdbserver : [aarch64-linux-android-4.9] libs/arm64-v8a/gdbserver
  4. [arm64-v8a] Gdbsetup : libs/arm64-v8a/gdb.setup
  5. [x86_64] Gdbserver : [x86_64-4.9] libs/x86_64/gdbserver
  6. [x86_64] Gdbsetup : libs/x86_64/gdb.setup
  7. [mips64] Gdbserver : [mips64el-linux-android-4.9] libs/mips64/gdbserver
  8. [mips64] Gdbsetup : libs/mips64/gdb.setup
  9. [armeabi-v7a] Gdbserver : [arm-linux-androideabi-4.8] libs/armeabi-v7a/gdbserver
  10. [armeabi-v7a] Gdbsetup : libs/armeabi-v7a/gdb.setup
  11. [armeabi] Gdbserver : [arm-linux-androideabi-4.8] libs/armeabi/gdbserver
  12. [armeabi] Gdbsetup : libs/armeabi/gdb.setup
  13. [x86] Gdbserver : [x86-4.8] libs/x86/gdbserver
  14. [x86] Gdbsetup : libs/x86/gdb.setup
  15. [mips] Gdbserver : [mipsel-linux-android-4.8] libs/mips/gdbserver
  16. [mips] Gdbsetup : libs/mips/gdb.setup
  17. [arm64-v8a] Install : libhello-jni.so => libs/arm64-v8a/libhello-jni.so
  18. [x86_64] Install : libhello-jni.so => libs/x86_64/libhello-jni.so
  19. [mips64] Install : libhello-jni.so => libs/mips64/libhello-jni.so
  20. [armeabi-v7a] Install : libhello-jni.so => libs/armeabi-v7a/libhello-jni.so
  21. [armeabi] Install : libhello-jni.so => libs/armeabi/libhello-jni.so
  22. [x86] Install : libhello-jni.so => libs/x86/libhello-jni.so
  23. [mips] Install : libhello-jni.so => libs/mips/libhello-jni.so
  24. $ cd libs/armeabi
  25. $ ls
  26. gdb.setup gdbserver libhello-jni.so

2. IDA 简介

2.1 IDA 启动

IDA 每次启动的时候,都会看到这个快速开始的界面。

Imgur

如果想直接进入IDA界面,在下方的Display at startup打勾即可。

2.1 文件打开

打开文件有2种方式:
1、将要分析的文件拖入IDA中。
2、通过 File->Open 打开(相当于New的方式)。

IDA打开文件时,会遍历<IDA>/loaders目录中文件加载器[1](Loader),如果加载器能够识别该文件,则会将其显示到加载器列表中(如下图)。

Imgur

Binary file(二进制文件)这是加载无法识别的文件是的默认选项。

ELF for ARM(Share object)[elf.ldw] 是文件加载器,libhello-jni.so就是ARM平台上的so。这太好了, 只需要点击OK进入IDA分析界面[2]

2.2 IDA 数据库文件

打开文件后,IDA会在在文件目录创建一个数据库(.idb),其组件分别保存在4个文件中(id0,id1,nam,til)

  1. $ ls
  2. gdb.setup libhello-jni.id0 libhello-jni.idb libhello-jni.so
  3. gdbserver libhello-jni.id1 libhello-jni.nam libhello-jni.til

为了方便,在关闭当前项目时,这4个文件将被存档。
如果关闭的时候,选择Pack database(如下图),它们将会被压缩成一个IDB文件。

Imgur

  1. $ ls
  2. gdb.setup gdbserver libhello-jni.idb libhello-jni.so

而这个IDB文件会保存之前分析人员对文件的分析和修改情况,譬如修改的代码或者增加的注释,都会保存在数据库中,而下次打开只需要打开数据库文件即可。

2.2 IDA 界面简介

Imgur

2.2.1. 工具栏区域

包含与IDA的常用操作对应的工具。可以使用View->Toolbars显示或隐藏工具栏。

2.2.2. 概况导航栏(导航带)

Imgur
导航带是被加载文件地址空间的线性视图。
在导航带上,会有一个细小的黄色的小箭头,指向与当前反汇编窗口中显示的地址范围对应的地址。
将光标悬停在导航带的任何位置,IDA会显示一个工具提示,指出其在二进制文件中的对应位置。
单击导航带,反汇编视图将跳转到二进制文件中你选定的位置。

2.2.3. 子视图标签

IDA为当前打开的每一个数据视图都以标签(TAB)的方式显示。
通过View->Open Subviews菜单开启或关闭的对应的视图。

2.2.4. 反汇编视图

也就是IDA View,是主要数据显示视图。

2.2.5. 图形概况视图

该视图仅在使用图形视图时显示,它显示图形视图的整体结构,其中的虚线矩形表示其在图
形视图中的当前显示位置。
在图形概况窗口内单击鼠标,可重新定位图形视图的显示位置。

2.2.6. 输出窗口

显示的是IDA的一些操作信息。

2.2.7. 函数窗口

用于列举IDA在数据库中识别的每一个函数。
Imgur

stringFromJNI函数在二进制文件中.text部分,虚拟地址为00000C18,长度为0x44。
双击这个函数,反汇编窗口将跳转到选定函数所在的位置。

2.2.8. IDA的桌面配置

IDA 包含大量视图窗口,故工作桌面可能会变得异常混乱。

3. IDA 主要的数据窗口

IDA为当前打开的每一个数据视图都以标签(TAB)的方式显示。
通过View->Open Subviews菜单开启或关闭的对应的视图。

3.1 IDA-View

这是反汇编视图,可以通过View->Open Subviews->Disassembly打开。

它有2种视图,使用空格键快捷键,可以在两个视图之间切换。

3.2 十六进制窗口(Hex View)

这个窗口显示文件的16进制,且自动同反汇编窗口(IDA View)同步。

譬如,我们在IDA View看00000C18处的stringFromJNI函数,点击Hex View,它会自动跳到00000C18这个位置,且会高亮00000C18处的16进制代码。

当然,也可以取消这个2个窗口的同步。
Imgur

3.3 导出窗口(Exports)

导出窗口列出文件的入口点,它提供与objdump (-T)、readelf (-s)和dumpbin (/EXPORTS)等命令行工具类似的功能。
Imgur

双击窗口中的一个条目,IDA将会跳转到反汇编窗口中与该项目有关的地址。

3.4 导入窗口(Imports)

它列出由被分析的二进制文件导入的所有函数。
只有在二进制文件使用共享库时,IDA才需要用到导入窗口。静态链接的二进制文件不存在外部依赖关系,因此不需要导入其他内容。

由于被导入的函数的代码位于共享库中,窗口中每个条目列出的地址为相关导入表条目的虚拟地址。

IDA是一种静态分析工具,它无法获知程序在执行时会在这个内存位置输入什么地址。

导入窗口还提供与objdump (-T)、readelf (-s)和dumpbin (/IMPORTS)等命令行工具类似的功能。

对于导入窗口,需要记住的一点是:导入窗口仅显示二进制文件想要动态加载器自动处理的
符号,二进制文件选择使用dlopen/dlsym或LoadLibrary/GetProcAddress等机制自行加载的符号将
不会在导入窗口中显示。

Imgur

3.5 结构体窗口(Structures)[4]

结构体窗口用于显示IDA决定在一个二进制文件中使用的任何复杂的数据结构(如C结构体和
联合)的布局。

结构体窗口

3.6 Strings窗口

Strings窗口中显示的是从二进制文件中提取出的一组字符串,以及每个字符串所在的地址,功能等同于strings及其他一些实用工具,可以通过View->Open Subviews->trings打开该窗口。

strings

双击Strings窗口中的任何字符串,反汇编窗口将跳转到该字符串所在的地址。将Strings窗口与交叉引用[5]相结合,可迅速定位你感兴趣的字符串,并追踪到程序中任何引用该字符串的位置。

IDA并不会永久保存它从二进制文件中提取出的字符串。因此,每次打开Strings窗口,IDA都会扫描或重新扫描整个数据库,查找其中的字符串[6]

3.7 Names窗口

它简要列举了一个二进制文件的所有全局名称。

名称是指对一个程序虚拟地址的符号描述。在最初加载文件的过程中,IDA会根据符号表和签名分析派生出名称列表。双击Names窗口中的名称,可立即跳转到显示该名称的反汇编视图。

Names窗口中显示的名称采用了颜色和字母编码:

Imgur

浏览反汇编代码清单时,其中许多已命名的位置在Named窗口中并没有对应的名称。在对一个程序进行反汇编的过程中,IDA会为所有直接作为代码(分支或调用目标)或数据(读取的、写入的或使用的地址)引用的位置生成名称。如果一个位置已在程序符号表中命名,IDA将采用该名称。如果符号表中某一程序位置没有名称,则IDA会生成一个默认的名称,以在反汇编过程中使用。

在IDA给某个位置命名时,它会使用该位置的虚拟地址和一个表示该位置的类型的前缀进行命名。
将虚拟地址合并到生成的名称中,可确保生成的所有名称的唯一性,因为没有两个位置的虚拟地址是相同的。这种自动生成的名称并不在Names窗口中显示。用于自动生成名称的一些常用前缀包括以下这些。

3.8 段窗口

段窗口显示的是在二进制文件中出现的段的简要列表。
需要注意的在,在讨论二进制文件的结构时,IDA术语段(segment)常称为节(section)。
请不要将这里的术语段与实施分段内存体系结构的CPU中的内存段混淆。

该窗口中显示的信息包括段名称、起始和结束地址以及许可标志。
起始和结束地址代表程序段在运行时对应的虚拟地址范围。

Imgur

libhello-jni.so 明显是一个elf格式的文件,这是由IDA加载器识别出来的。

双击段窗口中的任何条目,IDA将跳转到反汇编窗口中该段的起始位置。
右击一个条目,IDA将显示一个上下文菜单,你可以选择添加新段、删除现有段、或者编辑现有段的属性。在对非标准格式的文件进行逆向工程时,这些功能特别有用,因为二进制文件的段结构可能还没有被IDA加载器检测出来。

段窗口所对应的命令行工具包括objdump (-h)、readelf (-s)和dumpbin (/HEADERS)。


[1] 更加详细的内容,请参考《IDA Pro权威指南(第2版)》第18章。
[2] 更加详细的内容,请参考《IDA Pro权威指南(第2版)》第4章 4.1.1 和第21章。
[3] 更加详细的内容,请参考《IDA Pro权威指南(第2版)》第5章。
[4] 更加详细的内容,请参考《IDA Pro权威指南(第2版)》第8章。
[5] 更加详细的内容,请参考《IDA Pro权威指南(第2版)》第9章。
[6] 更加详细的内容,请参考《IDA Pro权威指南(第2版)》第5章 5.3.1 Strings窗口。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注