Как стать автором
Обновить

Комментарии 16

Очевидны вопросы: не пострадает ли игра после статьи, не нахлынут ли читеры и багоюзеры?

Более интересен вопрос, как повлияет данная статья на этот показатель:
в данный конкретный момент в игре онлайн всего 19 человек
Так как это игра «моего детства», мне будет приятно, если статья повлияет на игру положительно. Не думаю, что кого-то в 21 веке сильно может заинтересовать такой олдскулл, но чем чёрт не шутит.

А если помечтать, и предположить, что часть волны пользователей Хабра останется в игре, это будет вообще прекрасно, я верю, что общая адекватность происходящего в игре от этого явления поднимется.
Если все же произойдут какие-либо изменения, думаю многим будет любопытна сводная информация по этому поводу :)
Ага, мы любим читать теги;)
Очень жаль что вы решили совместить хакерство и прокачку «честного» персонажа. Было бы веселее оставить все попытки играть честно и пытаться бы изучить все возможности взлома сервера. Ведь самое веселое — находить те вещи, которые с помощью обычного клиента сделать нельзя, но возможно сделать с помощью дырявости протокола. Т.е., например, самое простое и, обычно, бесполезное — крашить сервер с помощью неправильно сформированного пакета. Чуть веселее — находить любые вычисления, которые происходят на стороне клиента, и обманывать их. Заменять генератор случайных чисел на константу, убивать людей одной командой, получать админские права и т.д. и т.п. :)
Я не
решил совместить хакерство и прокачку «честного» персонажа

Мне было любопытно сунуть нос во внутренности игры, а дальше само как-то получилось.

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

Согласен, было бы веселее, но чисто интуитивно думаю, что в протокол игры, доступный на клиентской стороне, не заложены такие возможности. Да и о таких вещах мне бы сразу пришлось рассказать администрации, и статьи бы не было.
Насколько я знаю, клиентские мморпг, где на стороне сервера проверяют все-все-все данные от клиента на правдободобность, крайне редки. И всегда можно найти какую-нибудь дырку, позволяющую, например, дублировать предметы, заменять шансы с 1% на 100% и пр.
… вот только клиент понятия не имеет, к чему этот OK относится, ведь он ничего не посылал,…


У «проблемы» есть очень элегантное и проверенное временем решение — инжекты. Если объяснять в двух словах — вам надо подняться в отладчике чуть выше чем отсылка клиентом пакета и найти функцию-обработчик щелчка на предмете, которая и инициирует посылку пакета серверу.
Эта функция, вероятнее всего, будет принимать один параметр — номер ячейки, предмет из которой следует использовать.

Дальше начинается «колдовство»:
1) вам необходимо изготовить процедуру, которая будет вызывать эту найденную функцию с нужным параметром, так, чтобы клиент не крашился.:
Например, вот так (пример взят для другой игры, просто для иллюстрации)
procedure AutoAttackCall(targetWid : dword); stdcall;
var
  Address: pointer;
begin
  // адрес нужной нам функции
  Address := Pointer(AutoAttackAddress); 
    asm
      pushad
      // готовим "окружение" для нашего вызова
      mov   esi, dword ptr [BASE_ADDRESS] 
      mov   esi, dword ptr [esi + PW_ROLE_BASE_OFFSET]
      // кладём в стек параметры для функции
      push  $0
      push  $80000000
      push  targetWid
      mov   ecx, esi
      // вызываем
      call Address
      popad
    end;
end;



2) Вызвать эту функцию в контексте процесса игры, так как будто это сделала она сама:

procedure THostPlayer.StartAutoAttack(targetWID : dword);
begin
    InjectFunc(@AutoAttackCall, @targetWID, SizeOf(targetWID));
end;


Код функции InjectFunc
procedure TProcess.InjectFunc(Func: Pointer; aParams: Pointer; aParamsSize: DWORD);
var
  hThread: THandle;
  lpNumberOfBytes: cardinal;
  lpThreadId: DWORD;
  ThreadAddr, ParamAddr: Pointer;
begin
  if self.processHandle<>0 then
  begin
    // ---- Выделим место в памяти процесса и запишем туда нашу функцию
    ThreadAddr := VirtualAllocEx(self.processHandle, 0, 256, MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(self.processHandle, ThreadAddr, Func, 256, lpNumberOfBytes);

    // ---- Также запишем параметры к ней
    ParamAddr := VirtualAllocEx(self.processHandle, 0, aParamsSize, MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(self.processHandle, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);

    // ---- Создадим поток, в котором это всё будет выполняться
    hThread := CreateRemoteThread(self.processHandle, 0, 0, ThreadAddr, ParamAddr, 0, lpThreadId);

    // ---- Ожидаем, пока функция отработает
    WaitForSingleObject(hThread, INFINITE);

    // ---- Подчищаем за собой
    CloseHandle(hThread);
    VirtualFreeEx(self.processHandle, ParamAddr, 0, MEM_RELEASE);
    VirtualFreeEx(self.processHandle, ThreadAddr, 0, MEM_RELEASE);
  end
end;

Не сочетается с последним тегом к статье. ) Без шуток: очень красиво, но слишком круто для целей, которые я перед собой ставил. Спасибо.
Эх… своей статьей вы напомнили мне про игрушку Сфера 2 Арена, в которую я когда-то играл. Онлайн там был жухлый, геймплей однообразный, куча багов — но народ все равно до последнего играл в неё, пока сервер не закрыли)
Ностальгические скриншоты.
Так вот как она называется! Играл в нее после первой установки Gentoo. Никогда не забуду как попросил какого-то парня русского показать где сундуки стоят, и он меня завел в какую-то пещеру, где pvp включается. Успел убежать, и вслед мне летела фраза «ты куда? там сундуки...». По ощущениям очень напоминает UO.

Интересно, если админы живые, что же они ее не пилят? Какими чувствами руководствуются, администрируя полу-живую игру?
тоже помню одну подставу
Самый первый раз, когда я вошёл в игру, задавал вопросы в городе «что тут как», какой-то парень позвал меня поближе к охранникам и попросить ударить его. Я доверчиво это сделал, и тут же меня насмерть сразило заклинание стражника.

— и что ты этим хотел показать?
— а то, что здесь нельзя никому доверять!

Это было очень смешно и пафосно.



если админы живые, что же они ее не пилят?

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

Какими чувствами руководствуются, администрируя полу-живую игру?

Часть админов остаются в игре из патриотизма, привязанности к ней. Некоторые — чтобы иметь игровое преимущество.
Спасибо за статью. Сам рубался в эту игру на диалапе. =)
Картинки и описание, причём и описание автоматизации очень напоминает Ultima Online с его Yoko Injection и EasyUO :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации