Linking / proc / mnt para / proc / mounts

7

Eu entendo que /proc filesystem reflete a saída de vários processos. Infelizmente, eu tenho um binário propietário ( romdump ) que espera que a tabela de montagem apareça como /proc/mtd , enquanto meu dispositivo Android aparece para exibi-la como /proc/mounts .

Eu tentei criar um link simbólico, mas claramente isso só funciona para arquivos ou diretórios reais. Como posso enganar este binário para ler a saída de /proc/mounts em vez de /proc/mtd ?

    
por Paul Lammertsma 27.11.2012 / 22:04

4 respostas

7

A maneira mais fácil de fazer isso seria alterar o binário:

sed s-/proc/mtd-/tmp/mntx- < romdump > romdump.new
ln -s /proc/mounts /tmp/mntx
./romdump.new

O truque aqui, já que você está editando um binário, é garantir que a string original /proc/mtd tenha o mesmo tamanho da nova string /tmp/mntx , para que você não altere o tamanho ou a localização de nada no binário.

Isso não é infalível - não funcionará se o binário criar o nome do caminho em partes, em vez de usar uma string fixa. Mas é provável que faça o truque.

    
por 27.11.2012 / 22:53
7

Eu não conheço uma maneira de adicionar coisas a /proc fora de escrever um módulo (ou código de kernel simples). Podem ser alguns utilitários lá fora.

Se você pode criar e inserir um módulo, é bem simples: basta criar outro link simbólico ( /proc/mounts já é um link simbólico).

Origem ( 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");

Makefile:

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

(Isto pressupõe que você estará construindo para o seu sistema Linux atual. Para construir algo para o Android, você pode consultar: Como você cria um módulo de kernel carregável para Android? .

Depois de carregar o módulo ( insmod mnt_link.ko ), você deve obter:

$ 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

Dito isto, essa utilidade de vocês pode muito bem estar esperando algo mais do que esse link simbólico. (Talvez dependa de outro módulo ser carregado para fornecer alguma informação nesse local.)

Use por sua conta e risco .

    
por 27.11.2012 / 22:45
3

O sistema de arquivos / proc existe na memória, por assim dizer. Consulte o link para obter mais informações. Links provavelmente não funcionarão.

Você pode usar o LD_PRELOAD para interceptar a função open (). Consulte o link

Você também pode editar o binário para alterar o nome do arquivo de / proc / mnt para / proc_mnt e criar um link simbólico para / proc / mounts.

Outra opção seria recompilar o kernel e tornar o / proc / mnt um alias para / proc / mounts.

    
por 27.11.2012 / 22:45
-1

Você já tentou um link físico?

ln /proc/mnt /proc/mounts
    
por 27.11.2012 / 22:13