/proc
나는 파일 시스템이 다양한 프로세스의 출력을 반영한다는 것을 이해합니다 . 안타깝게도 romdump
마운트 테이블이 로 표시될 것으로 예상하는 독점 ( ) 바이너리가 있는데 /proc/mtd
내 Android 장치에서는 /proc/mounts
.
심볼릭 링크를 만들어 보았지만 이것은 실제 파일이나 디렉토리에서만 작동하는 것 같습니다. /proc/mounts
대신 출력을 읽도록 이 바이너리를 속일 수 있는 방법은 무엇입니까 /proc/mtd
?
답변1
가장 쉬운 방법은 바이너리를 변경하는 것입니다.
sed s-/proc/mtd-/tmp/mntx- < romdump > romdump.new
ln -s /proc/mounts /tmp/mntx
./romdump.new
바이너리 파일을 편집하고 있기 때문에 여기서 중요한 점은 원래 문자열이 /proc/mtd
새 문자열과 길이가 동일하여 /tmp/mntx
바이너리 파일의 크기나 위치가 변경되지 않도록 하는 것입니다.
이것은 절대 안전하지 않습니다. 바이너리가 고정 문자열을 사용하지 않고 조각으로 경로 이름을 구축하는 경우 작동하지 않습니다. 하지만 아마도 효과가 있을 것입니다.
답변2
/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");
파일 생성:
obj-m := mnt_link.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
(현재 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
그렇긴 하지만, 귀하의 유틸리티는 이 심볼릭 링크 이외의 다른 것을 기대하고 있을 가능성이 높습니다. (어쩌면 해당 위치에 일부 정보를 제공하기 위해 로드되는 다른 모듈에 따라 달라질 수 있습니다.)
자신의 책임 하에 사용하세요.
답변3
/proc 파일 시스템이 메모리에 존재한다고 가정해 보겠습니다. 바라보다http://www.kernel.org/doc/Documentation/filesystems/proc.txt더 많은 정보를 알고 싶습니다. 링크가 작동하지 않을 수 있습니다.
LD_PRELOAD를 사용하여 open() 함수를 가로챌 수도 있습니다. 바라보다https://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick
또한 바이너리 파일을 편집하고 파일 이름을 /proc/mnt에서 /proc_mnt로 변경하고 /proc/mounts로 심볼릭 링크할 수도 있습니다.
또 다른 옵션은 커널을 다시 컴파일하고 /proc/mnt를 /proc/mounts의 별칭으로 만드는 것입니다.
답변4
열심히 연결해 보셨나요?
ln /proc/mnt /proc/mounts