第五章 静态分析 Android 程序(五)(使用 IDA Pro 进行静态分析)

时间:2024-10-25 15:00:35
  • 实例:Crackme0502
  • 解压 APK 取得 ,打开 IDA Pro,将 DEX 拖入 IDA Pro(或用 IDA Pro 打开 DEX),选择默认选项,等待分析完成
    在这里插入图片描述
    在这里插入图片描述
  • IDA Pro 支持以结构化形式显示数据结构。单击“IDA View-A”选项卡,来到反汇编代码界面(其实默认进入的就是此界面),然后单击菜单项“Jump”->“jump to address”,或按“G”键,会弹出地址跳转对话框,输入 0,跳转到 DEX 文件的开头(一开始一般就在开头)。可看到, IDA Pro 已自动解释了结构体信息并加上了注释
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 单击菜单项“Jump”->“Jump to segment”,或按组合键“Ctrl+S”,会弹出段选择对话框。如下图,IDA Pro 将 DEX 分成了 11 个段,每个段所对应的偏移量与 DexHeader 结构体相对应,最后两个段的偏移量可通过计算得出
    在这里插入图片描述
  • DEX 中所有方法的详细信息可在“Exports”选项卡中查看,方法的命名规则为“类名.方法名@方法声明”
    在这里插入图片描述
  • 在“Exports”中任选一项,如 @LL,双击,跳转到对应的反汇编代码处
    在这里插入图片描述
  • IDA Pro 的反汇编代码用 ref 关键字表示非 Java 标准类型的引用。方法第一行中 invoke-super 指令的前半部分如下:
    invoke-super {this, p0}, <ref (ref)
  • 前面的 ref 是 swapCursor() 的返回类型,后面括号里的 ref 是参数类型
  • 后半部分的代码是 IDA Pro 智能识别出来的。IDA Pro 能智能识别 Android SDK 的 API 函数,并用 imp 关键字将其标识出来。如第一行中的 invoke-super 指令的后半部分如下:
    imp. @ _def_ResourceCursorAdapter_swapCursor@LL>
  • imp 表示该方法为 Android SDK 中的 API,“@”后的部分为 API 的声明,类名和方法名间用下划线分隔
  • IDA Pro 能识别隐式传递过来的 this 引用。在 smali 语法中用 p0 寄存器传递 this 指针。此处,由于 this 取代了 p0,后面的寄存器命名值都要依次减一
  • IDA Pro 能识别代码中的循环、switch 分支、try/catch 结构,并能将它们用类似高级语言的结构形式显示出来,这对分析大型程序时了解代码结构帮助很大