将 /proc/mnt 链接到 /proc/mounts

Pau*_*sma 7 linux symlink android proc

我知道/proc文件系统反映了各种进程的输出。不幸的是,我有一个专有 ( romdump) 二进制文件,它希望挂载表显示为/proc/mtd,而我的 Android 设备似乎将其输出为/proc/mounts.

我试过创建一个符号链接,但显然这只适用于实际文件或目录。我怎样才能欺骗这个二进制文件来读取输出/proc/mounts而不是/proc/mtd

Mat*_*Mat 7

我不知道有什么方法可以/proc在编写模块(或普通内核代码)之外添加东西。不过可能有一些实用程序。

如果您可以构建和插入一个模块,那么它就非常简单:您只需创建另一个符号链接(/proc/mounts已经是一个符号链接)。

来源 ( mnt_link.c):

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h>

#define MODULE_VERS "0.0"
#define MODULE_NAME "mnt_link"

static int __init init_mnt_link(void)
{
    static struct proc_dir_entry *symlink;
    symlink = proc_symlink("mnt", NULL, "self/mounts");
    if(!symlink)
        return -ENOMEM;
    return 0;
}

static void __exit cleanup_mnt_link(void)
{
    remove_proc_entry("mnt", NULL);
}

module_init(init_mnt_link);
module_exit(cleanup_mnt_link);

MODULE_AUTHOR("U&L");
MODULE_LICENSE("CC-WIKI");
MODULE_DESCRIPTION("Create a /proc/mnt symlink to /proc/self/mounts");
Run Code Online (Sandbox Code Playgroud)

生成文件:

obj-m := mnt_link.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
Run Code Online (Sandbox Code Playgroud)

(这里假设您要为当前的 Linux 系统构建。要为 Android 构建一些东西,您可以参考:如何为 Android 创建可加载的内核模块?。)

加载模块 ( insmod mnt_link.ko) 后,您应该得到:

$ ls -l /proc/m*nt*
lrwxrwxrwx 1 root root 11 Nov 27 22:43 /proc/mnt -> self/mounts
lrwxrwxrwx 1 root root 11 Nov 27 22:43 /proc/mounts -> self/mounts
Run Code Online (Sandbox Code Playgroud)

话虽如此,您的实用程序很可能期望得到除此符号链接之外的其他东西。(也许这取决于正在加载的另一个模块以在该位置提供一些信息。)

使用风险自负


Jim*_*ris 7

最简单的方法是更改​​二进制文件:

sed s-/proc/mtd-/tmp/mntx- < romdump > romdump.new
ln -s /proc/mounts /tmp/mntx
./romdump.new
Run Code Online (Sandbox Code Playgroud)

由于您正在编辑二进制文件,因此这里的技巧是确保原始字符串/proc/mtd与新字符串的长度相同/tmp/mntx,这样您就不会更改二进制文件中任何内容的大小或位置。

这不是万无一失的——如果二进制文件分段构建路径名而不是使用固定字符串,它将无法工作。但它很可能会成功。