Perfect World, Jade Dynasty издаваемые мэйлру — разрабатываются китайцами, Ground War: Tanks — аналогично.
Так что не надо фэйспалмить — надо покурить матчасть ознакомиться с предметной областью.
Предложите свои услуги компании мэйл-ру, а то от их перлов типа «Зло проникло в волшебные штаны», «Фритуальные пленники Кенеди» и «Генерал армии ведро» уже совсем даже не смешно.
А все угнанные акки, находящиеся в продаже — они же, конечно же на частных почтовых серверах же? Верно? Правда ведь ни одного с почтой на мэйл-ру не угнали?
Кому нужна веская причина?
Не желающему распространять информацию о себе достаточно его не желания. В конечном итоге — это его право не желать чего-то, в частности разглашать информацию о себе.
… вот только клиент понятия не имеет, к чему этот 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;
А почему конечные автоматы-то? Behaviour Trees гораздо более гибкие, меньше переписывать при изменении окружающих условий, да и на ниве бото-строения они себя зарекомедовали прекрасно.
Боты не могут протестировать эксплоиты, потому что уязвимости, которые должны эксплуатироваться ещё надо найти, а это отдельная не связанная с ботами задача.
Как вам уже выше ответили — все очевидные вещи, типа расстояния атаки и пр. проверяются на серверной стороне.
А зачем всё так усложнять?
1) считаем hw-id компьютера клиента
2) делаем запрос на свой сервер — получаем все данные по подписке, связанной с этим hwid
Обмен запросами/ответами между клиентом и сервером зашифрован, например, AES'ом. Обмен ключом и iv для AES между клиентом и сервером по классической схеме с использованием пары RSA ключей, приватный на сервере, публичный получит клиент при первом запросе к серверу авторизации.
Бонусом, на сервере можно хранить особенно чувствительные данные / блоки кода и получать их по уже созданному защищённому соединению.
соблюдения принципа Крепсондоотличного слога!Так что не надо фэйспалмить — надо
покурить матчастьознакомиться с предметной областью.Это что за сюрр такой?
Не желающему распространять информацию о себе достаточно его не желания. В конечном итоге — это его право не желать чего-то, в частности разглашать информацию о себе.
У «проблемы» есть очень элегантное и проверенное временем решение — инжекты. Если объяснять в двух словах — вам надо подняться в отладчике чуть выше чем отсылка клиентом пакета и найти функцию-обработчик щелчка на предмете, которая и инициирует посылку пакета серверу.
Эта функция, вероятнее всего, будет принимать один параметр — номер ячейки, предмет из которой следует использовать.
Дальше начинается «колдовство»:
1) вам необходимо изготовить процедуру, которая будет вызывать эту найденную функцию с нужным параметром, так, чтобы клиент не крашился.:
2) Вызвать эту функцию в контексте процесса игры, так как будто это сделала она сама:
Как вам уже выше ответили — все очевидные вещи, типа расстояния атаки и пр. проверяются на серверной стороне.
Вот смешно-то будет, если она проявится у легитимных пользователей из-за вашей ошибки в защите, например пропущенном где-то в условиях 'not'
1) считаем hw-id компьютера клиента
2) делаем запрос на свой сервер — получаем все данные по подписке, связанной с этим hwid
Обмен запросами/ответами между клиентом и сервером зашифрован, например, AES'ом. Обмен ключом и iv для AES между клиентом и сервером по классической схеме с использованием пары RSA ключей, приватный на сервере, публичный получит клиент при первом запросе к серверу авторизации.
Бонусом, на сервере можно хранить особенно чувствительные данные / блоки кода и получать их по уже созданному защищённому соединению.
Мило. А что ещё не правильно указано в характеристиках?
Крутое задание, спасибо!
Этот квест является отличным завершением трудовой пятницы.