int SV_AddTestClient() { char buffer[1024]; int botport = 1; int protocolVersion = ((int(*)())&ParseAddr(0x28FE40))(); //GetProtocolVersion int checksum = ((int(*)())&ParseAddr(0x2093C))(); //BG_NetDataChecksum int PersistentDataDefVersion = ((int(*)())&ParseAddr(0x1EA710))(); //LiveStorage_GetPersistentDataDefVersion unsigned int PersistentDataDefVersionChecksum = ((int(*)())&ParseAddr(0x1EA740))(); //LiveStorage_GetPersistentDataDefFormatChecksum //0x236084 - client->dropReason, causing issue, source: unknown. (SV_SendMessageToClient) uint32_t patchData[] = { 0x38800005 }; write_process(0x22E55C, &patchData, 4); Sprintf(buffer, "connect bot%d \"\\cg_predictItems\\1\\cl_anonymous\\0\\color\\4\\head\\default\\model\\multi\\snaps\\20\\rate\\5000\\name\\bot%d\\protocol\\%d\\checksum\\%d\\statver\\%d %u\\qport\\%d\"", botport, botport, protocolVersion, checksum, PersistentDataDefVersion, PersistentDataDefVersionChecksum, botport); Memset((void*)ThreadStorage_a, 0, sizeof(netadr_s)); netadr_s* newConnection = (netadr_s*)(ThreadStorage_a); newConnection->port = botport; ((void(*)(const char*))&ParseAddr(0x1DBA20))(buffer); //SV_CmdTokenizeString(const char* string) ((void(*)(netadr_s*))&ParseAddr(0x226074))(newConnection); //SV_DirectConnect(netadr_s* connectionInfo) ((void(*)())&ParseAddr(0x1DB524))(); //SV_CmdEndTokenizeString() *(short*)(getClient_t(botport) + 0x352EA) = 0x3FF; //Set Stat Flags *(short*)(getClient_t(botport) + 0x30) = botport; //botPort ((void(*)(int client))&ParseAddr(0x2284F8))(getClient_t(botport)); //SV_SendClientGameState(client_t* client) ((void(*)(int client, int usercmd))&ParseAddr(0x2272DC))(getClient_t(botport), ThreadStorage_a); //SV_ClientEnterWorld(client_t* client, usercmd_s* lastUserCmd) }
char* send_proc_to_local_server(struct proc_process p) { struct sockaddr_un them; int sender = socket(AF_UNIX, SOCK_STREAM, 0); if (sender < 0) { printf("Error creating connection to server\n"); return NULL; } them.sun_family = AF_UNIX; strcpy(them.sun_path,LOCAL_SERVER_SOCK); if (connect(sender,(struct sockaddr *)&them,sizeof(them)) < 0) { printf("Error connecting to server\n"); return NULL; } unsigned char type = 's'; write_to_socket(&sender,&type,sizeof(char)); write_process(p,&sender,write_to_socket); char* id = malloc(SIZE_OF_ID*sizeof(char));; read_from_socket(&sender,id,SIZE_OF_ID*sizeof(char)); return id; }
int main(int argc, char** argv) { program_name = argv[0]; static char *commands[] = { "save", "restore", "send", "receive", "list", "delete" }; int commands_len = sizeof(commands)/sizeof(char*); static struct option long_options[] = { {"server", 1, 0, 's'}, {"name", 1, 0, 'n'}, {"output", 1, 0, 'o'}, {"nokill", 0, 0, 'K'}, {"verbose", 0, 0, 'v'}, {"help", 0, 0, 'h'}, {"file-save", 0, 0, 'f'}, {NULL, 0, NULL, 0} }; int c,i,option_index = 0; if (argc<2) { usage(-1); exit(1); } for (i=0;i<commands_len;i++) { if (!strcmp(commands[i],argv[1])) break; } if (!strcmp(argv[1],"--help") || !strcmp(argv[1],"-h")) { usage(-1); exit(0); } if (i==commands_len) { usage(-1); exit(1); } command_index = i; char** real_argv = malloc(sizeof(char*)*argc-1); real_argv[0] = argv[0]; for (i=1;i<argc-1;i++) { real_argv[i] = argv[i+1]; } char *output=NULL,*host=NULL,*name=NULL; int nokill = FALSE; verbose = 0; flags = 0; while ((c = getopt_long(argc-1, real_argv, "s:vn:hKo:f", long_options, &option_index)) != -1) { switch (c) { case 's': host = malloc(strlen(optarg)); strcpy(host,optarg); break; case 'v': verbose=TRUE; break; case 'n': name = malloc(strlen(optarg)); strcpy(name,optarg); break; case 'h': usage(command_index); exit(0); break; case 'o': output = malloc(strlen(optarg)); strcpy(output,optarg); break; case 'K': nokill = TRUE; break; case 'f': flags |= PROC_FLAG_SAVE_FILE; break; default: fprintf(stderr,"?? getopt returned character code 0%o ??\n", c); } } if (command_index==0) { //save if (optind >= argc-1 && name==NULL) { usage(command_index); exit(1); } pid_t pid = 0; if (name!=NULL) { char tmpproc[100]; sprintf(tmpproc,"ps ux | awk '/%s/ && !/awk/ {print $2}'",name); FILE* proc = popen(tmpproc,"r"); fscanf(proc,"%d",&pid); pclose(proc); } else { pid = atoi(real_argv[optind]); } struct proc_process p = save_process(pid,"test",nokill); if (output!=NULL) { FILE* proc = fopen(output,"w+"); write_process(p,proc,write_to_file_pointer); fclose(proc); } else { char* id; if ((id = send_proc_to_local_server(p))==NULL) write_process(p,stdout,write_to_file_pointer); printf("%s\n",id); } } else if (command_index==1) { //restore if (optind >= argc-1) { usage(command_index); exit(1); } char* f_id = real_argv[optind]; FILE* proc = fopen(f_id,"r"); struct proc_process *p=NULL; if (!proc) { p = receive_proc_from_local_server(f_id); } else { p = read_process(proc,read_from_file_pointer); } if (p!=NULL) restore_process(*p); } else if (command_index==2) { //send if (optind >= argc-1 && name==NULL) { usage(command_index); exit(1); } pid_t pid = 0; struct proc_process *p=NULL; if (name!=NULL) { char tmpproc[100]; sprintf(tmpproc,"ps ux | awk '/%s/ && !/awk/ {print $2}'",name); FILE* proc = popen(tmpproc,"r"); fscanf(proc,"%d",&pid); pclose(proc); struct proc_process tmpp = save_process(pid,"test",nokill); p = &tmpp; } else { char* f_id = real_argv[optind]; FILE* proc = fopen(f_id,"r"); if (!proc) { p = receive_proc_from_local_server(f_id); if (!p) { pid = atoi(real_argv[optind]); struct proc_process tmpp = save_process(pid,"test",nokill); p = &tmpp; } } else { p = read_process(proc,read_from_file_pointer); } } char* ip=DEFAULT_HOST; int port=DEFAULT_PORT; if (host!=NULL) { char* pos = strchr(host,':'); if (pos!=NULL) { *pos='\0'; ip=host; port=*(++pos); } else { ip=host; port = DEFAULT_PORT; } } send_process(*p,ip,port); } else if (command_index==3) { //receive char* id = NULL; if (optind >= argc-1) { id = real_argv[optind]; } struct proc_process *p= receive_proc_from_local_server(id); if (p!=NULL) restore_process(*p); } else if (command_index==4) { //list list_from_local_server(); } else if (command_index==5) { //delete if (optind >= argc-1) { usage(command_index); exit(1); } char id[SIZE_OF_ID]; strcpy(id,real_argv[optind]); delete_from_local_server(id); } return 0; }
int main(int argc, char** argv) { pid_t target_pid; struct list proc_image; int c; int flags = 0; int get_children = 0; int fd; long offset = 0; /* Parse options */ while (1) { int option_index = 0; static struct option long_options[] = { {"libraries", 0, 0, 'l'}, {"kill", 0, 0, 'k'}, {"pid", 0, 0, 'P'}, /* {"files", 0, 0, 'f'}, {"children", 0, 0, 'c'}, {"writer", 1, 0, 'w'}, */ {0, 0, 0, 0}, }; c = getopt_long(argc, argv, "lkP"/*"fcw:"*/, long_options, &option_index); if (c == -1) break; switch(c) { case 'l': flags |= GET_LIBRARIES_TOO; break; case 'f': flags |= GET_OPEN_FILE_CONTENTS; break; case 'k': flags |= KILL_ORIGINAL_PROCESS; break; case 'P': flags |= REFRESH_PID; break; case 'c': get_children = 1; break; /* case 'w': set_writer(optarg); break; */ case '?': /* invalid option */ usage(argv[0]); break; } } if (argc - optind != 2) { usage(argv[0]); return 1; } assert(stream_ops != NULL); target_pid = atoi(argv[optind+1]); if (target_pid <= 1) { fprintf(stderr, "Invalid pid: %d\n", target_pid); return 1; } list_init(proc_image); get_process(target_pid, flags, &proc_image, &offset); fd = open(argv[optind], O_CREAT|O_WRONLY|O_TRUNC, 0777); if (fd == -1) { fprintf(stderr, "Couldn't open %s for writing: %s\n", argv[optind], strerror(errno)); return 1; } write_stub(fd, offset); write_process(fd, proc_image); close(fd); return 0; }