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) }
uint64_t GetServerID(const char* spec) { uint64_t server_id=0; char tmp[1024]; char *args[32]; strncpy(tmp, spec, 1024); tmp[1023] = '\0'; if (ParseAddr(tmp, args, 32) != 3) { return server_id; } if (strcasecmp(args[0], "tcp") == 0) { char *host = args[1]; int port = atoi(args[2]); char c; const char *p = host; bool isIPAddr = true; // 是ip地址格式吗? while ((c = (*p++)) != '\0') { if ((c != '.') && (!((c >= '0') && (c <= '9')))) { isIPAddr = false; break; } } if (isIPAddr) { server_id = port; server_id <<= 32; server_id |= inet_addr(host); } } return server_id; }
int ParseRange(const char *s, struct u_range *range, u_char allow) { int n_bits; char *widp, buf[64]; strlcpy(buf, s, sizeof(buf)); if ((widp = strchr(buf, '/')) != NULL) *widp++ = '\0'; else widp = buf + strlen(buf); /* Get IP address part; if that fails, try looking up hostname */ if (!ParseAddr(buf, &range->addr, allow)) return (FALSE); /* Get mask width */ if (*widp) { if ((n_bits = atoi(widp)) < 0 || (range->addr.family == AF_INET && n_bits > 32) || (range->addr.family == AF_INET6 && n_bits > 128)) { return (FALSE); } } else if (range->addr.family == AF_INET) { n_bits = 32; } else { n_bits = 128; } range->width = n_bits; return (TRUE); }
int WebInit(Web w) { /* setup web-defaults */ memset(w, 0, sizeof(*w)); Enable(&w->options, WEB_AUTH); ParseAddr(DEFAULT_WEB_IP, &w->addr, ALLOW_IPV4|ALLOW_IPV6); w->port = DEFAULT_WEB_PORT; return 0; }
static int WebSetCommand(Context ctx, int ac, char *av[], void *arg) { Web w = &gWeb; int port; switch ((intptr_t)arg) { case SET_OPEN: WebOpen(w); break; case SET_CLOSE: WebClose(w); break; case SET_ENABLE: EnableCommand(ac, av, &w->options, gConfList); break; case SET_DISABLE: DisableCommand(ac, av, &w->options, gConfList); break; case SET_SELF: if (ac < 1 || ac > 2) return(-1); if (!ParseAddr(av[0],&w->addr, ALLOW_IPV4)) Error("Bogus IP address given %s", av[0]); if (ac == 2) { port = strtol(av[1], NULL, 10); if (port < 1 || port > 65535) Error("Bogus port given %s", av[1]); w->port=port; } break; default: return(-1); } return 0; }
struct sockaddr_storage * ParseAddrPort(int ac, char *av[], u_char allow) { static struct sockaddr_storage ss; struct u_addr addr; int port = 0; if (ac < 1 || ac > 2) return (NULL); if (!ParseAddr(av[0], &addr, allow)) return(NULL); if (ac > 1) { if ((port = atoi(av[1])) < 1 || port > 65535) { Log(LG_ERR, ("Bad port \"%s\"", av[1])); return (NULL); } } memset(&ss, 0, sizeof(ss)); ss.ss_family = addr.family; switch (addr.family) { case AF_INET: ss.ss_len = sizeof(struct sockaddr_in); ((struct sockaddr_in*)&ss)->sin_addr = addr.u.ip4; ((struct sockaddr_in*)&ss)->sin_port = htons(port); break; case AF_INET6: ss.ss_len = sizeof(struct sockaddr_in6); ((struct sockaddr_in6*)&ss)->sin6_addr = addr.u.ip6; ((struct sockaddr_in6*)&ss)->sin6_port = htons(port); break; default: ss.ss_len = sizeof(struct sockaddr_storage); } return (&ss); }
/* connect a client socket to a server and return a socket descriptor */ int ConnectToServer(char *addr, int defport) { int sfd; struct sockaddr_in servaddr; struct hostent *host; char hostname[256]; int port; int err; ParseAddr(hostname, &port, defport, addr); if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(port); host = gethostbyname(hostname); if (host == NULL) { err = errno; close(sfd); errno = err; return -2; } servaddr.sin_addr.s_addr = *((int *) host->h_addr_list[0]); if (connect(sfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) { err = errno; close(sfd); errno =err; return -3; } return sfd; }
/* ** ParseConfig -- parse the config file into linked list of clients. ** ** Parameters: ** None. ** ** Returns: ** 1 on success, 0 otherwise. ** ** Side Effects: ** - Linked list of clients will be (re)allocated. ** ** Warnings: ** - GetBootFiles() must be called before this routine ** to create a linked list of default boot files. */ int ParseConfig(void) { FILE *fp; CLIENT *client; u_int8_t *addr; char line[C_LINELEN]; char *cp, *bcp; int i, j; int omask, linecnt = 0; if (BootAny) /* ignore config file */ return(1); FreeClients(); /* delete old list of clients */ if ((fp = fopen(ConfigFile, "r")) == NULL) { syslog(LOG_ERR, "ParseConfig: can't open config file (%s)", ConfigFile); return(0); } /* * We've got to block SIGHUP to prevent reconfiguration while * dealing with the linked list of Clients. This can be done * when actually linking the new client into the list, but * this could have unexpected results if the server was HUP'd * whilst reconfiguring. Hence, it is done here. */ omask = sigblock(sigmask(SIGHUP)); /* * GETSTR positions `bcp' at the start of the current token, * and null terminates it. `cp' is positioned at the start * of the next token. spaces & commas are separators. */ #define GETSTR while (isspace(*cp) || *cp == ',') cp++; \ bcp = cp; \ while (*cp && *cp!=',' && !isspace(*cp)) cp++; \ if (*cp) *cp++ = '\0' /* * For each line, parse it into a new CLIENT struct. */ while (fgets(line, C_LINELEN, fp) != NULL) { linecnt++; /* line counter */ if (*line == '\0' || *line == '#') /* ignore comment */ continue; if ((cp = strchr(line,'#')) != NULL) /* trash comments */ *cp = '\0'; cp = line; /* init `cp' */ GETSTR; /* get RMP addr */ if (bcp == cp) /* all delimiters */ continue; /* * Get an RMP address from a string. Abort on failure. */ if ((addr = ParseAddr(bcp)) == NULL) { syslog(LOG_ERR, "ParseConfig: line %d: can't parse <%s>", linecnt, bcp); continue; } if ((client = NewClient(addr)) == NULL) /* alloc new client */ continue; GETSTR; /* get first file */ /* * If no boot files are spec'd, use the default list. * Otherwise, validate each file (`bcp') against the * list of boot-able files. */ i = 0; if (bcp == cp) /* no files spec'd */ for (; i < C_MAXFILE && BootFiles[i] != NULL; i++) client->files[i] = BootFiles[i]; else { do { /* * For each boot file spec'd, make sure it's * in our list. If so, include a pointer to * it in the CLIENT's list of boot files. */ for (j = 0; ; j++) { if (j==C_MAXFILE||BootFiles[j]==NULL) { syslog(LOG_ERR, "ParseConfig: line %d: no boot file (%s)", linecnt, bcp); break; } if (STREQN(BootFiles[j], bcp)) { if (i < C_MAXFILE) client->files[i++] = BootFiles[j]; else syslog(LOG_ERR, "ParseConfig: line %d: too many boot files (%s)", linecnt, bcp); break; } } GETSTR; /* get next file */ } while (bcp != cp); /* * Restricted list of boot files were spec'd, * however, none of them were found. Since we * apparently can't let them boot "just anything", * the entire record is invalidated. */ if (i == 0) { FreeClient(client); continue; } } /* * Link this client into the linked list of clients. * SIGHUP has already been blocked. */ if (Clients) client->next = Clients; Clients = client; } (void) fclose(fp); /* close config file */ (void) sigsetmask(omask); /* reset signal mask */ return(1); /* return success */ }
int SocketFromIP(const char *ip,int port,size_t *size,void* addr){ int af; ParseAddr(ip,port,&af,size,addr); return socket(af,SOCK_STREAM,0); }
static int NatSetCommand(Context ctx, int ac, char *av[], void *arg) { NatState const nat = &ctx->bund->iface.nat; if (ac == 0) return(-1); switch ((intptr_t)arg) { case SET_TARGET: #ifndef NG_NAT_LOG Error("Target address setting is unsupported by current kernel"); #endif /* FALL */ case SET_ADDR: { struct u_addr addr; /* Parse */ if (ac != 1) return(-1); if (!ParseAddr(av[0], &addr, ALLOW_IPV4)) Error("bad IP address \"%s\"", av[0]); /* OK */ if ((intptr_t)arg == SET_ADDR) { nat->alias_addr = addr; } else { nat->target_addr = addr; } } break; #ifdef NG_NAT_DESC_LENGTH case SET_REDIRECT_PORT: { struct protoent *proto; struct in_addr l_addr, a_addr, r_addr; int lp, ap, rp = 0, k; /* Parse */ if (ac != 5 && ac != 7) return(-1); if ((proto = getprotobyname(av[0])) == 0) Error("bad PROTO name \"%s\"", av[0]); if (!inet_aton (av[1], &a_addr)) Error("bad alias IP address \"%s\"", av[1]); ap = atoi(av[2]); if (ap <= 0 || ap > 65535) Error("Incorrect alias port number \"%s\"", av[2]); if (!inet_aton (av[3], &l_addr)) Error("bad local IP address \"%s\"", av[3]); lp = atoi(av[4]); if (lp <= 0 || lp > 65535) Error("Incorrect local port number \"%s\"", av[4]); if (ac == 7) { if (!inet_aton (av[5], &r_addr)) Error("bad remote IP address \"%s\"", av[5]); rp = atoi(av[6]); if (rp <= 0 || rp > 65535) Error("Incorrect remote port number \"%s\"", av[6]); } /* OK */ for (k=0;k<NM_PORT;k++) { if (nat->nrpt_id[k] == 0) { memcpy(&nat->nrpt[k].local_addr, &l_addr, sizeof(struct in_addr)); memcpy(&nat->nrpt[k].alias_addr, &a_addr, sizeof(struct in_addr)); nat->nrpt[k].local_port = lp; nat->nrpt[k].alias_port = ap; if (ac == 7) { memcpy(&nat->nrpt[k].remote_addr, &r_addr, sizeof(struct in_addr)); nat->nrpt[k].remote_port = rp; } nat->nrpt[k].proto = (uint8_t)proto->p_proto; snprintf(nat->nrpt[k].description, NG_NAT_DESC_LENGTH, "nat-port-%d", k); nat->nrpt_id[k] = 1; break; } } if (k == NM_PORT) Error("max number of redirect-port \"%d\" reached", NM_PORT); } break; case SET_REDIRECT_ADDR: { struct in_addr l_addr, a_addr; int k; /* Parse */ if (ac != 2) return(-1); if (!inet_aton (av[0], &a_addr)) Error("bad alias IP address \"%s\"", av[0]); if (!inet_aton (av[1], &l_addr)) Error("bad local IP address \"%s\"", av[1]); /* OK */ for (k=0;k<NM_ADDR;k++) { if (nat->nrad_id[k] == 0) { memcpy(&nat->nrad[k].local_addr, &l_addr, sizeof(struct in_addr)); memcpy(&nat->nrad[k].alias_addr, &a_addr, sizeof(struct in_addr)); snprintf(nat->nrad[k].description, NG_NAT_DESC_LENGTH, "nat-addr-%d", k); nat->nrad_id[k] = 1; break; } } if (k == NM_ADDR) Error("max number of redirect-addr \"%d\" reached", NM_ADDR); } break; case SET_REDIRECT_PROTO: { struct protoent *proto; struct in_addr l_addr, a_addr, r_addr; int k; /* Parse */ if (ac != 3 && ac != 4) return(-1); if ((proto = getprotobyname(av[0])) == 0) Error("bad PROTO name \"%s\"", av[0]); if (!inet_aton (av[1], &a_addr)) Error("bad alias IP address \"%s\"", av[1]); if (!inet_aton (av[2], &l_addr)) Error("bad local IP address \"%s\"", av[2]); if (ac == 4) { if (!inet_aton (av[3], &r_addr)) Error("bad remote IP address \"%s\"", av[3]); } /* OK */ for (k=0;k<NM_PROTO;k++) { if (nat->nrpr_id[k] == 0) { memcpy(&nat->nrpr[k].local_addr, &l_addr, sizeof(struct in_addr)); memcpy(&nat->nrpr[k].alias_addr, &a_addr, sizeof(struct in_addr)); if (ac == 4) memcpy(&nat->nrpr[k].remote_addr, &r_addr, sizeof(struct in_addr)); nat->nrpr[k].proto = (uint8_t)proto->p_proto; snprintf(nat->nrpr[k].description, NG_NAT_DESC_LENGTH, "nat-proto-%d", k); nat->nrpr_id[k] = 1; break; } } if (k == NM_PROTO) Error("max number of redirect-proto \"%d\" reached", NM_PROTO); } break; #endif case SET_ENABLE: EnableCommand(ac, av, &nat->options, gConfList); break; case SET_DISABLE: DisableCommand(ac, av, &nat->options, gConfList); break; default: assert(0); } return(0); }