про защиту на мотре ~_^

Обсуждение особенностей разных пиратских серверов

Модератор: 4epT

Аватара пользователя
Jerry
Профессионал
Сообщения: 1047
Зарегистрирован: Сб ноя 04, 2006 12:26 pm
Контактная информация:

Сообщение Jerry »

хехе, не понравилось, видать, что распаковывают все кому не лень :)
LuzZza
нехороший человек
Сообщения: 4
Зарегистрирован: Вт мар 13, 2007 2:57 am

Сообщение LuzZza »

Хех. Ностальгия.

Этот текст не будет доступен широким массам еще некоторое время. Я не хочу неприятностей тем, о ком я буду писать, им хватит и тех, которые доставил им я. Я бы мог просто забыть о том, что произошло, но не могу пренебречь своим тщеславием -- здесь есть, чем гордится. Речь пойдет про МОТР, игровой сервер Рагнарок Онлайн, и про ботов. Чтобы понять, о чем этот текст, нужно быть знакомым с этой игрой и с этим сервером. Я сделал бота для МОТРа. Это было не легко, но не невозможно, в чем уверена большая часть игроков этого сервера. Я использовал бота в течении двух недель, но об этом знают, возможно, лишь несколько игроков, а запомнят, наверное, только админы. В поведении персонажа бота узнать не трудно, но когда в течение нескольких лет вам внушают, что на этом сервере ботов нет и быть не может, вы скорее станете не доверять себе, чем установившемуся закону. Естественно, наличие бота, когда он появился, никто не афишировал, а когда был забанен, в причине указали "попытка использования бота", одну из самых популярных причин ГМ-ских банов на МОТРе.

Я недавно начал играть здесь, денег у меня не было, а если у тебя нет денег, ты не сможешь оплатить премиум, значит, ты не сможешь поставить торговца в автотрейд, следовательно, у тебя не будет денег. Но я знал, на что хватит моих умений и что можно выжать из сервера РО. Я решил написать скрипт, который бы подобно клиенту соединялся бы с сервером, заходил в игру чаром и ставил магазин с товарами. Это избавило бы меня от необходимости держать запущенным клиент, а, запустив его на каком-нибудь компьютере с постоянным доступом в Интернет, я бы еще и не тратил свой трафик. Под рукой был PHP. Глупо думать, что этот язык может быть пригоден лишь для механизации страничек в Интернет, он уже давно вырос до мощного скриптового языка. Принцип прост: устанавливаем соединение с логин-сервером, обмениваемся пакетами с ним, устанавливаем соединение с чар-сервером, с ним тоже обмениваемся пакетами, соединяемся наконец с мап-сервером, посылаем пакеты, необходимые для входа в игру и установки магазина. Многих деталей этой истории я уже не помню, поэтому если я буду говорить о чем-то туманно и в общих чертах, знайте -- это такой случай. Я не помню, как я обнаружил, что пакет, отправляющий на сервер имя пользователя и пароль, я его называю логин-пакетом, не оригинальный, а шифрованный. Может быть, я знал об этом и раньше или обнаружил случайно, но следующей мыслью была, что можно и не расшифровывать его, а просто повторить ту последовательность байт, которую отправляет клиент.

Здесь нужно рассказать про клиент МОТРа. Я им искренне восхищен. Он -- доказательство гениальности админов, а то, что МОТР лучший сервер в России -- следствие из этого факта. Итак, клиент МОТРа это ruro.exe+ragexe.exe. Ragexe.exe - оригинальный корейский клиент, вы будете долго смотреть на него, лежащего на диске, и не найдете в нем ни одного байта, который внесли туда админы МОТРа. Они его не трогали. Вы запускаете ruro.exe, он запускает ragexe.exe и объявляет себя его отладчикам, вносит некоторые изменения в код клиента, находящегося уже в памяти, в том числе и так называемые брэйкпоинты для вызова отладчика, int 3. То есть клиент будет работать, а в нужные моменты передавать управление коду ruro.exe. Этим реализовано все, что требовалось МОТРу: направить клиент на свой IP, изменить содержимое пакетов, сделать изменение курсора мыши после окончания PvP-дуэли, словом, все возможное, чтобы вам, дорогие мои, удобно игралось. Вернемся к логин-пакету.

