modfind() returns -1
Ivan "Rambius" Ivanov
rambiusparkisanius at gmail.com
Mon Jan 19 04:17:11 UTC 2015
Hello,
I am trying to implement a simple system call module, but after I
install it and try to find its offset with modfind, I somehow get -1.
The code implementing the syscal resides in sc_example_no_args.c:
#include <sys/types.h>
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/module.h>
#include <sys/sysent.h>
#include <sys/kernel.h>
#include <sys/systm.h>
#include <bsm/audit_kevents.h>
static int sc_example_no_args(struct thread *td, void *syscall_args) {
printf("%s\n", "Hello, world!");
return 0;
}
static struct sysent sc_example_sysent_no_args = {
0,
sc_example_no_args
};
static int offset = NO_SYSCALL;
static int load(struct module *module, int cmd, void *arg) {
int error = 0;
switch(cmd) {
case MOD_LOAD:
uprintf("System call loaded at offset %d.\n", offset);
break;
case MOD_UNLOAD:
uprintf("System call unloaded at offset %d.\n", offset);
break;
default:
error = EOPNOTSUPP;
break;
}
return error;
}
SYSCALL_MODULE(sc_example_no_args, &offset,
&sc_example_sysent_no_args, load, NULL);
The Make file that compiles it is
KMOD=sc_example_no_args
SRCS=sc_example_no_args.c
.include <bsd.kmod.mk>
The ouput of make is
$ make
Warning: Object directory not changed from original
/home/rambius/drafts/fbsdrootkits/ch01/sc_example_no_arg
cc -O2 -pipe -fno-strict-aliasing -Werror -D_KERNEL -DKLD_MODULE
-nostdinc -I. -I@ -I@/contrib/altq -fno-common -mno-aes -mno-avx
-mno-mmx -mno-sse -msoft-float -ffreestanding -fstack-protector
-std=iso9899:1999 -Qunused-arguments -fstack-protector -Wall
-Wredundant-decls -Wnested-externs -Wstrict-prototypes
-Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -Wundef
-Wno-pointer-sign -fformat-extensions -Wmissing-include-dirs
-fdiagnostics-show-option -Wno-error-tautological-compare
-Wno-error-empty-body -Wno-error-parentheses-equality
-Wno-error-unused-function -c sc_example_no_args.c
ld -d -warn-common -r -d -o sc_example_no_args.kld sc_example_no_args.o
:> export_syms
awk -f /sys/conf/kmod_syms.awk sc_example_no_args.kld export_syms |
xargs -J% objcopy % sc_example_no_args.kld
ld -Bshareable -d -warn-common -o sc_example_no_args.ko sc_example_no_args.kld
objcopy --strip-debug sc_example_no_args.ko
I now have the module compiled in sc_example_no_args.ko and I can kldload it:
$ sudo kldload ./sc_example_no_args.ko
System call loaded at offset 210.
$ kldstat
Id Refs Address Size Name
1 6 0xc0400000 13a35fc kernel
2 1 0xc900a000 5000 ums.ko
3 1 0xca38f000 2000 sc_example_no_args.ko
So far, so good. Here is the code that tries to invoke that system call:
$ cat interface.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <sys/module.h>
int main(int argc, char *argv[]) {
int syscall_num;
struct module_stat stat;
int mod_id;
stat.version = sizeof(stat);
mod_id = modfind("sc_example_no_args");
printf("%d\n", mod_id);
if (mod_id == -1) {
perror("Error finding module");
exit(2);
}
modstat(210, &stat);
syscall_num = stat.data.intval;
return syscall(syscall_num, argv[1]);
}
I compile interface.c with:
$ cc -Wall interface.c -o interface
When I run it I see that it cannot find the module:
$ cc -Wall interface.c -o interface
$ ./interface
-1
Error finding module: No such file or directory
$ echo $?
2
I would be very helpful for any help or hints. I am able to do the
syscall through perl
$ perl -e 'syscall(210);'
$ dmesg | tail -n 1
Hello, world!
Thank you in advance!
Regards
Rambius
--
Tangra Mega Rock: http://www.radiotangra.com
More information about the freebsd-questions
mailing list