0%

ida动态调试

调试dex

  • 将被调试文件以及对应版本的android_serverpush到/data/local/tmp(可为其他)

  • 修改两者的权限为可执行权限,chmod 777 xxx

  • 启动调试服务,./android_server

  • 进行端口转发,adb forward tcp:23946 tcp:23946,使PC端口与Android端口可进行交互

  • 启动ida,Debugger->Run->RemoteArmLinux/Android debugger并设置好对应的参数(被调试文件的路径)

  • 设置好端口号(默认23946)点击OK则开始调试

调试so

  • 安装好apk,并运行
  • 启动调试服务并进行端口转发(与上相同)

  • 使用工具对apk进行解包,获取到so文件
    若要对libdvm.so或者libart.so等系统的so进行分析,则从/system/lib/文件夹中pull出

  • ida加载so文件,并下好断点(源码调试)

  • attach进程
    点击Debugger->Attach to process,在选择框中选择apk对应的包名(即apk运行的进程名)并记录下ID

    然后点击OK然后F9运行ida

  • 进入Debug options选中Suspend on library load/unload

  • 在PC的xxx(此处为ID)端口与手机的相应端口之间建立连接
    adb forward tcp:8700 jdwp:xxx(此处为ID)也可使用ddms

    通信过程如下图(图片来源ctfwiki)

  • 使用jdbjava层将apk attach到电脑上,恢复运行
    jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
    此时ida开始加载so

  • 此时ida来到linker(Android系统的加载器/链接器,用于加载so文件)处
    进入module找到对应的so下好断点,F9运行ida来到断点处,即可进行调试

问题

  • 若想对无法在module中找到的函数进行动态调试该怎么办?

    • 再打开一个ida导入so进行静态分析,找到对应函数的相对地址(双开定位法)
    • 在动态调试的ida中找到so在内存中的基址
    • 跳转至基址和相对地址相加的位置,即为函数所在处
  • 对于加壳或有反调试的文件进行动态调试不能直接打开apk然后attach
    应当以调试方式来启动程序,adb shell am start -D -n packagename/.MainActivity

  • 使用其他模拟器好像都不太行(架构的问题)
    建议使用真机或者使用SDK自带的模拟器

  • 如何patch

    • 对于一般函数:找到调用函数处修改对应的HEX为00 00 00 00(也可为其他无意义指令),也可将函数的第二条(第一条为PUSH)改为POP指令

    • 对于动态注册的函数:把调用exit退出对应的HEX改成00 00 00 00