(1)在IDA的安装路径中找到android_server文件。
![](https://i-blog.csdnimg.cn/blog_migrate/371944b8f435b7b1099199e1c83ceb27.png)
(2)将android_server拷贝到手机的/data/local/tmp目录下面。
![](https://i-blog.csdnimg.cn/blog_migrate/f5ce1fdc348553771e3628bb1bc8ebd3.png)
(3) 将手机插上电脑,打开命令提示符,
先输入”adb shell”,然后输入”su root”获取root权限。
接着输入” chmod 777 /data/local/tmp/android_server” 给android_server加上相应的权限。
接着输入” /data/local/tmp/android_server”启动android_server。
如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/733dd66f0d4b1fca6cff6b547e47b140.png)
(4)重新打开一个命令提示符,
输入”adb forward tcp:23946 tcp:23946”进行tcp端口转发
![](https://i-blog.csdnimg.cn/blog_migrate/9f57fc1e64b8d783e713174fe38e21cc.png)
(5)adb root模式下执行” am start -D -n com.example.testjniso/com.example.testjniso.MainActivity”
命令,启动所要调试的Activity。
![](https://i-blog.csdnimg.cn/blog_migrate/93afdb29f2b61ade3ab7b648cec8aac2.png)
app会弹出”Waitting for debugger”对话框,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/a1ee7f8b48c792702e87d228c1e0f170.png)
(6)启动ida pro,点击”Debugger - > Attach -> Remote ArmLinux/Androiddebugger”,会看到以下对话框:
![](https://i-blog.csdnimg.cn/blog_migrate/8a6893f3f4f5941ddfa6057f0c67b8e2.png)
点击”Debug options”按钮,在”Suspend on process entry point”, ”Suspend on thread start/exit”, ”Suspend on library load/unload” 等选项的前面打上勾,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/4c3250cb383f5788098e75c574bb75c4.png)
点击”ok”后会在以下对话框的hostname中填上”localhost”
![](https://i-blog.csdnimg.cn/blog_migrate/43f226bf4df7e6882e9d941943351f14.png)
在弹出的”Choose process to attach to”窗口中找到”com.example.testjniso”进程,选中该进程,然后点击”ok”按钮。
![](https://i-blog.csdnimg.cn/blog_migrate/745feccd6d06145a8b5453a6bcc167e7.png)
(7)打开eclipse ddms在Devices窗口中可以看到以下内容:
![](https://i-blog.csdnimg.cn/blog_migrate/b66635f811efbada2ee73a3b6f60fd1a.png)
其中可以看到com.example.testjniso进程的端口为8700。
(8)打开命令提示符,输入以下命令:jdb -connect com.sun.jdi.SocketAttach:port=8700,hostname=localhost
如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/1fbe2f852f7c8ba14819acd6482a2292.png)
(9)点击ida中的继续执行按钮,下图中的绿色三角形按钮(或者按F9)。
![](https://i-blog.csdnimg.cn/blog_migrate/5d1b89c79835b191a517ec04fa2ba50d.png)
在ida弹出的”Add map”窗口中,一律点击”Cancle”按钮。
![](https://i-blog.csdnimg.cn/blog_migrate/9a0b1eff4629f3e516167c2c7677c0f7.png)
(10)点击app中的”点击加载so文件”按钮,确保so文件已经加载到了手机内存中。点击ida中的”Debugger -> Debugger windows -> Module list ”。在”Modules”窗口中找到libTestJni.so
![](https://i-blog.csdnimg.cn/blog_migrate/061dff3fc623b8beea291c4b6254f936.png)
点击ida中的暂停调试按钮,暂停当前的调试,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/38bdfdc536465b897727c5125ce86a64.png)
右击libTestJniSo.so文件,在弹出的框中点击”Jump to module base”,跳转到libTestJniSo.so文件的起始地址。
按下Alt+T,弹出查找对话框中输入” Java_com_example_testjniso_MainActivity_helloFromJni” 如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/45b19b0549297748696fba4a7a4d7d02.png)
点击”ok”按钮后,即可跳转到 Java_com_example_testjniso_MainActivity_helloFromJni 函数所在的起始地址。
然后在地址处下断点:
![](https://i-blog.csdnimg.cn/blog_migrate/828809df6bafa045f68afacedca5f9ff.png)
再按F9重新开始调试,点击app中的”点击加载so文件”按钮重新加载libTestJniSo.so,即可看到程序成功地停在了断点处:
![](https://i-blog.csdnimg.cn/blog_migrate/8043aa65a8e6ab631f9e877ae7263881.png)
到此处就可以正常地调试so文件了。
作者:会飞的大象_
链接:https://www.jianshu.com/p/d2d28920940c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
在android 5.0下,不能执行android_server
Linker是什么?
Linker就是/system/lib/linker,它是进程启动时第一个加载的模块,它负责管理elf可执行文件以及各个so文件的加载执行,还参与了调试的一些东西。通俗地说,它是一个elf文件的解释器。它可以加载elf可执行文件及so动态库。
在android 5.0下,不能执行android_server是因为android5.0自带的linker不支持加载非pie的elf文件,但如果自己实现一个可以加载pie的linker,不就可以解决这个问题了吗?对的,就是酱紫,补上自己的自定义linker在附件.
https://bbs.pediy.com/thread-206084.htm
![](https://i-blog.csdnimg.cn/blog_migrate/ec5a6f272d6802d1f9a2e0c213c930d0.png)