Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
гвард
#1
Доброго времени суток.
Так как в с++ не силен, подскажите как сделать.
Исходники фгвард\ргвард
Нужно отправить строку
Код:
string Signature;
на сервер в пакете 0xA1

Код:
void __cdecl new_SendPacket(unsigned int This, char *Format, ...)
{
    unsigned int retAddr = *((unsigned int*) &This - 1);

    if ((retAddr < hEngineStart) || (retAddr > hEngineEnd))
    {
        true_SendPacket(This, "cc", 0xA1, 0x01);
        ErrorExit("Bot Program Detected #3!");
    }

    if (((unsigned int) Format < hEngineStart) || ( (unsigned int) Format > hEngineEnd))
    {
        true_SendPacket(This, "cc", 0xA1, 0x02);
        ErrorExit("Bot Program Detected #4!");
    }
    if (GetCurrentThreadId() != mainThread)
    {
        true_SendPacket(This, "cc", 0xA1, 0x03);
        ErrorExit("Bot Program Detected #5!");
    }
    
    unsigned char buf[10240];
    int size = 0, len;
    wchar_t *wstr;

    va_list args;
    va_start(args, Format);

    while (*Format != 0)
    {
        switch (*Format)
        {
            case 'c':
                *(unsigned char*) (buf + size) = va_arg(args, unsigned char);
                size++;
                break;
            case 'h':
                *(unsigned short int*) (buf + size) = va_arg(args, unsigned short int);
                size += 2;
                break;
            case 'd':
                *(unsigned int*) (buf + size) = va_arg(args, unsigned int);
                size += 4;
                break;
            case 'Q':
                *(unsigned __int64*) (buf + size) = va_arg(args, unsigned __int64);
                size += 8;
                break;
            case 'b':
                len = va_arg(args, unsigned int);
                memcpy(buf + size, va_arg(args, void*), len);
                size += len;
                break;            
            case 'S':
                wstr = va_arg(args, wchar_t*);
                if (wstr == 0)
                {
                    len = 2;
                    *(unsigned short int*) (buf + size) = 0;
                }
                else
                {
                    len = wcslen(wstr) * 2 + 2;
                    memcpy(buf + size, wstr, len);
                }
                size += len;
                break;
            default:
                true_SendPacket(This, "cc", 0xA1, 0x04);
                ErrorExit("Send Packet Unknown Format!");
                break;
        }
        Format++;    
    }

    va_end(args);

    switch(buf[0])
    {
        case 0x0E:
            wchar_t serialNumber[1024], MAC[1024], HwGuid[1024];
            memset(serialNumber, 0, 1024 * 2);
            memset(MAC, 0, 1024 * 2);
            if (!getHDDSerialNumber(serialNumber))
            {
                true_SendPacket(This, "cc", 0xA1, 0x05);
                ErrorExit("Get HDD Serial Number Fail!");
                return;
            }
            if (!getMAC(MAC))
            {
                true_SendPacket(This, "cc", 0xA1, 0x06);
                ErrorExit("Get MAC Fail!");
                return;
            }
            if (!getHwGuid(HwGuid))
            {
                true_SendPacket(This, "cc", 0xA1, 0x07);
                ErrorExit("Get HWID Fail!\n");
            }
            if ((wcslen(MAC) == 0) || (wcslen(serialNumber) == 0) || (wcslen(HwGuid) == 0))
            {
                true_SendPacket(This, "cc", 0xA1, 0x08);
                ErrorExit("Wrong MAC / Serial Number / HWID!");
                return;
            }

            memcpy(buf + size, serialNumber, wcslen(serialNumber) * 2 + 2);
            size += wcslen(serialNumber) * 2 + 2;
            memcpy(buf + size, MAC, wcslen(MAC) * 2 + 2);
            size += wcslen(MAC) * 2 + 2;
            memcpy(buf + size, HwGuid, wcslen(HwGuid) * 2 + 2);
            size += wcslen(HwGuid) * 2 + 2;
            
            break;
    }
    char str[11];
    sprintf(str, "%d", size);
    Logger(str);
    true_SendPacket(This, "b", size, (int)buf);
}
методом "тыка" перепробовал все варианты которые пришли в голову, ничего не получилось... или краш клиента при отправке или на сервер данный пакет просто не доходит
Ответ
#2
Ну так со стороны сервера шаманьте почему пакет не доходит. Тут все верно.
Ответ
#3
flopix Написал:Ну так со стороны сервера шаманьте почему пакет не доходит. Тут все верно.

тут может и верно, (строку то нигде не отправляет) но мне нужно отправить строку, скажем вот так:
Код:
true_SendPacket(This, "cc", 0xA1, Signature);
в итоге получаю крит клиента

просто не понятно какие переменные может принимать метод true_SendPacket

судя по коду (если я все верно понял )
case 0x0E: - в конец пакета протоколверсион пихает массив символов unsigned char buf, пробовал по сделать аналогично, не получилось
что тут сказать... с++ еще не сталкивался
Ответ
#4
Что оно отправляет задается строкой:

'c' 1 байт
'h' 2 байта
'd' 4 байта
'Q' 8 байт
'b' массив байт - в параметрах передаем указатель на массив, в котором первые 4 байта это длина массива
'S' строка - в параметрах передаем указатель на строку (2 байта на символ, строка должна заканчиваться двумя символами с кодом 0).

Функция true_SendPacket может принимать переменное число параметров.
Если указано "сс" - значит нужно и передать 2 параметра по 1 байту, тип char.
В нашем случае :
true_SendPacket(This, "cc", 0xA1, Signature);
передается 0xA1 - id пакета
Signature - 1 байт данных.

В методе new_SendPacket есть пример разбора данных передаваемых в SendPacket.


Вы можете набирать произвольные вариации строки с параметрами. Например "chQSbcchdd"
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)