- 17
- 27
Добрый вечер.
Для начала напишем сам скрипт:
https://t.me/+dumSNYnT4nw2Nzhi
https://t.me/+dumSNYnT4nw2Nzhi
Итог таков. Теперь начинаем это обходить. Все достаточно легко. Скачиваем листер байткода клик и запускаем его, требуется Python. Далее переносим скрипт на decompiler.py выбираем 3 - List bytecode и 2 - Decompile with Python-written decompiler. У вас появится asm и -decompiled.lua файлы. Открываем.
https://t.me/+dumSNYnT4nw2Nzhi
https://t.me/+dumSNYnT4nw2Nzhi
https://t.me/+dumSNYnT4nw2Nzhi
Не пугаемся, чем больше смотрите, тем понятнее.
Краткий мануал
Ищем нужный нам JMP, в асм по рядом стоящим меткам.
https://t.me/+dumSNYnT4nw2Nzhi
https://t.me/+dumSNYnT4nw2Nzhi
Для начала перекидываем туда наш файл, и возвращаемся к оффсетам. Они нам нужны для легкого поиска нужных опкодов, чтобы не составлять поисковую строку самостоятельно, легче скопировать оффсет и нас сразу перекинет на нужный байт (причем без ошибочно). Чтобы узнать что такое оффсет, посмотрите мануал по листингу который я прикрепил выше.
Для нашей проверки оффсет - 000002D8
https://t.me/+dumSNYnT4nw2Nzhi
Вставляем в поиск, не забываем приписать к началу 0x
Иначе может найти не верный байт. Нажимаем Enter, нас перекидывает на байт (выделенный)
https://t.me/+dumSNYnT4nw2Nzhi
Чтобы нопнуть этот джамп, заменяем 4 байта следующим образом:
https://t.me/+dumSNYnT4nw2Nzhi
https://t.me/+dumSNYnT4nw2Nzhi
Готово! Мы отключили проверку.
https://t.me/+dumSNYnT4nw2Nzhi
Эта функция возвращает ошибку (quit_script), давайте ее выключим. Ищем CALL, вероятно она будет стоять рядом со строками которые находятся выше нее.
https://t.me/+dumSNYnT4nw2Nzhi
Мы видим 3 шт CALL, тут уже чуть сложнее найти нужный.
Заменяем 4 байта на 54 00 00 80 (прыжок в никуда)
https://t.me/+dumSNYnT4nw2Nzhi
Как видим, ошибки, что закрывала скрипт, уже нет.
Данный гайд подходит к концу. Тема следующего гайда - хуки.
Подписываемся на телеграм канал со всеми гайдами реверсу / защите скриптов, в комментариях к посту оставлю функции http, getComputerName как бонус - https://t.me/+dumSNYnT4nw2Nzhi
Создадим скрипт с привязкой самостоятельно, отличаться он не будет абсолютно ничем от пеид. Отличие в том, что мы будем использовать глобальную, не защищенную функцию string.find и вместо hwid/nick используем получение ника компьютера через FFI.В этом гайде расскажу и покажу на реальном примере как обходить скрипты LuaJIT.
Для начала напишем сам скрипт:
https://t.me/+dumSNYnT4nw2Nzhi
Все проверки которые пишутся кодом (большая часть) никак не реагирует на изменение скрипта через hex, ведь бы аккуратно подменяем байты, а не добавляем / изменяем функции и целостность скрипта, поэтому они нам не нужны в этом туториале. Как можем заметить, функции local, поэтому их названия в листинге байткода не будут видны.Обьясняю почему я не добавлял проверки на кряки.
❗️Рабочий код на HTTP запрос, основанный через FFI, можете найти в нашем телеграм канале + получение ника компьютера ❗️
Скрипт написан, теперь компилируем его и запускаем.https://t.me/+dumSNYnT4nw2Nzhi
Итог таков. Теперь начинаем это обходить. Все достаточно легко. Скачиваем листер байткода клик и запускаем его, требуется Python. Далее переносим скрипт на decompiler.py выбираем 3 - List bytecode и 2 - Decompile with Python-written decompiler. У вас появится asm и -decompiled.lua файлы. Открываем.
❗️У МЕНЯ ВИДОИЗМЕНЕННАЯ ВЕРСИЯ, У ВАС БУДЕТ ЛИСТИНГ ВЫГЛЯДЕТЬ НЕСКОЛЬКО ПО ДРУГОМУ ❗️
https://t.me/+dumSNYnT4nw2Nzhi
Конечно не удобно, что бесплатный декомпилятор оставляет slot, приватный так не делает:Декомпилированный формат, кстати он облегчает код - это его особенность, мы ничего не теряем из-за этого.
https://t.me/+dumSNYnT4nw2Nzhi
ASM выглядит так:Пока этот декомпилятор находится у малого круга лиц. Возможно вскоре буду продавать, но это не точно =)
https://t.me/+dumSNYnT4nw2Nzhi
Не пугаемся, чем больше смотрите, тем понятнее.
Краткий мануал
Давайте я покажу оба способа. Начнем с первого.Дальше начинается самое интересное, мы должны понять, что нам нужно нопнуть, это может быть либо опкод JMP (прыжок, отвечает за проверку if) либо CALL (вызов, отвечает за () вызов функций).
Ищем нужный нам JMP, в асм по рядом стоящим меткам.
https://t.me/+dumSNYnT4nw2Nzhi
https://t.me/+dumSNYnT4nw2Nzhi
По определенным меткам:Как я нашел что именно этот JMP наша проверка?
- Глобальным функциям
- Строкам
- Интуитивности
- 54 - номер JMP опкода в LuaJIT 2.0, 58 - номер JMP в LuaJIT 2.1 !!!
Нам понадобится любой HEX-редактор, я пользуюсь hexed.it , на нем и буду демонстрировать.Далее нам нужно поменять байты так, чтобы проверка постоянно проходила.
Для начала перекидываем туда наш файл, и возвращаемся к оффсетам. Они нам нужны для легкого поиска нужных опкодов, чтобы не составлять поисковую строку самостоятельно, легче скопировать оффсет и нас сразу перекинет на нужный байт (причем без ошибочно). Чтобы узнать что такое оффсет, посмотрите мануал по листингу который я прикрепил выше.
Для нашей проверки оффсет - 000002D8
https://t.me/+dumSNYnT4nw2Nzhi
Вставляем в поиск, не забываем приписать к началу 0x
Иначе может найти не верный байт. Нажимаем Enter, нас перекидывает на байт (выделенный)
https://t.me/+dumSNYnT4nw2Nzhi
Чтобы нопнуть этот джамп, заменяем 4 байта следующим образом:
- было 54 06 04 80
- заменяем на 54 00 00 80
https://t.me/+dumSNYnT4nw2Nzhi
Аналогично с теми у кого LuaJIT 2.1, только у вас не 54 будет JMP, а 58. Ну и заменяем разумеется на 58 00 00 80.Доп. информация: если вам нужно чтобы проверка наоборот не работала, то заменяем 54 00 80 00
Запускаем
https://t.me/+dumSNYnT4nw2Nzhi
Готово! Мы отключили проверку.
Идем дальше, отключаем вызовы функций которые могут сломать скрипт.
Мы видим в нашем исходнике вызов функцииhttps://t.me/+dumSNYnT4nw2Nzhi
Эта функция возвращает ошибку (quit_script), давайте ее выключим. Ищем CALL, вероятно она будет стоять рядом со строками которые находятся выше нее.
https://t.me/+dumSNYnT4nw2Nzhi
Мы видим 3 шт CALL, тут уже чуть сложнее найти нужный.
Базовая аналитика
Смотря на это могу предположить что второй колл отключает функцию получения имени пк, тоесть getComputerName. Значит смысла трогать ее нет. У нас осталась либо первый либо второй, мы можем пропатчить обе, мы ничего не потеряем, просто с выходои скрипта выключится и негативный принт. Давайте всеже найдем нужный вызов, смотрим где расположена print - чуть выше чем строки (my pc name... и тд) которые в самом принте , у нас в нем же и вызывается функция getComputerName, и уже после принта вызывается наша quit_script(). Значит 3 CALL - наш. Как-то так нужно мыслить, чтобы искать нужные опкоды.Берем оффсет -> в поиск хекседита (не забываем про 0x) -> перекидывает на байт.Раз мы уже нашли ее, давайте выключать
Заменяем 4 байта на 54 00 00 80 (прыжок в никуда)
https://t.me/+dumSNYnT4nw2Nzhi
Как видим, ошибки, что закрывала скрипт, уже нет.
Финал
Также этим прыжком "в никуда" мы можем выключать любой опкод, тоесть "стирать его", но нужно понимать, что вы можете навредить скрипту и он перестанет запускаться вовсе. Поэтому будьте аккуратны.Данный гайд подходит к концу. Тема следующего гайда - хуки.