Конвертер Java .class в .cpp для использования с JNI
В настоящее время полностью поддерживается только Java 8. Поддержка Java 9+ и Android является полностью экспериментальной.
Предупреждение: рекомендуется использовать черный/белый список, поскольку этот инструмент значительно замедляет код (например, не запутывает полный .jar Minecraft).
Кроме того, этот инструмент не особо запутывает ваш код; он просто переносит его на родной язык. Не забудьте использовать защитные средства, такие как VMProtect, Themida или obfuscator-llvm (в случае использования clang).
JDK 8
Для Windows:
Я рекомендую загрузить Oracle JDK 8, хотя вам потребуются некоторые учетные данные для входа в Oracle.
Для Linux/MacOS:
Погуглите «ваш дистрибутив, установите jdk 8» и установите необходимые пакеты.
CMake
Для Windows:
Загрузите последнюю версию с CMake.
Для Linux/MacOS:
Загуглите «ваш дистрибутив, установите cmake» и установите необходимый пакет (по умолчанию — apt/yum/brew install cmake
)
Набор инструментов компилятора C++/C
Для Windows:
Загрузите бесплатную версию MSVS от Microsoft и выберите компилятор Visual C++ в настройках подписки.
Или установите mingw, если у вас есть опыт в этом.
Для Linux/MacOS:
Google «ваш дистрибутив установите g++»
Usage: native-obfuscator [-ahV] [--debug] [-b=<blackListFile>]
[--custom-lib-dir=<customLibraryDirectory>]
[-l=<librariesDirectory>] [-p=<platform>]
[--plain-lib-name=<libraryName>] [-w=<whiteListFile>]
<jarFile> <outputDirectory>
Transpiles .jar file into .cpp files and generates output .jar file
<jarFile> Jar file to transpile
<outputDirectory> Output directory
-a, --annotations Use annotations to ignore/include native obfuscation
-b, --black-list=<blackListFile>
File with a list of blacklist classes/methods for
transpilation
--custom-lib-dir=<customLibraryDirectory>
Custom library directory for LoaderUnpack
--debug Enable generation of debug .jar file (non-executable)
-h, --help Show this help message and exit.
-l, --libraries=<librariesDirectory>
Directory for dependent libraries
-p, --platform=<platform>
Target platform: hotspot - standard standalone
HotSpot JRE, std_java - java standard, android -
for Android builds (w/o DefineClass)
--plain-lib-name=<libraryName>
Plain library name for LoaderPlain
-V, --version Print version information and exit.
-w, --white-list=<whiteListFile>
File with a list of whitelist classes/methods for
transpilation
<jarFile>
— входной файл .jar для запутывания.
<outputDirectory>
— выходной каталог, в котором будет создан C++/новый файл .jar.
-l <librariesDirectory>
— каталог, в котором должны находиться зависимые библиотеки, необязательно, но желательно.
-p <platform>
— платформа JVM для запуска библиотеки.
Доступны три варианта:
hotspot
: будет использовать внутренние компоненты HotSpot JVM и должен работать с большинством обфускаторов (даже с проверкой трассировки стека)std_java
: будет использовать только второстепенные внутренние компоненты JVM, которые должны быть доступны на всех JVM.android
: используйте этот метод при создании библиотеки для Android. Не будет использовать внутренние компоненты JVM, а также DefineClass для скрытых методов (обфускаторы, использующие стек для обфускатора строк/имен, не будут работать из-за того, что некоторые методы не будут скрыты). -a
— включить обработку аннотаций
Чтобы использовать аннотации для методов/классов черного/белого списка как native
вы можете добавить в свой проект следующую библиотеку:
com.github.radioegor146.native-obfuscator:annotations:master-SNAPSHOT
Также вам необходимо добавить JitPack в свои репозитории.
Вы можете добавить аннотацию @Native
, чтобы включить классы/методы в собственный процесс обфускации, и добавить аннотацию @NotNative
, чтобы игнорировать методы в классах, помеченных как @Native
Белый/черный список имеет более высокий приоритет, чем аннотации.
-w <whiteList>
— путь к файлу .txt для белого списка методов и классов, если требуется.
-b <blackList>
— путь к txt-файлу черного списка методов и классов, если требуется.
Оба они должны прийти в таком виде:
<class>
<class>#<method name>#<method descriptor>
mypackage/myotherpackage/Class1
mypackage/myotherpackage/Class1#doSomething!()V
mypackage/myotherpackage/Class1$SubClass#doOther!(I)V
Он использует внутренние имена классов и дескрипторы методов для фильтрации (подробнее об этом можно прочитать, погуглив «имена внутренних классов Java» или «дескрипторы методов Java»).
Кроме того, вы можете использовать сопоставление подстановочных знаков, например:
mypackage/myotherpackage/*
mypackage/myotherpackagewithnested/**
mypackage/myotherpackage/*/Class1
mypackage/myotherpackagewithnested/**/Class1
mypackage/myotherpackage/Class*
*
соответствует одной записи (разделенной /
) в имени класса/пакета
**
соответствует всем записям в имени класса/пакета
--plain-lib-name
— если вы отправляете свой .jar отдельно от полученных собственных библиотек или используете его для Android, вы можете указать имя собственной библиотеки, которую он будет пытаться найти во время использования.
--custom-lib-dir
— если вы хотите установить собственный каталог для хранения библиотек внутри jar
Если вы хотите отправить свой .jar с собственными библиотеками, вам следует опустить этот аргумент и после создания собственных файлов добавить их в виде
x64-windows.dll
x64-linux.so
x86-windows.dll
x64-macos.dylib
arm64-linux.so
arm64-windows.dll
в каталог файла .jar, который этот инструмент будет печатать в stdout
(по умолчанию native0/
или custom, если присутствует --custom-lib-dir
)
java -jar native-obfuscator.jar <input jar> <output directory>
cmake .
в каталоге результатов cpp
cmake --build . --config Release
каталог результатов cpp
для создания файла .so/.dllbuild/libs/
в путь, указанный в предыдущем абзаце.java -jar <output jar>
и наслаждайтесь!gradlew assemble
чтобы заставить gradle не запускать тесты после сборки. Вам необходимо установить Krakatau в ваш PATH, поскольку набор тестов использует krak2
для некоторых тестов.
gradlew build
, чтобы собрать и запустить полный набор тестов.Этот инструмент использует тесты из huzpsb/JavaObfuscatorTest.
В случае возникновения каких-либо проблем, не стесняйтесь открыть вопрос или свяжитесь со мной по адресу re146.dev.