Всем привет,
Сегодня я собираюсь написать сообщение в блоге о экстремально запутанном 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. Он включает в себя программное изменение байт-кода программы во время выполнения, до или во время ее выполнения. Это позволяет разработчикам добавлять, удалять или изменять инструкции в скомпилированном коде, что может быть полезно для различных целей.
Спасибо за чтение моего блога. Увидимся!!
Ахмет | Исследователь безопасности