在哪调试SO文件

在哪调试SO文件,第1张

.so是二进制格式的链接库文件,包含链接库源文件(.c)中的各函数实现、调试信息等。.out一般也是由gcc编译生成的二进制格式文件,但有可能是执行程序也可能是链接库文件,因为在linux中扩展名除了一些特殊的约定,一般情况下是无意义的。执行文件也分动态链接还是静态链接。大多数情况都是动态链接,里面存放源文件(.c)中编译后的二进制代码及所调用函数库的入口参数,静态链接则是all-in-one,就是将所用到的非标准库都打包到执行文件中,所以体积都较大。

1.Root设备

Root权限下才能快乐调试。

使用市面上的各种Root师傅工具。

2.连接设备

将设备打开调试模式在开发者选项里。

将IDA安装目录中dbgsrv文件夹下的android_server推送到设备系统目录并赋可执行权限。在高于IDA6.6版本才能调试高版本android,此时调试低版本Android SO时,需要使用的是android_nonpipe。

在PC端输入命令:

adb shell su

adb shell android_server的路径/android_server

保持上面窗口,在命令行窗口进行端口转发:

adb forward tcp:23946 tcp:23946

为什么是23946呢,IDA和push进设备的android_server默认用都用23946端口进行通讯。当然可以修改。

3.打开IDA

附加或者启动进程的过程不再多言。

4.定位INIT函数

比较便捷的方法是找一份与设备同系统版本号的android源码。解析执行SO文件的地方在linker.c(cpp)中。

因为不同版本有差异,我就不上图了。

高版本时在do_dlopen()下的CallConstructors()里面,但是编译系统时往往将其和find_library融合在其父函数中,查找时需注意。一个简便方法是源码中搜索“INIT”四个字.

先将设备中的linker pull出来用IDA分析来确定调用INIT的具体位置。

因为linker在Android进程中加载非常早,所以它在IDA中的地址可以不用修正直接拿来用。

5.下断在INIT

下断点后,执行Apk中触发加载该SO的功能。

正常情况下就能停在该SO的INIT前了。

先输入”adb shell”,然后输入”su root”获取root权限。

接着输入” chmod 777 /data/local/tmp/android_server” 给android_server加上相应的权限。

接着输入” /data/local/tmp/android_server”启动android_server。

如下图所示:

输入”adb forward tcp:23946 tcp:23946”进行tcp端口转发

命令,启动所要调试的Activity。

app会d出”Waitting for debugger”对话框,如下图所示:

点击”Debug options”按钮,在”Suspend on process entry point”, ”Suspend on thread start/exit”, ”Suspend on library load/unload” 等选项的前面打上勾,如下图所示:

点击”ok”后会在以下对话框的hostname中填上”localhost”

在d出的”Choose process to attach to”窗口中找到”com.example.testjniso”进程,选中该进程,然后点击”ok”按钮。

其中可以看到com.example.testjniso进程的端口为8700。

如下图所示:

在idad出的”Add map”窗口中,一律点击”Cancle”按钮。

点击ida中的暂停调试按钮,暂停当前的调试,如下图所示:

右击libTestJniSo.so文件,在d出的框中点击”Jump to module base”,跳转到libTestJniSo.so文件的起始地址。

按下Alt+T,d出查找对话框中输入” Java_com_example_testjniso_MainActivity_helloFromJni” 如下图所示:

点击”ok”按钮后,即可跳转到 Java_com_example_testjniso_MainActivity_helloFromJni 函数所在的起始地址。

然后在地址处下断点:

再按F9重新开始调试,点击app中的”点击加载so文件”按钮重新加载libTestJniSo.so,即可看到程序成功地停在了断点处:

到此处就可以正常地调试so文件了。

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7928409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存