Android 无源码调试

在逆向 Android APP 的过程中,有时候盯着一串加密算法,不断地在脑子模拟,并发生“栈溢出”和“OOM”。动态调试往往比静态分析更为生动和直观,但又苦于没有源码,无法调试,但这个其实真的可以有。

Android 通过 Dalvik VM 执行指令,在打包 APK 文件时,Java 源码将编译成 Dalvik 可执行文件,将 Native 代码编译成 .so 二进制 JNI 函数库,下面将介绍这两种代码的无源码调试方法。

这里安利一下 APKIDE,集成了常用的 Android 逆向工具,可以很方便地反编译成 .so 文件、class 文件和 smali 文件。

开启 Android 调试模式

方法是修改系统配置:ro.debuggable=1,开启全局进程可调试。
如果ro.debuggable=0,那么APP需要标记debuggable才可以调试,一般Release般的都没有标记,这样的话需要修改重新打包。
如果ro.debuggable=1,则无视APP标记,所以进程都可以调试。
但是ro属性在编译后是无法修改的,但这里可以一个小工具mprop,可以绕过这个机制。支持Android 4.x-7.x。

调试Smali代码

可以先将 Delvik 可执行文件反编译成 .smali 文件,他们的关系如下:

Dalvik 可执行文件、 smail 文件与 Java 源码的关系如同二进制文件、汇编代码、高级语言源码。

需要用到的工具:

  • Apktool (apk to smali)
  • Android Studio
  • Smaliidea (Android Studio的插件)

步骤如下:

  1. 导入项目,选择smali文件夹
  2. 打开项目设置,设置Android SDK
  3. 添加一个Android Library模块(因为用不了Android monitor和调试器挂载的Android进程上,所以可以添加一个Android模块来解决)。
  4. 在菜单栏选择Run-> Attach debugger to Android process,就完成了。

当然,也可以使用DDMS,或者手动设置端口转发,然后在Run configure添加一个远程调试,但没有上面方便,这里就不说了。

调试Native代码

工具:

  • IDA Pro 6.8(低版本的IDA附带的android_server调试器,在Android5开启了PIE的系统中会出现错误)
  • Android Studio(可选)

步骤:

  1. 将IDA目录下找到android_server,传到android上(adb push android_server /data/local/tmp/) (PS:这个只支持arm架构)
  2. 赋予执行权限,并以root权限执行chmod 755 anroid_server; ./android_server,这时候会监听23946端口
  3. 设置端口转发:adb forward tcp:23946 tcp:23946
  4. 在IDA菜单栏上选择debugger,然后选择Android debgger,然后配置好进程选项(process options)的文件、目录的路径。hostname和端口为localhost和23946
  5. 在IDA里attach进程(Attch to process)
  6. 打开debugger菜单栏,在view选择Module list,找个app的so文件,然后就可以设置断点了

如果需要在程序启动前attach,可以执行在adb shell里am start -D -n 包名/Activity类名启动app并等待调试器挂载,然后使用Android Stduio的挂载进程(同上:调试Smali代码挂载的方法),在IDA按F9继续执行。

Leave a Reply

Your email address will not be published. Required fields are marked *