diff --git a/src/zap-args.c b/src/zap-args.c new file mode 100644 index 0000000..ae8d94f --- /dev/null +++ b/src/zap-args.c @@ -0,0 +1,63 @@ +/* + * gcc -Wall -O2 -fpic -shared -o zap-args.so zap-args.c -ldl + * + * LD_PRELOAD=./zap-args.so exec -a syslogd nmap -T0 10.0.0.1/24 + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +typedef int (*pfi)(int, char **, char **); +static pfi real_main; + +/* + * Copy original argv to new location and delete original location + * so that 'ps alxww' wont have anything to display. + */ +char **copyargs(int argc, char** argv){ + char **newargv = malloc((argc+1)*sizeof(*argv)); + char *from,*to; + int i,len; + + for(i = 0; i= 1) + memset(from,'\0',len); + newargv[i] = to; + argv[i] = 0; + } + newargv[argc] = 0; + return newargv; +} + +static int mymain(int argc, char** argv, char** env) { + return real_main(argc, copyargs(argc,argv), env); +} + +int __libc_start_main(pfi main, int argc, + char **ubp_av, void (*init) (void), + void (*fini)(void), + void (*rtld_fini)(void), void (*stack_end)){ + static int (*real___libc_start_main)() = NULL; + + if (!real___libc_start_main) { + char *error; + real___libc_start_main = dlsym(RTLD_NEXT, "__libc_start_main"); + if ((error = dlerror()) != NULL) { + fprintf(stderr, "%s\n", error); + exit(1); + } + } + real_main = main; + return real___libc_start_main(mymain, argc, ubp_av, init, fini, + rtld_fini, stack_end); +} +