Обходим коммерческую защиту методом black box и пишем packet hack для lineage 2 Хабрахабр. Пролог. Все началось год назад, когда один из моих товарищей с форума T предложил переписать известную всему читерскому миру программу l. Xkor постарался как следуют реализовал методы обхода шифрации, красивый gui и тп. Но злобным админам фришек такое приложение не понравилось оно существенно убивало их доход на старте очередных однодневок. Да да, были времена когда любой нонейм мог зайти на любой сервер и устроить полную вакханалию этим инструментом. Тогда же и появились всяческие коммерческие защиты, которые безуспешно блокировали использование пакетника, а самые хитрые из них еще дополнительно шифровали трафик. Одна из таких защит живет на последнем издыхании и по сей день встречайте, защита S. Программа Для Защиты Серверов Lineage2' title='Программа Для Защиты Серверов Lineage2' />Сегодня защита S стоит на всех топовых серверах lineage 2. К слову, xkor предусмотрел такой исход и реализовал возможность самостоятельно написать модуль расшифровки пакетов newxor. Да только писать его было не рационально новый сервер новый newxor. Читерство по l. 2 постепенно начало умирать, ибо новички были не в состоянии отправлять пакеты методами изменения памяти клиента Hx. D, cheat engine и тд. Тогда я отнесся к этой затеи не очень серьезно написал модуль перехвата пакетов клиент сервер и забросил. Но буквально 3 дня назад я решил возобновить работу над этим проектом и опубликовать данную статью. Комьюнити читеров l. Все баги и отмывы к ним находятся в руках 1. T. И я тоже решил уйти. А если уходить, то лишь красиво Два года назад я мечтал о работающем пакетнике, а сегодня он мне не нужен. Дисклеймер. Сентябрь горит в виду своего возраста совсем скоро, а именно 1 сентября, я буду встречать свой последний год в одой из московских школ. Список школьной литературы даже не открывался, а книги для подготовки к ЕГЭ пылятся в шкафу. Tiger Shark Автосигнализация Инструкция далее. Времени совсем нет. Часть кода накинута на скорую руку, тк не совсем приятные известия выяснились лишь после завершения работы, но об этом позже. Статья тоже написана не совсем литературным языком. Но что есть, то есть. Перехват пакетов сервер. Если посмотреть на то, как этот же код выглядит в памяти, то мы увидим следующее Как банально, это самый обычный jmp near на некий обработчик. Сам обработчик нам не интересен, пусть работает себе. Мы же просто поставим хук после этого хука и получим пакет в расшифрованном виде. Тут возникла первая проблема. Методом научного тыка было выявлено, что функции типа Virtual. Protect и Virtual. Alloc отрабатывают с ошибкой, а без них в защищенную память луче не лезть. Почему это происходит Я так и не выяснил, не было времени. Но могу сказать, что защита S перехватывает Nt. Protect. Virtual. В разделе программы Lineage 2 представлены полезные программы информер. Akumu отвечает в теме SmartGuard Защита для сервера Lineage 2. Файлы для игры на сервере x1000 Interlude. На сервере установлена автоматическая защита от ботов и сторонних программ. Сам l2phx l2 packet hack, пакетник, хлапа представляет из себя. Сегодня защита S стоит на всех топовых серверах lineage 2. Программа Для Защиты Серверов Lineage2' title='Программа Для Защиты Серверов Lineage2' />Memory и что то там делает. Тут я начал строить хитроумный план по обману защиты, но моя лень взяла верх и я тупо сделал так HANDLE h. Main Open. ProcessPROCESS. Возвращаемся к хуку. Программа Для Защиты Серверов Lineage2' title='Программа Для Защиты Серверов Lineage2' />Это выясняется сразу, тк вылезает наг окошко, где нас ругают матом. Правильно, поставим хук дальше. Я выбрал смещение 0x. Структуру пакета, который передается в функцию Add. Хроники сервера High Five классика. Надежная защита от DDoS и многое другое. Программа Для Защиты Серверов Lineage2' title='Программа Для Защиты Серверов Lineage2' />Network. Queue, еще в далеком 2. Gold. Finch struct Network. Packet. А так же содержимое регистра ecx. Все просто мы имеем дело с соглашением. Он передается именно в ecx. Зачем нам что то вызывать Далее вы все поймете, а пока я привожу готовый код BYTE Add. Network. Queue BYTE Get. Proc. Addressh. Engine,. На самом деле все просто. Я лишь заострю внимание на том, что Add. Network. Queue DWORD Add. Network. Queue 1 5 всего лишь переходит от обертки с jmp к настоящей функции Add. Network. Queue. Что такое unh Это то самое значение ecx, которое мы пихаем в переменную в нашем обработчике void. В нем мы комфортно обрабатываем пакет, не боясь за стек, и возвращаем управление назад к врапперу. Он, в свою очередь, восстанавливает затертые инструкции и прыгает к месту, откуда мы прервали оригинальный код. Нус, одной проблемой меньше. Перехват пакетов клиент. Именно на них основано 7. За отправку этих пакетов отвечает не экспортируемая функция, которую принято именовать Send. Packet UNetwork. Handler Send. Packetcharmsk,. Функция имеет переменной количество параметров, которые достаются из стека исходя из первого аргумента маски. Как получить адрес этого чюда, ни экспортируемое жи Все просто, достаточно посмотреть, как она вызывается. Статья не претендует на звание туториала по api lineage 2, поэтому я просто приведу конкретный пример вызова Теперь должно быть понятно, зачем нам необходимо было значение регистра ecx Send. Packet BYTE DWORD DWORD unh 0x. Send. Packet DWORD Send. Packet 1 5. Send. Packet так же является оберткой и внутри него находится обычный jmp на основную функцию. Ее начало выглядит так А в памяти, по аналогии c Add. Network. Queue, вот так Опять банальный прыжок на некий обработчик, но в данном случае игнорировать его мы не можем он выполняет шифрование пакета. Если попробовать перезаписать его на свой прыжок защита S ругается матом. А если пройти по этому прыжку Еее, еще один прыжок. Заспойлерю там их еще штук 5 будет чередование jmpcall near. Мы имеем дело с обфускацией, классно. Что делать, если нам лень восстанавливать поток управления Метод в лоб. А почему бы на не перезаписать один из этих 5 jmpnear на свой По началу, я так и сделал, и это была моя фатальная ошибка. Как оказалось, защита S проверяет целостность кода в этих местах и в случае не совпадения с оригиналом ругается матом. Лишь спустя 1. 5 минут. Конечно, на стадии разработки я не мог себе позволить тестировать работоспособность в течение такого времени. По окончанию работы над всем проектом я был приятно удивлен. Но я не поник, а. Попробовав технику инлайн патча поверх обфусцированного кода aka самостирающиеся хуки к сожалению, исходников того варианта не осталось, к вопросу о гите. Как это работает мы ищем любую мусорную инструкцию и затираем ее на jmp near к нашему обработчику. В нем быстренько восстанавливаем оригинальный байты именно записываем их в память, куда поставили jmp, а не просто выполняем затертые байты в обработчике, делаем свои делишки, возвращаем управление к оригинальной функции. Но такой вариант будет работать всего один разИменно, до тех пор, пока мы не установим хук снова. Вспоминаем, что защита S проверяет лишь первые байты функции и если мы поставим хук в конце, то она и слова не скажет. Ставим второй хук в конец Send. Packet, самый обычный хук, в котором спавним запись jmp near по адресу мусорной инструкции обфусцированного кода. Понять это, с моих слов, не очень просто, но схема такая Устанавливаем хук по месту мусорных инструкций обработчика защиты S. В нем, в конце, восстанавливаем эти мусорные инструкции в памяти и прыгаем на них. Таким образом мы как бы стираем свой хук. Обработчик защиты S отрабатывает и передает управление к оригинальной функции Send. Packet. В конце нее мы ставим второй хук, который заново установит первый. Дело в том, что такой подход сработает лишь в том случае, если защита проверяет целостность кода из текущего потока. Те если у нас где нибудь весит второй поток, который проверяет байты первого, то такой трюк не сработает. Так и случилось, я лишь потратил время. Мы не можем менять байты в памятиВыйти в окно Метод сзади. На самом деле, в такой ситуации есть пару вариантов установки хука. Я выбрал один из них хук методом изменения прав страницы памяти. Да, это не лучший вариант, но сроки горели напоминаю, это делалось в самом конце, прям перед написанием этой статьи. Тут стоит сделать отсылку к замечательному циклу статей от Broken Sword Процессор Intel в защищенном режиме. Почитайте, не поленитесь. А так же отсылку к циклу статей Matt Pietrekа Win. SEH изнутри. Гуглится довольно просто. Теперь, я надеюсь, вы поняли, в чем вся соль. Мы изменим атрибут страницы, где находится наша процедура Send. Packet на самом деле, я решил менять атрибут страницы памяти, где находится обработчик защиты S, об этом позже. Звучит сложно, но на деле нам необходимо будет выполнить следующий код Virtual. Protect. Exh. Main, Send.