Всем привет,

Сегодня я собираюсь написать сообщение в блоге о экстремально запутанном Java-коде, в котором нам нужно деобфусцировать код, чтобы раскрыть пароль. Чтобы понять эту публикацию в блоге, вам необходимо разбираться в байт-коде Java. Прежде чем углубляться в этот контент, я предлагаю вам взглянуть на: https://en.wikipedia.org/wiki/List_of_Java_bytecode_instructions

Совет: Это соответствует заключительному уровню моего предыдущего блога по реверс-инжинирингу Java, который я подробно описал.

Пожалуйста, посмотрите: «JVM | Обратный инжиниринг. Привет всем, | Ахмет Гёкер | июль 2023 г. | Середина"

Если вы готовы, давайте углубимся в это.

Анализ файла

Прежде всего, всегда рекомендуется проанализировать файл перед его реверсированием.

Как видите, этот файл имеет формат «jar». Возможно, было бы полезно использовать инструмент jd-gui → инструмент реверса Java.

Это странно; мы видим, что мне показались классы 0,1, c, но как насчет странного файла?

Было бы здорово разархивировать файл, чтобы увидеть более подробно:

В /META-INF мы можем увидеть, какой файл класса является основным. Main-Class: 0 — основной класс. Это у нас в кармане.

Если мы запустим «java — jar», мы сможем выполнить этот файл .jar. Как видите, требуется пароль. Если мы введем неправильный пароль, мне будет показано «Пожалуйста, укажите пароль».

Вопрос должен быть таким: «Можем ли мы найти какой-либо файл в файле .jar», можем ли мы использовать binwalk для правильного анализа файла. Я попробую использовать binwalk, чтобы извлечь некоторые известные скрытые файлы.

Хм интересно! У нас есть извлеченная версия BasicstringObfuscation.

Вала! Об известных классах мы уже знаем, а как насчет «4F.zip»?

позвольте мне показать классы соответственно

Как я упоминал ранее, я уже обсуждал эти коды в своем предыдущем блоге. Вы можете выполнить ту же процедуру, что описана в предыдущем блоге: использовать `disassemble.py` Krakatau для получения байт-кода, внести изменения в байт-код, а затем использовать `assemble.py` для компиляции его в файл JAR.

Мы должны получить формат файла .j, который представляет собой байт-код, в котором я использую метод манипуляции.

Как видите, инструкции GOTO были добавлены во многих местах.

Я не буду здесь подробно углубляться в код, так как подробно рассмотрел его в своей предыдущей статье. Ход и код остаются неизменными; наше внимание должно быть сосредоточено на выявлении таких терминов, как «неправильный», «пожалуйста, укажите пароль» и так далее.

Как вы знаете, Invokevirtual будет использоваться для операций ввода и вывода, поэтому этот байт-код может предоставить нам «предоставленную строку», например «Пожалуйста, укажите пароль».

Было 5 байт-кодов Invokevirtual, но 3 из них были одинаковыми → InvokeVirtual [97].

Почему 3 InvokeVirtual[97]? 1. Пожалуйста, укажите пароль; 2. Неверно; 3. Нам следует дать правильный ответ.

InvokeVirtual[97] → Println();

Это похоже на головоломку. Теперь я собираюсь манипулировать байт-кодом, чтобы извлечь строку, встроенную в этот код.

Поэкспериментировав, я пришел к решению:

4, 42 — это место, где выводится сообщение «Пожалуйста, укажите пароль», и мы изменяем его на 1, 77, которое выводит правильный пароль!

Чтобы собрать файлы .j, мы можем использовать приведенную выше команду.

Java -cp — это параметр виртуальной машины Java или компилятора Java, который указывает расположение классов и пакетов. определяется пользователем.

мы знаем, что этот код фиксируется «WpUtETnF1JGrDkSsTd5G1w2dN0h», нам нужно найти способ взломать пароль.

Мы обнаружили, что (1, 77) — это строка, поэтому задача состоит в том, чтобы найти место ее разрыва! Нам просто нужно следовать кодексу.

Хорошо, вот трюк, который нам нужно найти в c.class, где строка будет исправлена. Как только мы его найдем, мы сможем заменить его при выполнении программы.

Найдя решение, я понял, что Invokestatic [76] соответствует методу XOR, который может предоставить точную строку.

вызывает статический метод и помещает результат в стек (может быть пустым); метод идентифицируется по индексу ссылки на метод в пуле констант (indexbyte1 ‹‹ 8 | indexbyte2)

Весь код:

После сборки кода:

Заключение

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

Как я уже сказал: манипулирование байт-кодом — это метод, используемый при разработке программного обеспечения, особенно в контексте языков, компилируемых в байт-код, таких как Java и Kotlin. Он включает в себя программное изменение байт-кода программы во время выполнения, до или во время ее выполнения. Это позволяет разработчикам добавлять, удалять или изменять инструкции в скомпилированном коде, что может быть полезно для различных целей.

Спасибо за чтение моего блога. Увидимся!!

Ахмет | Исследователь безопасности