Старая, но все еще актуальная ммо 2 (Packet editing)
Вот и настало время для 2й части реверсинга данной игры
Сегодня будет рассмотрен Packet Editing
В качестве основной идеи выступает данное видео
Ну что же, начнем...
Для начала необходимо найти ф-ию отправки пакета на сервер игры
Эта ф-ия существует во всех онлайн играх.
На примере Perfect World, она выглядит вот так
В ф-ию передается 2 аргумента
1й аргумент это указатель на массив байтов который передается серверу
В качестве второго аргумента выступает размер пакета в байтах
Выглядит все это примерно так
byte data[] = { 0x0 , 0xfc, 0xbc };
int len = 3;
SendPacket(data, 3);
Таким образом можно отправлять серверу пакеты для выполнения каких-либо действий внутри игры
Но для того чтобы что-то сделать в игре, надо знать какой пакет мы должны отправить заранее
И для этого ниже будет представлен хук, который покажет какие пакеты отправляются от клиента на сервер
Приступим к самому хуку для чтения пакетов
Сам хук довольно прост, и ничем особым не выделяется, кроме того, что хук будет перед вызовом memmove
//Main dll thread
jmpBack = (DWORD)DetourFunction((BYTE*)(Module + 0x419ACF), (BYTE*)PacketHook);
//Hook part
__declspec(naked) void PacketHook()
{
__asm {
mov hookedPacket, ecx
mov hPacketSize, esi
}
memcpy(hpacket, (void*)hookedPacket, 256);
i = 0;
if (hpacket[0] == 0x0 && hpacket[1] == 0x0 && hPacketSize == 41) //Movement 41 len
{
printf("Movement Packet: ");
printf("Y: %.3f X: %.3f Z: %.3f ", *(float*)(hpacket+2), *(float*)(hpacket + 6), *(float*)(hpacket + 10));
printf("Counter %02x \n", hpacket[16]);
}
else if (hpacket[0] == 0x07 && hpacket[1] == 0x00 && hPacketSize == 25) //Stop Move
{
printf("Stop Hero Packet: ");
printf("Y: %.3f X: %.3f Z: %.3f \n", *(float*)(hpacket + 2), *(float*)(hpacket + 6), *(float*)(hpacket + 10));
}
else if (hpacket[0] == 0x03 && hpacket[1] == 0x00 && hpacket[2] == 0x01 && hPacketSize == 3) //Attack Packet
{
printf("Standart Attack Packet\n");
}
else if (hpacket[0] == 0x02 && hpacket[1] == 0x00 && hPacketSize == 6) //Select Target packet
{
printf("Select target: 0x%06x\n", *(int*)(hpacket+3));
}
printf("Incoming Packet: ");
for (i; i < hPacketSize; i++)
{
printf("%02x ", hpacket[i]);
}
printf("\n");
_asm jmp jmpBack
}
Собственно это весь хук который нужен для чтения
Некоторые пакеты я уже расшифровал
К примеру пакет движения
У каждого пакета в игре есть некий ID - это ровно 2 байта
Для перемещения это 00 00
Остановка персонажа 07 00
Обычная атака 03 00 и т.д.
В пакете движения передаются координаты перемещения персонажа в данный момент
Что касается чтения пакетов, с этим все, больше тут придумывать нечего
Настало время сделать свою отправку пакета на сервер
//SendPacket Prototype
using Send_t = void(__thiscall*)(DWORD*,DWORD*, int);
auto* fnc_Send = reinterpret_cast<Send_t>(Module + 0x419A40);
if (GetAsyncKeyState(VK_NUMPAD8) & 0x1)
{
std::ifstream inFile("C:\\Users\\Administrator\\Documents\\Visual Studio 2017\\Projects\\PW\\Debug\\Send.txt");
std::vector<uint8_t> data;
data.reserve(512);
unsigned int temp;
while (!inFile.eof()) {
inFile >> std::hex >> temp;
data.push_back(temp);
}
std::copy(data.begin(), data.end(), hSendPacket);
printf("Sent: ");
for (j; j < data.size(); j++)
printf("%02x ", (int)data[j]);
printf("\n");
DWORD* Packet = (DWORD*)&hSendPacket;
DWORD BaseValue = *reinterpret_cast<DWORD *>(0x00E444A4);
DWORD* Base = (DWORD*)(*reinterpret_cast<DWORD*>(BaseValue + 0x20));
int packsize = data.size();
fnc_Send(Base, Packet, packsize);
}
У ф-ии 3 аргумента, т.к в регистре ecx перед вызовом ф-ии должен быть еще 1 указатель
Теперь и отправка пакета готова, можно начать эксперементировать
Для примера возьму пакет использования 3ей ячейки в инвентаре, в которой лежит предмет
28 00 00 01 02 00 26 2c 00 00
28 00 - использование предмета
02 - ячейка в инвентаре
02 26 - ID предмета, которое можно посмотреть и свериться
11302 - 0x2C26
Ну а теперь когда найден пакет, можно попробовать отправить его на сервер с помощью написанного выше кода
На этом данная статья заканчивается.
Примерно такие же действия можно сделать и с другими онлайн играми и автоматизировать некоторые действия
-
1
1 Комментарий
Рекомендуемые комментарии
Пожалуйста, войдите, чтобы комментировать
Вы сможете оставить комментарий после входа в
Войти