execve(2)を乗っとる

http://ukai.jp/debuan/2000w/auto-apt.txtの辺を見て、実際に手を動かしてexecve(2)を乗っとってみた。試した環境は、NetBSD-1.6.2。環境によってlibcのパスが違うと思うので、適宜修正が必要。
ソースファイル hoge.c

#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <dlfcn.h>

#define LIBC_PATH "/usr/lib/libc.so"

static int (*execve_org)() = NULL;

int
execve(const char *path, char *const argv[], char *const envp[])
{
    if (execve_org == NULL) {
	void *handle = dlopen(LIBC_PATH, RTLD_LAZY);
	if (handle == NULL)
	    err(EXIT_FAILURE, "dlopen");

	execve_org = dlsym(handle, "execve");
	if (execve_org == NULL)
	    err(EXIT_FAILURE, "dlsym");
    }

    fprintf(stderr, "<%s>\n", path);
    return execve_org(path, argv, envp);
}

コンパイル方法

$ gcc -shared hoge.c

ここでは、/usr/pkg/bin/bashのexecveを乗っとってみる。

$ LD_PRELOAD=./a.out /usr/pkg/bin/bash
bash-3.00$ ls
</bin/ls>
a.out  hoge.c
bash-3.00$ date
</bin/date>
Mon Mar 21 09:22:24 JST 2005

さて、これが何に使えるかっていうとあまりいいアイディアはないんけどね…‥