@oro-oro
2015-10-28T14:40:34.000000Z
字数 5916
阅读 18630
IDAForAndroid
$ cd android-ndk-r10d/samples/hello-jni/
$ ndk-build
[arm64-v8a] Gdbserver : [aarch64-linux-android-4.9] libs/arm64-v8a/gdbserver
[arm64-v8a] Gdbsetup : libs/arm64-v8a/gdb.setup
[x86_64] Gdbserver : [x86_64-4.9] libs/x86_64/gdbserver
[x86_64] Gdbsetup : libs/x86_64/gdb.setup
[mips64] Gdbserver : [mips64el-linux-android-4.9] libs/mips64/gdbserver
[mips64] Gdbsetup : libs/mips64/gdb.setup
[armeabi-v7a] Gdbserver : [arm-linux-androideabi-4.8] libs/armeabi-v7a/gdbserver
[armeabi-v7a] Gdbsetup : libs/armeabi-v7a/gdb.setup
[armeabi] Gdbserver : [arm-linux-androideabi-4.8] libs/armeabi/gdbserver
[armeabi] Gdbsetup : libs/armeabi/gdb.setup
[x86] Gdbserver : [x86-4.8] libs/x86/gdbserver
[x86] Gdbsetup : libs/x86/gdb.setup
[mips] Gdbserver : [mipsel-linux-android-4.8] libs/mips/gdbserver
[mips] Gdbsetup : libs/mips/gdb.setup
[arm64-v8a] Install : libhello-jni.so => libs/arm64-v8a/libhello-jni.so
[x86_64] Install : libhello-jni.so => libs/x86_64/libhello-jni.so
[mips64] Install : libhello-jni.so => libs/mips64/libhello-jni.so
[armeabi-v7a] Install : libhello-jni.so => libs/armeabi-v7a/libhello-jni.so
[armeabi] Install : libhello-jni.so => libs/armeabi/libhello-jni.so
[x86] Install : libhello-jni.so => libs/x86/libhello-jni.so
[mips] Install : libhello-jni.so => libs/mips/libhello-jni.so
$ cd libs/armeabi
$ ls
gdb.setup gdbserver libhello-jni.so
IDA 每次启动的时候,都会看到这个快速开始的界面。
如果想直接进入IDA界面,在下方的Display at startup
打勾即可。
打开文件有2种方式:
1、将要分析的文件拖入IDA中。
2、通过 File->Open 打开(相当于New的方式)。
IDA打开文件时,会遍历<IDA>/loaders
目录中文件加载器[1](Loader),如果加载器能够识别该文件,则会将其显示到加载器列表中(如下图)。
Binary file
(二进制文件)这是加载无法识别的文件是的默认选项。
ELF for ARM(Share object)[elf.ldw]
是文件加载器,libhello-jni.so就是ARM平台上的so。这太好了, 只需要点击OK
进入IDA分析界面[2]。
打开文件后,IDA会在在文件目录创建一个数据库(.idb),其组件分别保存在4个文件中(id0,id1,nam,til)
$ ls
gdb.setup libhello-jni.id0 libhello-jni.idb libhello-jni.so
gdbserver libhello-jni.id1 libhello-jni.nam libhello-jni.til
为了方便,在关闭当前项目时,这4个文件将被存档。
如果关闭的时候,选择Pack database
(如下图),它们将会被压缩成一个IDB文件。
$ ls
gdb.setup gdbserver libhello-jni.idb libhello-jni.so
而这个IDB文件会保存之前分析人员对文件的分析和修改情况,譬如修改的代码或者增加的注释,都会保存在数据库中,而下次打开只需要打开数据库文件即可。
包含与IDA的常用操作对应的工具。可以使用View->Toolbars
显示或隐藏工具栏。
导航带是被加载文件地址空间的线性视图。
在导航带上,会有一个细小的黄色的小箭头,指向与当前反汇编窗口中显示的地址范围对应的地址。
将光标悬停在导航带的任何位置,IDA会显示一个工具提示,指出其在二进制文件中的对应位置。
单击导航带,反汇编视图将跳转到二进制文件中你选定的位置。
IDA为当前打开的每一个数据视图都以标签(TAB)的方式显示。
通过View->Open Subviews
菜单开启或关闭的对应的视图。
也就是IDA View,是主要数据显示视图。
该视图仅在使用图形视图时显示,它显示图形视图的整体结构,其中的虚线矩形表示其在图
形视图中的当前显示位置。
在图形概况窗口内单击鼠标,可重新定位图形视图的显示位置。
显示的是IDA的一些操作信息。
用于列举IDA在数据库中识别的每一个函数。
stringFromJNI函数在二进制文件中.text部分,虚拟地址为00000C18,长度为0x44。
双击这个函数,反汇编窗口将跳转到选定函数所在的位置。
IDA 包含大量视图窗口,故工作桌面可能会变得异常混乱。
Windows->Reset Desktop
可迅速将桌面恢复到原始布局。Windows->Save Desktop
可保存的当前桌面布局。Windows->Load Desktop
可迅速打开之前保存的桌面布局。Options->Font
,可设置Disassembly视图的字体,它是唯一一个可以修改字体的窗口。IDA为当前打开的每一个数据视图都以标签(TAB)的方式显示。
通过View->Open Subviews
菜单开启或关闭的对应的视图。
这是反汇编视图,可以通过View->Open Subviews->Disassembly
打开。
它有2种视图,使用空格键
快捷键,可以在两个视图之间切换。
图形视图(Graph View)
在图形视图中,IDA显示的是某个函数在某一时间的流程图,可以通过该函数结构的视觉分解图来了解函数的运行情况。
图里有3种颜色的箭头:
出现条件执行的时候,必然会出现分支,这些语句通常是if等存在条件判断的语句。
注意:图形视图仅仅支持函数,一次显示一个函数。
文本视图(Text View)
文本视图内则是汇编代码的文本,如果是Text段/函数,则可以切换为图形视图。
下图
①为箭头区,实线表示非条件跳转,虚线表示条件跳转。
②为交叉引用,表示另外一个指令会调用/跳转到这里执行。
这个窗口显示文件的16进制,且自动同反汇编窗口(IDA View)同步。
譬如,我们在IDA View看00000C18处的stringFromJNI函数,点击Hex View,它会自动跳到00000C18这个位置,且会高亮00000C18处的16进制代码。
当然,也可以取消这个2个窗口的同步。
导出窗口列出文件的入口点,它提供与objdump (-T)、readelf (-s)和dumpbin (/EXPORTS)等命令行工具类似的功能。
双击窗口中的一个条目,IDA将会跳转到反汇编窗口中与该项目有关的地址。
它列出由被分析的二进制文件导入的所有函数。
只有在二进制文件使用共享库时,IDA才需要用到导入窗口。静态链接的二进制文件不存在外部依赖关系,因此不需要导入其他内容。
由于被导入的函数的代码位于共享库中,窗口中每个条目列出的地址为相关导入表条目的虚拟地址。
IDA是一种静态分析工具,它无法获知程序在执行时会在这个内存位置输入什么地址。
导入窗口还提供与objdump (-T)、readelf (-s)和dumpbin (/IMPORTS)等命令行工具类似的功能。
对于导入窗口,需要记住的一点是:导入窗口仅显示二进制文件想要动态加载器自动处理的
符号,二进制文件选择使用dlopen/dlsym或LoadLibrary/GetProcAddress等机制自行加载的符号将
不会在导入窗口中显示。
结构体窗口用于显示IDA决定在一个二进制文件中使用的任何复杂的数据结构(如C结构体和
联合)的布局。
Strings窗口中显示的是从二进制文件中提取出的一组字符串,以及每个字符串所在的地址,功能等同于strings及其他一些实用工具,可以通过View->Open Subviews->trings
打开该窗口。
双击Strings窗口中的任何字符串,反汇编窗口将跳转到该字符串所在的地址。将Strings窗口与交叉引用[5]相结合,可迅速定位你感兴趣的字符串,并追踪到程序中任何引用该字符串的位置。
IDA并不会永久保存它从二进制文件中提取出的字符串。因此,每次打开Strings窗口,IDA都会扫描或重新扫描整个数据库,查找其中的字符串[6]。
它简要列举了一个二进制文件的所有全局名称。
名称是指对一个程序虚拟地址的符号描述。在最初加载文件的过程中,IDA会根据符号表和签名分析派生出名称列表。双击Names窗口中的名称,可立即跳转到显示该名称的反汇编视图。
Names窗口中显示的名称采用了颜色和字母编码:
浏览反汇编代码清单时,其中许多已命名的位置在Named窗口中并没有对应的名称。在对一个程序进行反汇编的过程中,IDA会为所有直接作为代码(分支或调用目标)或数据(读取的、写入的或使用的地址)引用的位置生成名称。如果一个位置已在程序符号表中命名,IDA将采用该名称。如果符号表中某一程序位置没有名称,则IDA会生成一个默认的名称,以在反汇编过程中使用。
在IDA给某个位置命名时,它会使用该位置的虚拟地址和一个表示该位置的类型的前缀进行命名。
将虚拟地址合并到生成的名称中,可确保生成的所有名称的唯一性,因为没有两个位置的虚拟地址是相同的。这种自动生成的名称并不在Names窗口中显示。用于自动生成名称的一些常用前缀包括以下这些。
段窗口显示的是在二进制文件中出现的段的简要列表。
需要注意的在,在讨论二进制文件的结构时,IDA术语段(segment)常称为节(section)。
请不要将这里的术语段与实施分段内存体系结构的CPU中的内存段混淆。
该窗口中显示的信息包括段名称、起始和结束地址以及许可标志。
起始和结束地址代表程序段在运行时对应的虚拟地址范围。
libhello-jni.so 明显是一个elf格式的文件,这是由IDA加载器识别出来的。
双击段窗口中的任何条目,IDA将跳转到反汇编窗口中该段的起始位置。
右击一个条目,IDA将显示一个上下文菜单,你可以选择添加新段、删除现有段、或者编辑现有段的属性。在对非标准格式的文件进行逆向工程时,这些功能特别有用,因为二进制文件的段结构可能还没有被IDA加载器检测出来。
段窗口所对应的命令行工具包括objdump (-h)、readelf (-s)和dumpbin (/HEADERS)。