Conversor Java .class para .cpp para uso com JNI
Atualmente suporta totalmente apenas Java 8. O suporte a Java 9+ e Android é totalmente experimental
Aviso: o uso da lista negra/lista branca é recomendado porque esta ferramenta retarda significativamente o código (como não ofuscar o .jar completo do Minecraft)
Além disso, esta ferramenta não ofusca particularmente o seu código; apenas transpila para o nativo. Lembre-se de usar protetores como VMProtect, Themida ou obfuscator-llvm (em caso de uso de clang)
JDK8
Para Windows:
Eu recomendo baixar o Oracle JDK 8, embora você precise ter algumas credenciais de login no Oracle.
Para Linux/MacOS:
Google "sua distribuição, instale o jdk 8" e instale os pacotes necessários
CMake
Para Windows:
Baixe a versão mais recente do CMake
Para Linux/MacOS:
Google "your distro install cmake" e instale o pacote necessário (padrão - apt/yum/brew install cmake
)
Conjunto de ferramentas do compilador C++/C
Para Windows:
Baixe a versão freeware do MSVS da Microsoft e selecione o compilador Visual C++ em opt-ins
Ou instale o mingw se você tiver alguma experiência com isso.
Para Linux/MacOS:
Google "sua distribuição instala 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>
- insira o arquivo .jar para ofuscar
<outputDirectory>
- diretório de saída onde o arquivo C++/novo .jar será criado
-l <librariesDirectory>
- diretório onde as bibliotecas dependentes devem estar, opcional, mas preferível
-p <platform>
- plataforma JVM para executar a biblioteca
Três opções estão disponíveis:
hotspot
: usará componentes internos do HotSpot JVM e deverá funcionar com a maioria dos ofuscadores (mesmo com verificação de rastreamento de pilha também)std_java
: usará apenas componentes internos menores da JVM que devem estar disponíveis em todas as JVMsandroid
: use este método ao construir uma biblioteca para Android. Não usará componentes internos da JVM, bem como nenhum DefineClass para métodos ocultos (ofuscadores que dependem da pilha para ofuscador de string/nome não funcionarão devido ao fato de que alguns métodos não estarão ocultos) -a
- habilita o processamento de anotações
Para usar anotações para métodos/classes de lista negra/de permissão como native
você pode adicionar a seguinte biblioteca ao seu projeto:
com.github.radioegor146.native-obfuscator:annotations:master-SNAPSHOT
Além disso, você precisa adicionar o JitPack aos seus repositórios.
Você pode adicionar a anotação @Native
para incluir classes/métodos no processo de ofuscação nativo e adicionar a anotação @NotNative
para ignorar métodos em classes marcadas como @Native
A lista branca/lista negra tem maior prioridade do que as anotações.
-w <whiteList>
- caminho para o arquivo .txt para lista branca de métodos e classes, se necessário
-b <blackList>
- caminho para um arquivo .txt para uma lista negra de métodos e classes, se necessário
Ambos devem vir da seguinte forma:
<class>
<class>#<method name>#<method descriptor>
mypackage/myotherpackage/Class1
mypackage/myotherpackage/Class1#doSomething!()V
mypackage/myotherpackage/Class1$SubClass#doOther!(I)V
Ele usa nomes internos de classes e descritores de métodos para filtragem (você pode ler mais sobre isso pesquisando no Google "nomes de classes internas Java" ou "descritores de métodos Java")
Além disso, você pode usar um correspondente curinga como este:
mypackage/myotherpackage/*
mypackage/myotherpackagewithnested/**
mypackage/myotherpackage/*/Class1
mypackage/myotherpackagewithnested/**/Class1
mypackage/myotherpackage/Class*
*
corresponde a uma única entrada (dividida por /
) no nome da classe/pacote
**
corresponde a todas as entradas no nome da classe/pacote
--plain-lib-name
- se você enviar seu .jar separadamente das bibliotecas nativas resultantes ou usá-lo para Android, poderá especificar o nome da biblioteca nativa que ele tentará pesquisar enquanto estiver usando.
--custom-lib-dir
- se você deseja definir um diretório personalizado para armazenar bibliotecas dentro do jar
Se você deseja enviar seu .jar com bibliotecas nativas, você deve omitir esse argumento e, após construir os arquivos nativos, adicioná-los na forma de
x64-windows.dll
x64-linux.so
x86-windows.dll
x64-macos.dylib
arm64-linux.so
arm64-windows.dll
para o diretório do arquivo .jar que esta ferramenta imprimirá em stdout
(por padrão native0/
ou custom se --custom-lib-dir
estiver presente)
java -jar native-obfuscator.jar <input jar> <output directory>
cmake .
no diretório cpp
de resultadoscmake --build . --config Release
no diretório cpp
de resultados para construir o arquivo .so/.dllbuild/libs/
para o caminho especificado no parágrafo anterior.java -jar <output jar>
criado e divirta-se!gradlew assemble
para forçar o gradle a não executar testes após a compilação Você precisa ter o Krakatau instalado em seu PATH, porque o conjunto de testes está usando krak2
para alguns testes
gradlew build
para montar e executar o conjunto de testes completoEsta ferramenta usa testes de huzpsb/JavaObfuscatorTest
Em caso de qualquer problema, sinta-se à vontade para abrir um problema ou entrar em contato comigo em re146.dev