Вам посвящается. Уже не первый раз сталкивался с читерами которые умеют выкидывать неугодных им игроков с критической ошибкой. Почему это не просто ошибка памяти, или битый клиент, проблемы с железом и т.д.? Ну мы тут сереьзные люди уже, взрослые и имеющие образование, поэтому такие вещи не буду объяснять. К тому же критический вылет происходил у меня именно тогда, когда именно я мог что-то зарешать, изменить ход сражения, битвы, бг, в очень "удобный" момент. А так игра и клиент никогда у меня не вылетают и не крашатся и работает сутками. Я уже давно писал ПМ админам на счет этого, на что получил логичный ответ типа нужны данные, логи, точное время, что и когда и где ну и т.д. Такие данные нереально собрать, а им нереально такое найти, раз это до сих пор работает.
Это было предисловие, теперь ближе к делу. Я имел много раз ошибку на один и тот же адрес, а именно:
Ну не долго думая я просто загрузил IDA Pro и заглянул, что же там находится такое, что используется читерами. А там функция sub_780130. По анализу ИИ гугла:Код:ERROR #132 (0x85100084) Fatal Exception Program: D:\Games\World of Warcraft\WoW.exe Exception: 0xC0000005 (ACCESS_VIOLATION) at 0023:00780136 The instruction at "0x00780136" referenced memory at "0x00000008". The memory could not be "read".
В общем я не стал читать дальше этот и так понятный бред и просто решил сделать патч. И вот он без лишних соплей:Функция sub_780130 принимает два аргумента: arg_0 (указатель на структуру данных какого-то объекта) и arg_4 (указатель на буфер или структуру, куда будут копироваться данные).
mov eax, [ebp+arg_0] В регистр EAX записывается адрес входного объекта (например, указатель на структуру пришедшего сетевого пакета, заклинания или игрока).
movzx ecx, word ptr [eax+8] — ЗДЕСЬ ПРОИСХОДИТ КРАШ! Игра пытается прочитать 2 байта (word ptr) из адреса, на который указывает EAX, со смещением +8. Обычно по смещению +8 в структурах WoW находятся Type Flags (флаги типа объекта или пакета).Почему упало? Так как EAX оказался равен 0, процессор попытался прочитать данные по адресу 0x00000000 + 8 = 0x00000008. Операционная система заблокировала это некорректное чтение памяти и убила процесс с ошибкой Access Violation.
test cl, 8 и jz short loc_780155 Если бы игра не упала, она бы проверила, установлен ли в этих флагах бит 3 (маска 8). Если бит НЕ установлен, идет прыжок ниже. Если установлен — вызывается функция sub_7AE5E0.
test cl, 40h Ниже проверяется другой бит — бит 6 (маска 0x40). Если он установлен, игра начинает активно копировать массив данных размером 24 байта (0x14 + 4 байта) через регистр EDX в буфер arg_4 (mov [ecx], edx, mov [ecx+4], edx...). Такое линейное копирование 24 байт один в один очень похоже на координаты вектора движения (X, Y, Z, Orientation) или GUID объекта.
Этот код — классическая функция-парсер данных. Она вызывается из огромной функции sub_70DFA0 (судя по CODE XREF), которая, скорее всего, является циклом обработки сетевых сообщений (NetClient::ProcessMessage) или парсером апдейтов объектов (CGObject::OnSetUpdateData).
Читер отправил серверу специально сформированный "битый" пакет. Сервер из-за плохой защиты пропустил его и переслал вам. Ваш клиент начал разбирать этот пакет, ожидал увидеть там валидный указатель на данные, но из-за некорректной структуры пакета функция получила NULL (0x0) вместо адреса объекта.
Игра попыталась прочитать его флаги ([eax+8]), обратилась к 0x8 и мгновенно закрылась.
Нам надо по 37f533 сделать прыжок в свободную область, т.к. нам потребуется место для простой проверки на NULL.
Делаем прыжок E9 7B E2 25 00 90 90 https://imageban.ru/show/2026/06/01/...33cc019fbb/png
а по 5DD7B3 вставляем родные функции но добавляем проверку на NULL и прыжок на очистку стека и выход если значение NULL или к продолжению функции 8B 45 08 85 C0 0F 84 93 1D DA FF 0F B7 48 08 E9 73 1D DA FF https://imageban.ru/show/2026/06/01/...a4669bbeed/png
IDA Pro в итоге разрежет функцию на 2 якобы разные, но на самом деле это не так, просто это специфика IDA Pro.
Это все и позволит избегать подобных ошибок от битых пакетов.
Другой мой патч: https://forum.wowcircle.com/showthread.php?t=1353346


Ответить с цитированием