Итак, расшифровка его могла занять много времени или вообще не принести результатов, но можно было запустить сниффер, подсмотреть какой пакет генерирует клиент, и просто его повторить. Это было сделано и это сработало. Работало и не подводило до тех пор, пока админы не выпустили новую версию ruro.exe который не давал зайти в игру со старой версией клиента, тем самым заставляя игроков качать патчи. Тогда просто пришлось переснифферить пакет. Внешне он был похож на оригинальный корейский логин-пакет, он был длиной 55 байт и сигнатурой 0x85, но остальные его поля не совпадали, а логин и пароль были зашифрованы -- еще один повод уважать админов. Логин-сервер нас корректно обслужил, с чар-сервером тоже проблем не возникло, и вот мы присоединились к мап-серверу. Здесь есть интересный пакет, афиновцы назвали его wanttoconnection, нет, сложностей в этот раз с ним не возникло, просто этот пакет сам по себе важен и интересен, являясь камнем преткновения несовместимости разных версий протоколов РО. Открывая магазин, клиент сначала отправляет пакет, сигнализирующий об использовании скилла Vending, а потом пакет, содержащий список товаров и вообще сам факт открытия лавки. Два пакета, один за другим. А что будет, если первый не посылать, а послать сразу второй? Все правильно -- ничего неожиданного, магазин открывается и без первого пакета, к тому же не тратится SP. В итоге -- скрипт на PHP, круглосуточный торговец, кое-какие деньги. Жалко конечно, что монстры такого торговца не игнорируют, но ничего, можно жить и без этого. Как хорошо, что я обошелся без пакета использования скилла Vending, я тогда даже представить себе не мог, насколько это хорошо.

Рос маг Тру и росли мои амбиции. Я стал подумывать о боте, а почему бы и нет? Вот он openkore, у него open core. Все на перле, все как на ладони. Я могу его переписать так, чтобы вместо стандартного логин-пакета он посылал мой сниференный пакет, и бот готов. Деньги потекут рекой. Так я и сделал, запустил. К логин-серверу приконнектился, к чар-серверу приконнектился, к мап-серверу тоже приконнектился! Ура! Кхе, но почему он стоит на месте? Ммм, что-то не так, почему же он не ходит. Может, я где-то ошибся, он не ходит и никого не бьет. Через несколько часов этот аккаунт был забанен за "попытку использования ботов". Стены МОТРа оказались выше и крепче, чем я предполагал, перепрыгнуть мне их не получилось.

Перепрыгнуть, может, и не получилось, а перелететь получится. Я и не думал бросать свою затею, наоборот, я еще крепче сжал кулаки. Открыл окошко блокнота, написал в самом вверху пару матерных слов в сторону админов сервера, нажал два раза энтер и стал вписывать названия пакетов, структура которых была МОТРом изменена. Итак, walktoxy, actionrequest, skilltoid, useitem, сейчас уже все не помню. Общие черты пакетов были прежними -- те же сигнатуры, та же длина, изменено содержимое. Я пробовал разгадать способ кодирования в лоб -- думал, может там просто каким-нибудь xor-ом прошлись по байтам. Брал исходные значения координат из пакета walktoxy и брал кодированные мотровские координаты, переводил в двоичный код и тупо смотрел, выделяя закономерности. Безуспешно, нужен другой способ. Другой способ -- дизассемблирование ruro.exe. Я не знал, насколько это будет полезно, я не знал, получится ли у меня что-нибудь, я вообще никогда раньше ничего не дизассемблировал, да и знания ассемблера мои довольно скудны. Но нашлась под рукой IDA и будь она чуть менее удобна и проста в использовании, я бы, наверное, забросил бы эту затею навсегда.

Дизассемблирование, казалось, ничего не дало. Немного кода в начале файла, немного чуть дальше середины, все остальное -- хаотичная масса символов темно-красного цвета. Не помню, как я додумался до того, что экзешник сжат упаковщиком. Может быть, это пришло как само собой разумеющееся, но помню, что я не долго ломал над этим голову. PEiD, программа, которая определяла, чем был упакован PE, с уверенностью говорила о конкретном упаковщике. Декомпрессор найти в Интернете труда не составило, у меня появился ruro_unpacked.exe, который стал в полтора раза больше оригинального и напрочь отказывался запускаться. Потом я потратил очень много времени, пытаясь восстановить таблицу импорта, тем самым возродить руро к жизни, все было зря. Я не знаю, зачем я хотел это сделать, но я обошелся и без этого. В конце концов, распакованный файл стал дизассемблироваться и обнаружил драгоценные строчки кода, в которых хранилась тайна шифрования пакетов.

Найти нужное в разноцветных пластах ассемблерного кода -- это вообще дело сложное и заслуживает отдельной истории. Спасибо ИДЕ, она во много крат упрощает эту задачу. Я начал с импортов ruro.exe. Здесь можно было найти WaitForDebugEvent() из kernel32.dll, то, что нужно, потому что руро ловит этой функцией пакет прямо перед отправкой его на сервер. Пройдясь по переходам, я попал на ряд обработчиков событий, вот она, святая святых. Но как выяснить, какой обработчик отвечает за какой пакет? Тогда мне на помощь пришла Оля. Говорят, Олю по-настоящему зовут Olly Debugger, но я в это не верю. Она могла многое, но в ней не было такого ловкого и удобного дизассемблера как в ИДЕ, поэтому я одновременно пользовался и тем и другим. В Олли, присоединившись к работающему процессу, можно было поставить брейкпоинт, который не прервет работу программы, но выведет тебе на экран полезную информацию из регистров в этот момент. Так я выяснил ряд соответствий между событиями и адресами их обработчиков в коде ruro.exe.

