ตัวแปลง Java .class เป็น .cpp สำหรับใช้กับ JNI
ขณะนี้รองรับเฉพาะ Java 8 อย่างเต็มรูปแบบเท่านั้น การรองรับ Java 9+ และ Android นั้นเป็นการทดลองทั้งหมด
คำเตือน: แนะนำให้ใช้บัญชีดำ/บัญชีขาว เนื่องจากเครื่องมือนี้จะทำให้โค้ดช้าลงอย่างมาก (เช่น อย่าทำให้ Minecraft .jar สับสน)
นอกจากนี้ เครื่องมือนี้ไม่ได้ทำให้โค้ดของคุณซับซ้อนมากนัก มันแค่แปลงเป็นภาษาพื้นเมือง อย่าลืมใช้ตัวป้องกันเช่น VMProtect, Themida หรือ obfuscator-llvm (ในกรณีที่มีการใช้งานเสียงดังกราว)
เจดีเค 8
สำหรับวินโดวส์:
ฉันแนะนำให้ดาวน์โหลด Oracle JDK 8 แม้ว่าคุณจะต้องมีข้อมูลรับรองการเข้าสู่ระบบบน Oracle ก็ตาม
สำหรับลินุกซ์/MacOS:
Google "your distro install jdk 8" และติดตั้งแพ็คเกจที่จำเป็น
ซีเมค
สำหรับวินโดวส์:
ดาวน์โหลดรุ่นล่าสุดจาก CMake
สำหรับลินุกซ์/MacOS:
Google "your distro install cmake" และติดตั้งแพ็คเกจที่จำเป็น (ค่าเริ่มต้น - apt/yum/brew install cmake
)
ชุดเครื่องมือคอมไพเลอร์ C++/C
สำหรับวินโดวส์:
ดาวน์โหลด MSVS เวอร์ชันฟรีแวร์จาก Microsoft และเลือกคอมไพเลอร์ Visual C++ ในการเลือกใช้
หรือติดตั้ง mingw หากคุณมีประสบการณ์เกี่ยวกับเรื่องนี้
สำหรับลินุกซ์/MacOS:
Google "การติดตั้ง distro ของคุณ 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++/new .jar
-l <librariesDirectory>
- ไดเร็กทอรีที่ไลบรารีที่ต้องพึ่งพาควรเป็นทางเลือก แต่จะดีกว่า
-p <platform>
- แพลตฟอร์ม JVM เพื่อรันไลบรารี
มีสามตัวเลือกให้เลือก:
hotspot
: จะใช้ HotSpot JVM ภายในและควรทำงานร่วมกับ obfuscators ส่วนใหญ่ (แม้ว่าจะมีการตรวจสอบการติดตามสแต็กด้วย)std_java
: จะใช้เฉพาะ JVM ภายในรองที่ต้องพร้อมใช้งานบน JVM ทั้งหมดandroid
: ใช้วิธีนี้เมื่อสร้างไลบรารี่สำหรับ Android จะไม่ใช้ JVM ภายใน เช่นเดียวกับไม่มี DefineClass สำหรับวิธีการที่ซ่อนอยู่ (obfuscators ที่ใช้สแต็กสำหรับสตริง/ชื่อ obfuscator จะไม่ทำงานเนื่องจากข้อเท็จจริงที่ว่าบางวิธีจะไม่ถูกซ่อน) -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
ใช้ชื่อภายในของคลาสและตัวอธิบายวิธีการสำหรับการกรอง (คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้โดย googling "ชื่อคลาสภายใน 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-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 ไม่ให้รันการทดสอบหลังจาก build คุณต้องติดตั้ง Krakatau ใน PATH ของคุณ เนื่องจากชุดทดสอบใช้ krak2
สำหรับการทดสอบบางอย่าง
gradlew build
เพื่อประกอบและรันชุดทดสอบแบบเต็มเครื่องมือนี้ใช้การทดสอบจาก huzpsb/JavaObfuscatorTest
ในกรณีที่มีปัญหาใด ๆ โปรดเปิดปัญหาหรือติดต่อฉันที่ re146.dev