Перейти к содержанию

Старая, но все еще актуальная ммо 2 (Packet editing)


roma912

1 912 просмотра

Вот и настало время для 2й части реверсинга данной игры :D
Сегодня будет рассмотрен Packet Editing
В качестве основной идеи выступает данное видео 

 

Ну что же, начнем...
Для начала необходимо найти ф-ию отправки пакета на сервер игры
Эта ф-ия существует во всех онлайн играх.

 

На примере Perfect World, она выглядит вот так
В ф-ию передается 2 аргумента 
1й аргумент это указатель на массив байтов который передается серверу
В качестве второго аргумента выступает размер пакета в байтах
TDXg63m.png

 

Выглядит все это примерно так
byte data[] = { 0x0 , 0xfc, 0xbc };
int len = 3;
SendPacket(data, 3);
Таким образом можно отправлять серверу пакеты для выполнения каких-либо действий внутри игры

Но для того чтобы что-то сделать в игре, надо знать какой пакет мы должны отправить заранее
И для этого ниже будет представлен хук, который покажет какие пакеты отправляются от клиента на сервер

Приступим к самому хуку для чтения пакетов
Сам хук довольно прост, и ничем особым не выделяется, кроме того, что хук будет перед вызовом memmove
exgx0KH.png

 

//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 и т.д.
В пакете движения передаются координаты перемещения персонажа в данный момент
0Ra95Cg.png

 

Что касается чтения пакетов, с этим все, больше тут придумывать нечего
Настало время сделать свою отправку пакета на сервер
 

//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 предмета, которое можно посмотреть и свериться

2wbhqEU.png

11302 - 0x2C26

Ну а теперь когда найден пакет, можно попробовать отправить его на сервер с помощью написанного выше кода

3hIeZSh.png

На этом данная статья заканчивается. 
Примерно такие же действия можно сделать и с другими онлайн играми и автоматизировать некоторые действия

  • Плюс 1

1 Комментарий


Рекомендуемые комментарии

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.