Самым важным и ответственным пакетом мне казался walktoxy, с него я и начал. Все было чертовски сложно. Куча сложений, куча умножений, куча сдвигов, условий и переходов. Всюду неизвестно откуда взявшиеся константы. Я испугался, я не видел свободного конца, за который можно было ухватиться. Если бы я знал, что я взялся за самый сложный пакет, я бы оставил его на потом, но я не знал. Передо мной были строчки, примерно по семь-восемь строк некоторых арифметических эволюций типа сложения/деления/сдвига, после них шли очень на них похожие семь-восемь строк и так далее. Сейчас передо мной код на PHP, дублирующий все операции ассемблерного кода. Я удивлен, как я его смог написать, я и тогда удивился, как мне это удалось, а теперь удивляюсь еще больше.

Я вижу перед собой цикл, настроенный на девять итераций, в каждой итерации происходят некоторые операции с одним из битов первой и второй координаты. Выше цикла два массива, в каждом по девять коэффициентов. Еще выше массив, содержащий 1024 значения. Я объясню. В алгоритмах шифрования почти каждого измененного МОТРом пакета то тут, то там фигурируют значения, взятые из некоторой таблицы в памяти, размер таблицы -- 1024 байта. Это таблица генерируется после запуска руро, точнее это происходит так. Случайным образом берутся два байта, они передаются серверу в логин-пакете. И руро и сервер на основе этих двух байт каждый у себя генерируют таблицы, они получаются идентичные. Значения из этих таблиц участвуют в шифровании/дешифровании пакетов. Мне нужна была эта таблица, помню, я тогда пробовал выяснить способ ее генерации, не получилось -- все сложно и запутанно. Я пошел другим путем: если исходные два байта не выбирать каждый раз случайным образом, а присваивать им фиксированное значение, таблица всегда будет получаться одной и той же. Удивительно, но и это тоже сработало. Если бы мотровцы организовали бы все немного не так, если бы эти два байта выбирались не клиентом, а сервером, они поставили бы меня в тупик, вынудив генерировать таблицу каждый раз. Но мне повезло, поэтому код, на который я сейчас смотрю, работает.

Итак, были выбраны два исходных байта, они стали моим талисманом. Я думаю, если бы Спаку или тому, кто занимался поимкой моего бота, шепнуть сейчас на ухо "03 04", он поймет, о чем речь. Эти два числа передавались на сервер в логин-пакете, там, на сервере, из них генерировалась таблица, а у меня она уже была готова, я извлек ее из работающего клиента. Благодаря этому я смог шифровать walktoxy и другие пакеты подобно руро. После walktoxy был actionrequest, не менее важный пакет. Бот уже начал ходить и бить ножиком монстров -- хорошо, но недостаточно. То, что я не заметил изменение пакета использования скилла, стоило мне двух аккаунтов, которые были забанены. А дело здесь вот в чем. Сервер отлавливает и запоминает каждую посылку неправильно зашифрованного пакета, а админы просто банят те аккаунты, за которыми числится некоторое количество таких вот неверных пакетов. Вот почему все попытки ботинга вылавливаются и рубятся на корню -- перетекают в файл banlist.txt и становятся строчкой "попытка использования бота". Но я сделал уже больше половины и баны не могли меня напугать, тем более что они не имели никакого отношения к моему основному аккаунту -- магу Тру.

Следующая попытка запуска бота была абсолютно успешной, это именно он пробегал по полям Рун-Мидгарда в течение двух недель. За это время произошли некоторые изменения, они требовали модификации как моего торговца, так и бота. Мотровцы решили менять еще и wanttoconnection, и теперь не срабатывала фишка с отправкой только одного из двух пакетов, отвечающих за Vending, но это не тянуло на проблему. Иногда выходили новые версии ruro.exe, тогда приходилось снифферить заново логин-пакеты. Но бот возвращался к своему занятию и продолжал исправно приносить мне прибыль.

