Comments 16
Очевидны вопросы: не пострадает ли игра после статьи, не нахлынут ли читеры и багоюзеры?
Более интересен вопрос, как повлияет данная статья на этот показатель:
в данный конкретный момент в игре онлайн всего 19 человек
+2
Так как это игра «моего детства», мне будет приятно, если статья повлияет на игру положительно. Не думаю, что кого-то в 21 веке сильно может заинтересовать такой олдскулл, но чем чёрт не шутит.
А если помечтать, и предположить, что часть волны пользователей Хабра останется в игре, это будет вообще прекрасно, я верю, что общая адекватность происходящего в игре от этого явления поднимется.
А если помечтать, и предположить, что часть волны пользователей Хабра останется в игре, это будет вообще прекрасно, я верю, что общая адекватность происходящего в игре от этого явления поднимется.
0
Ага, мы любим читать теги;)
+5
Очень жаль что вы решили совместить хакерство и прокачку «честного» персонажа. Было бы веселее оставить все попытки играть честно и пытаться бы изучить все возможности взлома сервера. Ведь самое веселое — находить те вещи, которые с помощью обычного клиента сделать нельзя, но возможно сделать с помощью дырявости протокола. Т.е., например, самое простое и, обычно, бесполезное — крашить сервер с помощью неправильно сформированного пакета. Чуть веселее — находить любые вычисления, которые происходят на стороне клиента, и обманывать их. Заменять генератор случайных чисел на константу, убивать людей одной командой, получать админские права и т.д. и т.п. :)
0
Я не
Мне было любопытно сунуть нос во внутренности игры, а дальше само как-то получилось.
Согласен, было бы веселее, но чисто интуитивно думаю, что в протокол игры, доступный на клиентской стороне, не заложены такие возможности. Да и о таких вещах мне бы сразу пришлось рассказать администрации, и статьи бы не было.
решил совместить хакерство и прокачку «честного» персонажа
Мне было любопытно сунуть нос во внутренности игры, а дальше само как-то получилось.
Было бы веселее
убивать людей одной командой, получать админские права
Согласен, было бы веселее, но чисто интуитивно думаю, что в протокол игры, доступный на клиентской стороне, не заложены такие возможности. Да и о таких вещах мне бы сразу пришлось рассказать администрации, и статьи бы не было.
+2
… вот только клиент понятия не имеет, к чему этот 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;
+5
Эх… своей статьей вы напомнили мне про игрушку Сфера 2 Арена, в которую я когда-то играл. Онлайн там был жухлый, геймплей однообразный, куча багов — но народ все равно до последнего играл в неё, пока сервер не закрыли)
+1
Ностальгические скриншоты.
+1
Так вот как она называется! Играл в нее после первой установки Gentoo. Никогда не забуду как попросил какого-то парня русского показать где сундуки стоят, и он меня завел в какую-то пещеру, где pvp включается. Успел убежать, и вслед мне летела фраза «ты куда? там сундуки...». По ощущениям очень напоминает UO.
Интересно, если админы живые, что же они ее не пилят? Какими чувствами руководствуются, администрируя полу-живую игру?
Интересно, если админы живые, что же они ее не пилят? Какими чувствами руководствуются, администрируя полу-живую игру?
+1
тоже помню одну подставу
Самый первый раз, когда я вошёл в игру, задавал вопросы в городе «что тут как», какой-то парень позвал меня поближе к охранникам и попросить ударить его. Я доверчиво это сделал, и тут же меня насмерть сразило заклинание стражника.
— и что ты этим хотел показать?
— а то, что здесь нельзя никому доверять!
Это было очень смешно и пафосно.
— и что ты этим хотел показать?
— а то, что здесь нельзя никому доверять!
Это было очень смешно и пафосно.
если админы живые, что же они ее не пилят?
Я так понял, что благодаря открытию этого сервера, игра как раз и начала потихоньку пилиться — нужный человек получил исходники и ресурсы в свои руки. Но занимается он игрой в свободное от работы время, денег она ему не приносит.
Какими чувствами руководствуются, администрируя полу-живую игру?
Часть админов остаются в игре из патриотизма, привязанности к ней. Некоторые — чтобы иметь игровое преимущество.
0
плюсую)
+1
Спасибо за статью. Сам рубался в эту игру на диалапе. =)
+1
Картинки и описание, причём и описание автоматизации очень напоминает Ultima Online с его Yoko Injection и EasyUO :)
+1
Sign up to leave a comment.
Мини-исследование, улучшение и бот для игры Shadow Worlds