ARM学习之 动态调试ida

时间:2024-05-31 09:52:57

2020-04-24

  • 学习如何进行动态调试

  • 本文以截图和说明建议为主,后期如有新的想法再丰富
  1. 准备一部已经root过的手机,然后还要准备ida
  2. 第一步先将android_server push到手机的/data/local/tmp/目录下
    1. android_server 存放在 ida目录下的dbgsrv
    2. 命令为 adb push android_server /data/local/tmp
    3. 给android_server 修改权限 chmod 777 android_server
  3. 运行 ./android_server -pXXXX 
    1. android_server 默认端口为23946
    2. 如果没有-pXXXX则使用默认端口
    3. XXXX为要监听的端口号
    4. -pXXXX中间没有空格
  4. 端口转发 
    1. adb forward tcp:XXXX tcp:XXXX
    2. XXXX就是第三步设置的端口号,,
    3. 如果第三步默认,则此处转发端口号为23946
  5. 挂起应用
    1. adb shell am start -D -n package/ActivityName
    2. 如何查看包名和ActivityName
      1. 使用jadx-gui,将apk拖入到该软件中,查看"资源文件->AndroidManifest.xml"文件。如图
      2. ARM学习之 动态调试ida
      3. adb shell am start -D -n com.example.javandk1/.MainActivity
    3. 挂起成功之后,手机界面显示如下图
    4. ARM学习之 动态调试ida
  6. ida Attach
    1. 打开IDA 32位版本
    2. 选择 Debugger->Attach->Remote ARMLinux/Android debugger如图ARM学习之 动态调试ida
    3. 在打开的界面设置HostName和Port,HostName=127.0.0.1 Port=上部转发的XXXX,如图ARM学习之 动态调试ida
    4. 在打开的界面中选中需要注入的进程,可以通过ctrl+f搜索名称,找到后双击进入ARM学习之 动态调试ida
    5. 进入ida主界面,然后选择三项,方法是依次选择Debugger->Debugger optionsARM学习之 动态调试ida
    6. 在打开的Debugger setup界面设置三项。其中
      1. ARM学习之 动态调试ida
      2. 含义如下
        1. Suspend on process enter point  进程入口点挂起
        2. Suspend on thread start/exit  线程启动/退出时挂起
        3. Suspend on library load/unload 库加载/卸载时挂起
    7. 点击左上角的绿色三角或者F9运行命令
    8. 打开ddms查看apk运行的端口,此时端口为8644
      1. ARM学习之 动态调试ida
      2. 运行jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8604
      3. 运行成功如下图ARM学习之 动态调试ida
    9. 此时IDA已经断下,截图:ARM学习之 动态调试ida
      1. 此时ida成功断下,
      2. 在右边modules中搜索javankd1.so。so名称在包体的lib目录下,
      3. ​​找到so后双击so文件,在打开的Module: libjavankd1.so中搜索需要打断点的函数,本文以JNI_OnLoad为例,如图:
      4. ARM学习之 动态调试ida
      5. 下好断点之后F9运行,在没有反调试的情况下,,就会正确的停在断点处。ARM学习之 动态调试ida
    10.