Loading... > Android Jni调试 > 这篇主要是依靠IDA进行调试So库函数,不涉及脱壳和反调试的内容。 ## 基础篇 基本调试方式。 ### 准备工作 把ida目录下android_server 传到android 目录中 ```sh adb push android_server /data/local/tmp/ adb shell su cd /data/local/tmp/ chmod 755/777 android_server ./android_server IDA Android 32-bit remote debug s-Rays (c) 2004-2017 Listening on 0.0.0.0:23946... ``` 在windows 控制台下转发window到模拟器或者手机的端口 ```sh adb forward tcp:23946 tcp:23946 ``` ### 开始调试 IDA 附加localhost 端口默认23946 ,选择远程Android调试。 如果出现: Bogus or irresponsive remote server 错误 在adb shell中执行 setenforce 0 关闭selinux安全机制(需要root权限) 之后在Debuggger 中的attach 上android 所对应的程序就行了 找到需要下断点的位置 设置断点,进行调试即可 现在本地模块中找到需要下断点的函数偏移 然后获取远程模块的基地址,基地址+偏移即是当前需要下断点的地址 Ctrl + s显示当前的所有加载的模块信息,找可读可执行的,一般代码段都是不可写的。 需要下断点的地址,然后设置断点,点击按钮就断下来了。 ### 不懂的地方 还有几点不明白的地方 1. 加载so的偏移量和我静态算的偏移量不一致,而网上所有教程都是一致的,不明白,鱼哥说是ASLR的问题,不过是RVA啊,不怎么明白。 2. jeb的作用没明白 3. linker的作用没明白 4. IDA加载方式,或者说dex加载so文件方式不明白。 ## 进阶篇 采用调试模式启动,与传统方式不同的是,这种方式会使得dex未加载如内存。 注:jeb调试只需要使用adb然后debug启动apk就行了,不需要端口转发。 或者以调试模式启动 ```sh adb shell am start -w packagename/activity(此处记得用activity的绝对路径) e.g adb shell am start -D -n cn.chaitin.geektan.crackme/cn.chaitin.geektan.crackme.MainActivity adb shell ps |grep infomation adb forward tcp:8700 jdwp:{pid} ``` 设置端口转发,这条命令的含义可以认为是在本地端口端口与手机进程之间建立一条通道 附加程序成功后,选择,Debugger option,勾选 ```sh suspend on process entry point suspend on thread start/exit suspend on library load/unload ``` 三项,然后按f9运行调试程序,此时IDA pro 挂起 使用jdb恢复程序执行 ```sh jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700 ``` https://www.cnblogs.com/chenleicpp/p/7274424.html https://www.cnblogs.com/Robertzewen/p/10096676.html https://www.cnblogs.com/fengxing999/p/10007380.html 此时IDA pro断在linker中,此时module中并没有libcrackme.so,说明licrackme.so还没有加载到内容中,只需要跟几步f8,在寄存器中看到libcrackme.so加载进来了,就可以在module中找到,有两种情况 1. 如果IDA Pro能够解析成功,双击module中的libcrackme.so就可以看到它export的函数,就可以右键下断点了 2. 如果IDA Pro解析失败,需要再开一个IDA,查找到要下断的函数地址,加上libcrackme.so加载到内存的地址即可(在init_array下断只能使用这种方法)。 IDA Pro按F9几次,直到断在自己下断的地方即可。 ## 高级篇 也不算高级篇,记一下第三种ida调试技巧。 首先把要分析的libcrackme.so文件拉进IDA里面在要下断点的JNI_Onload处下好断点。 启动android_server与上面一样 端口转发以及调试模式启动 先设置一下Debugger为远程Android模式 IDA进行附加进程回到之前静态分析libcrackme.so的IDA界面单击Debugger -> Process options 配置调试信息,这里只需配置hostname为localhost 点击Debugger -> Attach to process进行附加进程 <del>jdwp转发(当然打开DDMS就不需要这一步了)jdb附加</del>当时需要吗?为什么我现在用ida都不需要。。其实就是第一种方式。 F9执行一路到断点,一般需要点击按钮事件。 ``` ``` Last modification:January 16th, 2021 at 01:31 pm © 允许规范转载 Support 确定不打赏一下支持博主吗 ×Close Appreciate the author Sweeping payments Pay by AliPay