Я погубил свое создание своей невнимательностью. Однажды вечером было произведено очередное обновление руро, вынудившее меня снифферить логин-пакеты заново. Все было сделано, и я запустил на ночь бота. Утром меня разбудили новостью, что аккаунт бота забанен. Я стал пересматривать код и обнаружил свой прокол: я забыл подменить два байта для генерации таблицы своими волшебными "03 04". Всю ночь бот отправлял неверные пакеты серверу. Дальше произошло то, что я не могу объяснить, вероятно, я недостаточно хорошо знаю всю эту систему. К вечеру вышел новый ruro.exe. К моему величайшему удивлению, в нем два байта для генерации таблицы не выбирались случайно, их значение было фиксированным. Как думаете, каким? Правильно -- "03 04". Являлся ли этот патч причиной, средством или следствием для последующих событий, я сказать не могу, но на следующее утро были забанены еще полдюжины аккаунтов: мои боты, мои торговцы, мой основной аккаунт и аккаунты еще трех моих друзей, не имевших никакого отношения к боту. Все забаненные аккаунты объединяло только одно -- все когда-либо запускались с моего компьютера. Ничего удивительного: я еще давно заметил, что в логин-пакете передается результат выполнения GetVolumeInformation, а именно VolumeSerialNumber. Я раньше не придавал этому факту достаточного значения, хотя и осознавал, что стоило.

С того момента прошло уже несколько месяцев. Не могу сказать, что мне не приходилось жалеть, что все вышло именно так. С одной стороны, очень неплохо быть на МОТРе успешней других, с другой я рад, что МОТР продолжает оправдывать свое звание сервера без ботов. Благодаря этой истории, МОТР и его администраторы выросли в моих глазах. Здесь все правильно: правильный клиент, правильный сервер, правильный подход правильных админов. Я рад, что он не по зубам ни назойливым ботерам, ни доморощенной Гравити. А моя история закончилась хорошо: аккаунты моих друзей были разбанены, взамен я дал Спаку обещание не использовать ботов, и я не собираюсь его нарушать. Еще я ему сказал, что, если кто-нибудь спросит моего мнения относительно организации и защиты МОТРа, я отвечу: "высший класс". Я действительно так думаю.
Dalt
Начинающий
Сообщения: 20
Зарегистрирован: Сб дек 09, 2006 7:22 pm

Сообщение Dalt »

Грамотно всё сделал, что ещё можно сказать.
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Больше похоже на заказную рекламу для определенного круга людей, чем на отчет о реально проделанной работе...
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Lims
Нууууп
Сообщения: 723
Зарегистрирован: Чт ноя 09, 2006 7:55 pm

Сообщение Lims »

LuzZza
красивая сказка
Ymmy
Начинающий
Сообщения: 24
Зарегистрирован: Пт мар 09, 2007 5:46 pm

Сообщение Ymmy »

LuzZza писал(а):. А моя история закончилась хорошо: аккаунты моих друзей были разбанены, взамен я дал Спаку обещание не использовать ботов, и я не собираюсь его нарушать.
и жили они долго и счастливо... :ROFL:
Аватара пользователя
Kissa2k
Профессионал
Сообщения: 1304
Зарегистрирован: Пн дек 04, 2006 8:33 pm

Сообщение Kissa2k »

Писать торговца-бота на PHP не очень рационально. Хотел бы я взглянуть на его код ^^
Ymmy
Начинающий
Сообщения: 24
Зарегистрирован: Пт мар 09, 2007 5:46 pm

Сообщение Ymmy »

Kissa2k писал(а):Писать торговца-бота на PHP не очень рационально.

Код: Выделить всё

<?
        echo "Йа Вендингбот";
?>
Работаит?
Timeless
Начинающий
Сообщения: 19
Зарегистрирован: Чт мар 01, 2007 4:21 am

Сообщение Timeless »

отжигаешь не по деццки. :)
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse »

:) А ПХП ботег для РО мне знаком. Но на него забили два года назад.
LuzZza
нехороший человек
Сообщения: 4
Зарегистрирован: Вт мар 13, 2007 2:57 am

Сообщение LuzZza »

Kissa2k писал(а):Писать торговца-бота на PHP не очень рационально. Хотел бы я взглянуть на его код ^^
Да простят меня на небесах. -_-

[mod="piroJOKE"]круто[/mod]
Вложения
reg.zip
(13.59 КБ) 613 скачиваний
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse »

LuzZza
Ещё бы прикрутили всё чудо к ПХПРО боту, совсем бы цены небыло.

Хотя, если таковое можно зделать..... нужно бы подумать о тех БД по Локи, Хаосу... мож туда что-то такое немного (по лошадиному) доделаное чтоб на автомате лазяло и собирало инфу. Но ет ИМХО Оффтоп... в етой темке.
Аватара пользователя
Kissa2k
Профессионал
Сообщения: 1304
Зарегистрирован: Пн дек 04, 2006 8:33 pm

Сообщение Kissa2k »

У меня вопрос, на мотре все пакеты шифруются или есть часть оригинальных?

В частности у них логин пакеты стремные какие-то)
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Ребята, я закрываю эту тему, но не удаляю ее.
Одна тема по мотру уже существует, пожалуйсто, пишите там!
viewtopic.php?t=598
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Закрыто