ida pro调试Apk-附Demo
一、第一种方法 单独调试So不需要更早的代码
首先到ida根目录中的dbgsrv文件,这里有各种类型系统类型的程序,就是在Android系统上开启一个服务或叫端口监听,让安卓系统和ida进行一个连接
使用adb push命令将电脑中的文件移动到安卓手机目录中,(理论上任意目录都行,但安卓系统中/data/local/tmp的目录是有执行权限的 可以说权限比较高)
adb push android_server /data/local/tmp

在目录中查看

接下来就需要将777权限给他
chmod 777 android_serve
执行android_server那他这里会监听安卓手机上的23946的端口,如果要改端口就-p 端口号

那我们这里就需要去做一个端口转发,将android_server监听的23946端口转发到电脑的23946端口(这里的端口是习惯用的端口,你也可以不转发这个端口 但是前提是端口不能被占用)adb forward tcp:23946 tcp:23946,如果上面修改了其他端口就要与之对应

然后就需要打开需要调试的So文件,到ida程序中做一些设置
找到关键函数先下个断点,这里的断点是App的title处

- Debugger-Debugger options..

我这里留了三个,作用都不一样
比如第一个 (在进程入口点上挂
起)挂起就是下个断点 让程序停下来
- Debugger-Process options

首先这上面都是默认的,需要填入地址,端口号一般是默认,除非你改了,点击OK
- 然后在选择附加到进程 Attach to process

找到调试的App,点击OK
等他加载完按F9,让他执行起来,这里执行的原因是因为默认停下来的地方一般是在libc.so,libc.so是系统库,没必要去调试,在点击App中的设置标题按钮,App就会停在设置的断点处,这样就可以进行单步调试了,手机上点击设置标题
会提示一个消息框,他发现你的so路径,前面那个路径是在安卓系统上面的,后面这个是我本地的,就是说路径不一样,是不是弄错了,直接点击same就可以了,和他说没有

然后单步调试到断点的地方,就可以了

二、第二种方法 单独调试So需要更早的代码
这里就需要我们在转发完23946端口
做完端口转发还要将App以调试模式将其启用,这里写法也很简单
adb shell am start -D -n com.zhuotong.crackme/.MainActivity


这里就需要去设置so的断点,配置调试项完后
这里我选择先jdb附加到调试程序,命令如下
jdb.exe -connect com.sun.jdi.SocketAttach:port=,hostname=localhost
这个命令也是转发到本地的,那这个端口是通过ddms判断的
打开我们的ddms,看到用debug模式打开App后 他会变成一个红色的虫子,说明即将被调试(monitor.bat 就是ddms)

然后我们执行jdb的命令,然后看App提示框已经没有了
然后在进行附加即可
TIPS:
1.如果看不到ddms显示进程
Android 手机中的全局可调试
装好Magisk之后
adb shell "su -c magisk resetprop ro.debuggable 1"
adb shell "su -c stop;su -c start;"
就可以看到了jdb 是附加 Java 层的,如果你用 am -d 启动的话不附加就跑不了,-D的作用是在运行之前让他挂起,然后等你调试器,可以调试更早的代码(jdb主要是为了调试更早的代码)
adb shell "getprop ro.debuggable" 可以获取到全局可调试状态
案例:
链接:https://pan.baidu.com/s/1w4uWyiYKfQdeqj7I64LFXw
提取码:a6op