用于 JNI 的 Java .class 到 .cpp 转换器
目前仅完全支持 Java 8。Java 9+ 和 Android 支持完全处于实验阶段
警告:建议使用黑名单/白名单,因为此工具会显着减慢代码速度(例如不要混淆完整的 Minecraft .jar)
此外,该工具不会特别混淆您的代码;它只是将其转换为原生的。请记住使用 VMProtect、Themida 或 obfuscator-llvm 等保护器(以防使用 clang)
JDK 8
对于 Windows:
我建议下载 Oracle JDK 8,尽管您需要在 Oracle 上拥有一些登录凭据。
对于 Linux/MacOS:
谷歌“your distro install jdk 8”,并安装所需的软件包
CMake
对于 Windows:
从 CMake 下载最新版本
对于 Linux/MacOS:
谷歌“your distro install cmake”并安装所需的包(默认 - apt/yum/brew install cmake
)
C++/C 编译器工具链
对于 Windows:
从 Microsoft 下载 MSVS 的免费版本,并在选项中选择 Visual C++ 编译器
或者如果您有这方面的经验,请安装 mingw。
对于 Linux/MacOS:
谷歌“你的发行版安装 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
到该工具将在stdout
中打印的 .jar 文件的目录(默认为native0/
或自定义,如果--custom-lib-dir
存在)
java -jar native-obfuscator.jar <input jar> <output directory>
转译代码cmake .
在结果cpp
目录中cmake --build . --config Release
--config 在结果cpp
目录下cmake --build . --config Release
以构建.so/.dll文件build/libs/
复制到上一段指定的路径。java -jar <output jar>
并享受吧!gradlew assemble
强制 gradle 在构建后不运行测试您需要将 Krakatau 安装到您的 PATH 中,因为测试套件使用krak2
进行某些测试
gradlew build
来组装并运行完整的测试套件该工具使用 huzpsb/JavaObfuscatorTest 的测试
如有任何问题,请随时提出问题或通过 re146.dev 与我联系