如何通过/proc文件系统访问Android应用的可执行文件

Posted

技术标签:

【中文标题】如何通过/proc文件系统访问Android应用的可执行文件【英文标题】:How to access the executable file of the Android app through the /proc file system 【发布时间】:2021-06-19 23:00:06 【问题描述】:

我有我的 android 应用程序,我需要从我的“非根”设备访问它的可执行文件(odex 文件)。我正在尝试通过 /proc 访问进程内存空间。我通过 /proc/self/maps 得到以下结果

5e59c72000-5e59c9b000 r--p 00000000 fd:03 509                            /system/bin/toybox
5e59c9b000-5e59cde000 --xp 00029000 fd:03 509                            /system/bin/toybox
5e59cde000-5e59ce2000 rw-p 0006c000 fd:03 509                            /system/bin/toybox
5e59ce2000-5e59ce6000 r--p 00070000 fd:03 509                            /system/bin/toybox
5e59ce6000-5e59ceb000 rw-p 00000000 00:00 0 
715a800000-715b000000 rw-p 00000000 00:00 0                              [anon:libc_malloc]
715b10b000-715b10d000 r--p 00000000 fd:03 2578                           /system/lib64/libnetd_client.so
715b10d000-715b10f000 --xp 00002000 fd:03 2578                           /system/lib64/libnetd_client.so
715b10f000-715b110000 rw-p 00004000 fd:03 2578                           /system/lib64/libnetd_client.so
715b110000-715b111000 r--p 00005000 fd:03 2578                           /system/lib64/libnetd_client.so
715b111000-715b112000 rw-p 00000000 00:00 0                              [anon:.bss]
715b161000-715b1c5000 rw-p 00000000 00:00 0                              [anon:linker_alloc]
715b1c5000-715b1cc000 r--p 00000000 fd:03 2454                           /system/lib64/libcutils.so
715b1cc000-715b1d4000 --xp 00007000 fd:03 2454                           /system/lib64/libcutils.so
715b1d4000-715b1d5000 rw-p 0000f000 fd:03 2454                           /system/lib64/libcutils.so
715b1d5000-715b1d7000 r--p 00010000 fd:03 2454                           /system/lib64/libcutils.so
715b1d7000-715b1d8000 rw-p 00000000 00:00 0                              [anon:.bss]
715b223000-715b229000 r--p 00000000 fd:03 2539                           /system/lib64/liblog.so
715b229000-715b237000 --xp 00006000 fd:03 2539                           /system/lib64/liblog.so
715b237000-715b238000 rw-p 00014000 fd:03 2539                           /system/lib64/liblog.so
715b238000-715b239000 r--p 00015000 fd:03 2539                           /system/lib64/liblog.so
715b239000-715b23a000 rw-p 00000000 00:00 0                              [anon:.bss]
715b249000-715b252000 r--p 00000000 fd:03 2406                           /system/lib64/libbase.so
715b252000-715b25b000 --xp 00009000 fd:03 2406                           /system/lib64/libbase.so
715b25b000-715b25c000 rw-p 00012000 fd:03 2406                           /system/lib64/libbase.so
715b25c000-715b25d000 r--p 00013000 fd:03 2406                           /system/lib64/libbase.so
715b25d000-715b25e000 rw-p 00000000 00:00 0                              [anon:.bss]
715b295000-715b296000 r--p 00000000 07:20 92                             /apex/com.android.runtime/lib64/bionic/libdl.so
715b296000-715b297000 --xp 00001000 07:20 92                             /apex/com.android.runtime/lib64/bionic/libdl.so
715b297000-715b298000 r--p 00002000 07:20 92                             /apex/com.android.runtime/lib64/bionic/libdl.so
715b298000-715b299000 rw-p 00000000 00:00 0                              [anon:.bss]
715b2c7000-715b2d9000 r--p 00000000 07:20 93                             /apex/com.android.runtime/lib64/bionic/libm.so
715b2d9000-715b2fd000 --xp 00012000 07:20 93                             /apex/com.android.runtime/lib64/bionic/libm.so
715b2fd000-715b2fe000 rw-p 00036000 07:20 93                             /apex/com.android.runtime/lib64/bionic/libm.so
715b2fe000-715b2ff000 r--p 00037000 07:20 93                             /apex/com.android.runtime/lib64/bionic/libm.so
715b2ff000-715b300000 rw-p 00000000 00:00 0                              [anon:.bss]
715b304000-715b344000 r--p 00000000 07:20 91                             /apex/com.android.runtime/lib64/bionic/libc.so
715b344000-715b3eb000 --xp 00040000 07:20 91                             /apex/com.android.runtime/lib64/bionic/libc.so
715b3eb000-715b3ee000 rw-p 000e7000 07:20 91                             /apex/com.android.runtime/lib64/bionic/libc.so
715b3ee000-715b3f5000 r--p 000ea000 07:20 91                             /apex/com.android.runtime/lib64/bionic/libc.so

我想知道我们是否可以从这些信息中获取加载可执行文件的内存地址。谢谢!

【问题讨论】:

【参考方案1】:

发布我在这里学到的关于解决问题的知识。下面需要一个有根设备。 Android(5 之后)使用 JIT 编译,因此实际上没有创建 odex 文件(至少对于小型应用程序而言)。当关闭 JIT 编译并重新编译应用程序(按顺序执行以下命令)时,确实可以在 /proc/self/maps 中找到 odex 文件内存位置。

adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start
adb shell cmd package compile -m speed -f com.example.myapplication

似乎我们不能在没有 root 的情况下使用 shell 启动、shell 停止命令。所以不确定我们是否可以停止在非 root 设备中进行 JIT 编译。但是,没有 odex 文件是由于上述原因。

【讨论】:

以上是关于如何通过/proc文件系统访问Android应用的可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

linux /proc目录说明(访问内核数据结构,修改内核设置)

Linux系统的/proc目录

linux系统下的/proc目录介绍

Linux下/proc目录简介

Linux下/proc目录简介

Linux中 /proc/[pid] 目录各文件简析