Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int SocketClient::readHandschake() {
- printf("Handschaking (Socket 5)\n");
- char* buffer;
- char* handschake = SocketStreamUtils::readBytes(client, 3);
- if (handschake[0] != 0x05) {
- printf("Unsuported Protocoll: %02x\n", handschake[0]); //TODO close
- return 1;
- }
- int alowedMethods = handschake[1];
- for (int i = 0; i < alowedMethods; i++) {
- if (SocketStreamUtils::readBytes(client, 1)[0] == 0x02) { //Username/Password
- alowedMethods = -1;
- }
- }
- if (alowedMethods != -1) {
- printf("Unsuported Methods!\n"); //TODO close
- return 2;
- }
- buffer = new char[2];
- buffer[0] = 0x05;
- buffer[1] = 0x02;
- SocketStreamUtils::writeBytes(client, buffer, 2);
- if (SocketStreamUtils::readBytes(client, 1)[0] != 1) {
- printf("Auth fail (Wrong packet header)!\n"); //TODO close
- return 3;
- }
- char* username = SocketStreamUtils::readBytes(client,
- SocketStreamUtils::readBytes(client, 1)[0]);
- char* passwort;
- int length = SocketStreamUtils::readBytes(client, 1)[0];
- if (length != 0)
- passwort = SocketStreamUtils::readBytes(client, length);
- printf("Auth username: \"%s\" Auth password: \"%s\"\n", username, passwort);
- if (strcmp(username, properties->user)) {
- printf("Username wrong. Must be: \"%s\"\n", properties->user);
- buffer = new char[2];
- buffer[0] = 0x05; //Underknown
- buffer[1] = 0x01; //Username Fail
- return 4;
- }
- if (strcmp(passwort, properties->password)) {
- printf("Password wrong. Must be: \"%s\"\n", properties->password);
- buffer = new char[2];
- buffer[0] = 0x05; //Underknown
- buffer[1] = 0x02; //Passwort Fail
- return 5;
- }
- buffer = new char[2];
- buffer[0] = 0x05; //Underknown
- buffer[1] = 0x00; //Login sucesss
- SocketStreamUtils::writeBytes(client, buffer, 2);
- return 0;
- }
- int SocketClient::readSOCKS5Target() {
- printf("Connected (Select target)\n");
- char* commands = SocketStreamUtils::readBytes(client, 4);
- if (commands[1] != 0x01) {
- printf("Unsuported Operaion: %02x" + commands[1]); //TODO close
- writeCommandState(0x07);
- return 1;
- }
- int addrLength = -1;
- if (commands[3] == 0x01)
- addrLength = 4;
- else if (commands[3] == 0x03)
- addrLength = SocketStreamUtils::readBytes(client, 1)[0];
- //else if (commands[3] == 0x04)
- // addrLength = 16;
- else
- {
- writeCommandState(0x08);
- }
- printf("Address length: %d\n", addrLength);
- char* addr = SocketStreamUtils::readBytes(client, addrLength);
- if (commands[3] == 0x03) {
- remote_host = new char[strlen(addr)];
- snprintf(remote_host, strlen(addr) + 1, "%s", addr);
- remote_host =
- inet_ntoa(
- *((struct in_addr *) gethostbyname(remote_host)->h_addr_list[0]));
- } else if (commands[3] == 0x01) {
- remote_host = new char[15];
- int i = *((int*) addr);
- sprintf(remote_host, "%i.%i.%i.%i", (i >> 24) & 0xFF, (i >> 16) & 0xFF,
- (i >> 8) & 0xFF, i & 0xFF);
- } else {
- printf("Cant use Ipv6");
- writeCommandState(0x08);
- return 2;
- }
- remote_port = new char[12];
- snprintf(remote_port, 12, "%d", SocketStreamUtils::readShort(client));
- writeCommandState(0x00);
- //PROT VERSION
- //1 = CONNECT
- //0
- printf("Target: %s:%s (Socket: 0x%016llX)\n", remote_host, remote_port,
- (long) &client);
- /* Get the address info */
- memset(&hints, 0, sizeof hints);
- if (commands[3] == 0x03) {
- struct hostent *he;
- struct in_addr **addr_list;
- int i;
- if ((he = gethostbyname(remote_host)) == NULL) {
- herror("gethostbyname");
- return 4; //TODO close
- }
- addr_list = (struct in_addr **) he->h_addr_list;
- for (i = 0; addr_list[i] != NULL; i++) {
- remote_host = inet_ntoa(*addr_list[i]);
- break;
- }
- hints.sin_family = AF_INET;
- hints.sin_addr.s_addr = inet_addr(remote_host);
- hints.sin_port = htons(atoi(remote_port));
- printf("Resolved: %s\n", remote_host);
- } else if (commands[3] == 0x01) {
- hints.sin_family = AF_INET;
- hints.sin_addr.s_addr = inet_addr("85.114.141.243");
- hints.sin_port = htons(25565);
- }
- return 0;
- }
- void SocketClient::writeCommandState(int state) {
- char* buffer = new char[10];
- buffer[0] = 0x05; //VERSION
- buffer[1] = state; //SUCESS 0x07
- buffer[2] = 0x00; //NEEDET UNUSED
- buffer[3] = 0x01; //IP-Type
- buffer[4] = 0x00; //IP[1]
- buffer[5] = 0x00; //IP[2]
- buffer[6] = 0x00; //IP[3]
- buffer[7] = 0x00; //IP[4]
- buffer[8] = 0x00; //PORT[1]
- buffer[9] = 0x00; //PORT[2]
- SocketStreamUtils::writeBytes(client, buffer, 10);
- }
- unsigned int SocketClient::transfer(int from, int to) {
- char buf[BUF_SIZE];
- unsigned int disconnected = 0;
- size_t bytes_read, bytes_written;
- bytes_read = read(from, buf, BUF_SIZE);
- if (bytes_read == 0) {
- disconnected = 1;
- } else {
- bytes_written = write(to, buf, bytes_read);
- if (bytes_written == -1) {
- disconnected = 1;
- }
- }
- return disconnected;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement