安卓调试
环境&tool
- JDK 8X(之前用15版本的,monitor一直无法启动): 链接:https://pan.baidu.com/s/12LUwB7ZOVEcblAzkO8hxyA
提取码:5lw0
- monitor.bat
流程
开启调试功能
magisk resetprop ro.debuggable 1
stop;start; //一定要通过该方式重启
getprop ro.debuggable
启动目标应用
- adb shell am start -D -n 包名/activity名
adb shell am start -D -n cn.beacon.chat/cn.beacon.chat.app.main.SplashActivity
- 这时目标应用会暂停,显示
Waiting for Debugger
。 等待调试器连接。
IDA附加
- 把 ida 对应的 server 上传到手机后启动(-p 修改默认端口):
chiron:/data/local/tmp # ./idaser75_64 -p 6666
IDA Android 64-bit remote debug server(ST) v7.5.26. Hex-Rays (c) 2004-2020
Listening on 0.0.0.0:23946...
adb forward tcp:23946 tcp:23946
继续运行APP - 1
- 启动 monitor.bat,选择调试应用,可以看到两个调试端口,一个是按顺序从 8600 开始生成的,另一个是鼠标选中后,默认的 8700 调试端口。
- 继续运行:
"C:\Program Files\Android\Android Studio\jre\bin\jdb.exe" -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
jdb 连接器列表
- com.sun.jdi.SocketAttach 是 socket 连接器,通过套接字附加到其他 VM
"C:\Program Files\Android\Android Studio\jre\bin\jdb.exe" -listconnectors
继续运行APP - 2
com.baidu.baidulocationdemochiron:/ # ps -ef |grep beac
u0_a256 23061 26049 1 09:07:10 ? 00:00:00 cn.beacon.chat
adb forward tcp:12345 jdwp:23061
"C:\Program Files\Android\Android Studio\jre\bin\jdb.exe" -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=12345
问题
monitor报错
- 启动 monitor.bat ,弹出错误窗口,查看 .log文件:
java.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:74)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:353)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:180)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:629)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584)
at org.eclipse.equinox.launcher.Main.run(Main.java:1438)
at org.eclipse.equinox.launcher.Main.main(Main.java:1414)
解决
- 一个问题是没有设置 JAVA_HOME 环境变量;
- 另一个问题是 JDK 版本过高,使用8X版本才可以启动……浪费好多时间。
jdb 连接后崩溃
- jdb connect 目标VM后, 直接退出,IDA也直接报错。
java.io.IOException
at jdk.jdi/com.sun.tools.jdi.VirtualMachineManagerImpl.createVirtualMachine(VirtualMachineManagerImpl.java:238)
at jdk.jdi/com.sun.tools.jdi.VirtualMachineManagerImpl.createVirtualMachine(VirtualMachineManagerImpl.java:245)
at jdk.jdi/com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:120)
at jdk.jdi/com.sun.tools.jdi.SocketAttachingConnector.attach(SocketAttachingConnector.java:83)
at jdk.jdi/com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:519)
at jdk.jdi/com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:328)
at jdk.jdi/com.sun.tools.example.debug.tty.Env.init(Env.java:63)
at jdk.jdi/com.sun.tools.example.debug.tty.TTY.main(TTY.java:1095)
致命错误:
无法附加到目标 VM。
- 看雪上也有相关文章,说android10的一些变化,导致了这个问题。
- https://bbs.pediy.com/thread-266922.htm
- 解决方法是 patch: linker、linker64,搜索
__dl_notify_gdb_of_load
函数,nop掉两个对 rtld_db_dlactivity();
函数的调用。
- 最后想到,如果是这样,用 gdb 是不是就可以了, 尝试后果然可以,只是没有 ida 那么方便罢了。
只有一个线程
export IDA_LIBC_PATH=/apex/com.android.runtime/lib/bionic/libc.so
export IDA_LIBC_PATH=/apex/com.android.runtime/lib64/bionic/libc.so
jdb命令