其他
新手向总结:IDA动态调试So的一些坑
目录
动态调试步骤
复制android_server到设备中,并执行
用pm确定要调试apk的包名
用am启动被调试应用
设置IDA调试器
开始附加程序
jdb连接
触发断点
调试快捷键
可能的错误
虽然Java层代码包含了许多有用的信息,但是一般稍微注重安全的应用都会把核心代码放到Native层,所以对Native层的调试就显得尤为重要了。
使用工具:am + pm +IDA,其中am和pm为安卓系统自带。
复制android_server到设备中,并执行
android_server的目录为:IDA目录>dbgsrv>android_server。
注意:android_server分版本的,使用对应的版本。
//复制到设备上
adb push android_server /data/local/tmp
//修改权限,使之能执行
chmod 777 /data/local/tmp/android_server
//执行
cd /data/local/tmp
./android_server
adb forward tcp:23946 tcp:23946
等待附加。
用pm确定要调试apk的包名
pm(package manager)包管理工具。
列出所有的包信息:pm list packages [filter]
pm过滤器:
-d:只显示禁用的应用的包名 -e:只显示可用的应用的包名 -s:只显示系统应用的包名 -3:只显示第三方应用的包名
用am启动被调试应用
am是activity manager的缩写。
am启动程序命令:am start -D -n com.example.testarm/.MainActivity
am start -D -n调试模式打开应用 com.example.testarm要调试启动的包名 .MainActivityLunch Activity
启动后等待调试器的链接。
设置IDA调试器
用IDA打开想要调试的so库。
选择Remote ARM Linux/Android debugger。
设置调试选项:
开始附加程序
设置主机和端口:
选择要调试的程序进行附加。
弹出对话框表示全部加载完成了。
此时会显示出PC的位置:
IDA 按F9,继续执行。
jdb连接
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
8700为apk运行的端口,根据实际情况更改。
确定port的方法
使用ddms(monitor):
注意:以前monitor为Android Studio自带,从2019年下半年开始的
Android Studio删除了这些工具。
提取的ddms:
https://www.jianguoyun.com/p/DWps1OsQ9oe6CBjP15oD
访问密码:HrhFnH
触发断点
same:
Yes
调试快捷键
F2下断点
F7单步步入
F8单步步过
F9执行到下个断点
由于没有设置参数,所以经常有下面的错误提示,忽略或者随便给个参数:
没有进行端口映射:
adb forward tcp:23946 tcp:23946
android_server未开启
可附加的程序过少:
启动android_server的用户权限低.用root用户运行android_server来监听.
ida调试版本的so和正在运行的so不一致。
jdb连接失败:
ida打开的so文件名要和运行apk中的so名一致,如果不一致会导致断点无效。
看雪ID:nisodaisuki
https://bbs.pediy.com/user-869791.htm
推荐文章++++
好书推荐