From 36219151cfbefc853ff81ea954dd3cdb2ddae719 Mon Sep 17 00:00:00 2001 From: mac Date: Tue, 23 Jul 2024 11:07:26 +0800 Subject: [PATCH 1/3] =?UTF-8?q?1=E3=80=81JVMTI=E8=A7=A3=E5=AF=86=E5=85=BC?= =?UTF-8?q?=E5=AE=B9Windows=2032=E4=BD=8D=202=E3=80=81JVMTI=E5=8A=A0?= =?UTF-8?q?=E8=A7=A3=E5=AF=86=E5=85=BC=E5=AE=B9MacoS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- native/CMakeLists.txt | 85 +++++++++++++++++++ native/start_windows.c | 4 +- .../me/n1ar4/jar/obfuscator/core/Runner.java | 10 +-- .../n1ar4/jar/obfuscator/jvmti/Constants.java | 5 +- .../jar/obfuscator/jvmti/ExportCommand.java | 5 ++ .../jar/obfuscator/jvmti/PatchCommand.java | 3 + .../n1ar4/jar/obfuscator/utils/JNIUtil.java | 6 +- 7 files changed, 107 insertions(+), 11 deletions(-) diff --git a/native/CMakeLists.txt b/native/CMakeLists.txt index cd62018..81bcb0f 100644 --- a/native/CMakeLists.txt +++ b/native/CMakeLists.txt @@ -105,6 +105,91 @@ if (WIN32) PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/native_encrypt_asm.obj ) +elseif (APPLE) + MESSAGE("BUILD APPLE") + + enable_language(ASM_NASM) + + add_custom_target( + native_encrypt_asm ALL + COMMAND nasm -f macho64 ${CMAKE_CURRENT_SOURCE_DIR}/encrypt_linux.asm + -o ${CMAKE_CURRENT_BINARY_DIR}/encrypt_linux.obj + BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/encrypt_linux.obj + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) + + add_custom_target( + native_decrypt_asm ALL + COMMAND nasm -f macho64 ${CMAKE_CURRENT_SOURCE_DIR}/decrypt_linux.asm + -o ${CMAKE_CURRENT_BINARY_DIR}/decrypt_linux.obj + BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/decrypt_linux.obj + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + ) + + MESSAGE("BUILD ENCRYPT DECRYPT ASM FINISH") + + add_library( + encryptor SHARED + core_en.h + jni_encryptor.h + jni_encryptor.c + + xxtea_common.c + xxtea_common.h + xxtea_en.h + xxtea_de.h + xxtea.c + ) + + add_library( + decrypter SHARED + core_de.h + start_linux.c + + xxtea_common.c + xxtea_common.h + xxtea_en.h + xxtea_de.h + xxtea.c + ) + + add_dependencies(encryptor native_encrypt_asm) + + add_dependencies(decrypter native_decrypt_asm) + + target_link_libraries(encryptor + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/encrypt_linux.obj + ) + + target_link_libraries(decrypter + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/decrypt_linux.obj + ) + + add_executable( + xxtea_test + xxtea_common.h + xxtea_common.c + xxtea_en.h + xxtea_de.h + xxtea.c + xxtea_test.c + ) + + add_executable( + decrypt_test + core_de.h + core_en.h + decrypt_test.c + ) + + target_link_libraries(decrypt_test + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/decrypt_linux.obj + ) + + target_link_libraries(decrypt_test + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/encrypt_linux.obj + ) + else () MESSAGE("BUILD LINUX") diff --git a/native/start_windows.c b/native/start_windows.c index 5050a7e..1df5f8a 100644 --- a/native/start_windows.c +++ b/native/start_windows.c @@ -187,11 +187,11 @@ JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved) { } // SET PACKAGE_NAME - PACKAGE_NAME = (char *) malloc(strlen((char *) v1)); + PACKAGE_NAME = (char *) malloc(strlen((char *) v1) + 1); strcpy(PACKAGE_NAME, (char *) v1); // SET KEY - KEY = (unsigned char *) malloc(16); + KEY = (unsigned char *) malloc(strlen((char *) v2) + 1); strcpy((char *) KEY, (char *) v2); jvmtiEnv *jvmti; diff --git a/src/main/java/me/n1ar4/jar/obfuscator/core/Runner.java b/src/main/java/me/n1ar4/jar/obfuscator/core/Runner.java index 8642e56..1ebe695 100644 --- a/src/main/java/me/n1ar4/jar/obfuscator/core/Runner.java +++ b/src/main/java/me/n1ar4/jar/obfuscator/core/Runner.java @@ -377,11 +377,11 @@ public static void run(Path path, BaseConfig config) { } if (config.isEnableSuperObfuscate()) { - // 不支持 MAC 系统 - if (OSUtil.isMac()) { - logger.error("mac os not support super obfuscate"); - return; - } +// // 不支持 MAC 系统 +// if (OSUtil.isMac()) { +// logger.error("mac os not support super obfuscate"); +// return; +// } // 检查 JAVA 8 环境 if (!VerUtil.isJava8()) { diff --git a/src/main/java/me/n1ar4/jar/obfuscator/jvmti/Constants.java b/src/main/java/me/n1ar4/jar/obfuscator/jvmti/Constants.java index 7ae7dbc..eb156b1 100644 --- a/src/main/java/me/n1ar4/jar/obfuscator/jvmti/Constants.java +++ b/src/main/java/me/n1ar4/jar/obfuscator/jvmti/Constants.java @@ -5,14 +5,17 @@ */ @SuppressWarnings("all") public interface Constants { - String DecrypterDLL = "libdecrypter.dll"; + String DecrypterDLL = "libdecrypter.dll"; String DecrypterSo = "libdecrypter.so"; + String DecrypterDylib = "libdecrypter.dylib"; String EncryptorDLL = "libencryptor.dll"; String EncryptorSO = "libencryptor.so"; + String EncryptorDylib = "libencryptor.dylib"; String TempDir = "code-encryptor-temp"; String NewFileSuffix = "encrypted"; String DllFile = ".dll"; String SOFile = ".so"; + String DylibFile = ".dylib"; String ClassFile = ".class"; String WindowsOS = "windows"; Integer BufSize = 16384; diff --git a/src/main/java/me/n1ar4/jar/obfuscator/jvmti/ExportCommand.java b/src/main/java/me/n1ar4/jar/obfuscator/jvmti/ExportCommand.java index 2c81a33..401555e 100644 --- a/src/main/java/me/n1ar4/jar/obfuscator/jvmti/ExportCommand.java +++ b/src/main/java/me/n1ar4/jar/obfuscator/jvmti/ExportCommand.java @@ -30,6 +30,11 @@ public void execute() { System.out.println("----------- ADD VM OPTIONS (WINDOWS) -----------"); System.out.println("java -XX:+DisableAttachMechanism " + "-agentpath:/path/to/libdecrypter.dll=PACKAGE_NAME=xxx,KEY=YOUR-KEY [other-params]"); + } else if (OSUtil.isMac()) { + JNIUtil.extractDllSo(DecrypterDylib, outputPath, false); + System.out.println("----------- ADD VM OPTIONS (MacOS) -----------"); + System.out.println("java -XX:+DisableAttachMechanism " + + "-agentpath:/path/to/libdecrypter.dylib=PACKAGE_NAME=xxx,KEY=YOUR-KEY [other-params]"); } else { JNIUtil.extractDllSo(DecrypterSo, outputPath, false); System.out.println("----------- ADD VM OPTIONS (LINUX) -----------"); diff --git a/src/main/java/me/n1ar4/jar/obfuscator/jvmti/PatchCommand.java b/src/main/java/me/n1ar4/jar/obfuscator/jvmti/PatchCommand.java index f65eb5b..b9ea4d9 100644 --- a/src/main/java/me/n1ar4/jar/obfuscator/jvmti/PatchCommand.java +++ b/src/main/java/me/n1ar4/jar/obfuscator/jvmti/PatchCommand.java @@ -58,6 +58,9 @@ public void execute() { if (OSUtil.isWin()) { JNIUtil.extractDllSo(EncryptorDLL, null, false); libPath = tmp.resolve(EncryptorDLL); + } else if (OSUtil.isMac()) { + JNIUtil.extractDllSo(EncryptorDylib, null, false); + libPath = tmp.resolve(EncryptorDylib); } else { JNIUtil.extractDllSo(EncryptorSO, null, false); libPath = tmp.resolve(EncryptorSO); diff --git a/src/main/java/me/n1ar4/jar/obfuscator/utils/JNIUtil.java b/src/main/java/me/n1ar4/jar/obfuscator/utils/JNIUtil.java index 9c2a0f7..d36d681 100644 --- a/src/main/java/me/n1ar4/jar/obfuscator/utils/JNIUtil.java +++ b/src/main/java/me/n1ar4/jar/obfuscator/utils/JNIUtil.java @@ -78,11 +78,11 @@ public static boolean loadLib(String path) { } } else { String so = p.toFile().getAbsolutePath(); - if (!so.endsWith(SOFile)) { - logger.debug("must be a so file"); + if (!(so.endsWith(SOFile) || so.endsWith(DylibFile))) { + logger.debug("must be a so/dylib file"); return false; } - String outputName = p.toFile().getName().split("\\.so")[0].trim(); + String outputName = p.toFile().getName().split("\\.so")[0].split("\\.dylib")[0].trim(); logger.debug("load library: " + outputName); System.load(so); } From 76d75c70aaa9d2dc013855c5ae2b5b80e150985f Mon Sep 17 00:00:00 2001 From: pcdlrzxx <393418969@qq.com> Date: Tue, 23 Jul 2024 11:19:36 +0800 Subject: [PATCH 2/3] =?UTF-8?q?1=E3=80=81JVMTI=E8=A7=A3=E5=AF=86=E5=85=BC?= =?UTF-8?q?=E5=AE=B9Windows=2032=E4=BD=8D=202=E3=80=81JVMTI=E5=8A=A0?= =?UTF-8?q?=E8=A7=A3=E5=AF=86=E5=85=BC=E5=AE=B9MacOS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- native/CMakeLists_for_decrypt_win32_x86.txt | 70 +++++ native/decrypt_macos.asm | 67 +++++ native/decrypt_windows_x86.asm | 54 ++++ native/encrypt_macos.asm | 75 ++++++ native/start_macos.c | 276 ++++++++++++++++++++ src/main/resources/libdecrypter.dylib | Bin 0 -> 18104 bytes src/main/resources/libdecrypter_x86.dll | Bin 0 -> 12288 bytes src/main/resources/libencryptor.dylib | Bin 0 -> 13088 bytes 8 files changed, 542 insertions(+) create mode 100644 native/CMakeLists_for_decrypt_win32_x86.txt create mode 100644 native/decrypt_macos.asm create mode 100644 native/decrypt_windows_x86.asm create mode 100644 native/encrypt_macos.asm create mode 100644 native/start_macos.c create mode 100644 src/main/resources/libdecrypter.dylib create mode 100644 src/main/resources/libdecrypter_x86.dll create mode 100644 src/main/resources/libencryptor.dylib diff --git a/native/CMakeLists_for_decrypt_win32_x86.txt b/native/CMakeLists_for_decrypt_win32_x86.txt new file mode 100644 index 0000000..ae37975 --- /dev/null +++ b/native/CMakeLists_for_decrypt_win32_x86.txt @@ -0,0 +1,70 @@ +cmake_minimum_required(VERSION 3.25) + +################ JNI CONFIG START ################ + +project(native C) + +set(CMAKE_C_STANDARD 11) + +# INCLUDE JNI + +find_package(JNI REQUIRED) + +include_directories(${JNI_INCLUDE_DIRS}) + +################ JNI CONFIG END ################## + +MESSAGE("BUILD WINDOWS") + +enable_language(ASM_MASM) + +add_custom_target( + native_decrypt_asm ALL + COMMAND ml /c /Fo${CMAKE_CURRENT_BINARY_DIR}/native_decrypt_asm.obj + ${CMAKE_CURRENT_SOURCE_DIR}/decrypt_windows.asm + BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/native_decrypt_asm.obj + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +) + +add_library( + decrypter SHARED + core_de.h + start_windows.c + + xxtea_common.c + xxtea_common.h + xxtea_en.h + xxtea_de.h + xxtea.c +) + +set_property(TARGET native_decrypt_asm PROPERTY + MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>" +) + +add_dependencies(decrypter native_decrypt_asm) + +target_link_libraries(decrypter + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/native_decrypt_asm.obj +) + +add_executable( + xxtea_test + xxtea_common.h + xxtea_common.c + xxtea_en.h + xxtea_de.h + xxtea.c + xxtea_test.c +) + +add_executable( + decrypt_test + core_de.h + core_en.h + decrypt_test.c +) + +target_link_libraries(decrypt_test + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/native_decrypt_asm.obj +) \ No newline at end of file diff --git a/native/decrypt_macos.asm b/native/decrypt_macos.asm new file mode 100644 index 0000000..9e47417 --- /dev/null +++ b/native/decrypt_macos.asm @@ -0,0 +1,67 @@ +section .text +global _decrypt + +_decrypt: + ; init + push rbp + mov rbp, rsp + ; save + push rax + push rbx + push rcx + push rdx + push rsi + push rdi + ; char* str -> rdi + mov rdi, rdi + ; long length -> rsi + mov rsi, rsi + mov rcx, rsi + ; rbx = 0 + xor rbx, rbx + ; rbx = rbx + 4 + add rbx, 004h + ; signature + mov rsi, rcx + sub rsi, 001h + mov al, byte [rdi+rsi] + mov ah, byte [rdi+004h] + mov byte [rdi+004h], al + mov byte [rdi+rsi], ah + ; reset + xor ah, ah + xor al, al + xor rsi, rsi +link_start: + ; if ebx >= ecx goto end + cmp rbx, rcx + jge magic + ; al = str[rdi+rbx] + mov al, byte [rdi+rbx] + ; al = al ^ 22 + xor al, 022h + ; al = al -1 + sub al, 001h + ; al = ~al + not al + ; al = al ^ 11h + xor al, 011h + ; al = al + 2 + add al, 002h + ; str[rdi+rbx] = al + mov byte [rdi+rbx], al + ; ebx ++ + inc ebx + ; loop + jmp link_start +magic: + ; recover + pop rdi + pop rsi + pop rdx + pop rcx + pop rbx + pop rax + ; recover rbp + pop rbp + ret diff --git a/native/decrypt_windows_x86.asm b/native/decrypt_windows_x86.asm new file mode 100644 index 0000000..78e316c --- /dev/null +++ b/native/decrypt_windows_x86.asm @@ -0,0 +1,54 @@ +.386 +.model flat, c +option casemap:none + +.code + +; FUNCTION decrypt +decrypt PROC USES edi esi ebx, pStr:DWORD, strLength:DWORD + ; char* str + mov edi, pStr + ; long length + mov ecx, strLength + ; ebx = 0 + xor ebx, ebx + ; ebx = ebx + 4 + add ebx, 004h + ; signature + mov esi, ecx + sub esi, 001h + mov al, byte ptr [edi+esi] + mov ah, byte ptr [edi+004h] + mov byte ptr [edi+004h], al + mov byte ptr [edi+esi], ah + ; reset + xor ah, ah + xor al, al + xor esi, esi +link_start: + ; if ebx >= ecx goto end + cmp ebx, ecx + jge magic + ; al = str[edi+ebx] + mov al, byte ptr [edi+ebx] + ; al = al ^ 22 + xor al, 022h + ; al = al -1 + sub al, 001h + ; al = ~al + not al + ; al = al ^ 11h + xor al, 011h + ; al = al + 2 + add al, 002h + ; str[edi+ebx] = al + mov byte ptr [edi+ebx], al + ; ebx ++ + inc ebx + ; loop + jmp link_start +magic: + ret +decrypt ENDP + +END \ No newline at end of file diff --git a/native/encrypt_macos.asm b/native/encrypt_macos.asm new file mode 100644 index 0000000..4af97bf --- /dev/null +++ b/native/encrypt_macos.asm @@ -0,0 +1,75 @@ +section .text +global _encrypt + +_encrypt: + ; init + push rbp + mov rbp, rsp + + push rax + push rbx + push rcx + push rdx + push rsi + push rdi + + ; char* str + mov rdi, rdi + ; long length + mov rcx, rsi + ; rbx = 0 + xor rbx, rbx +link_start: + ; if rbx >= rcx goto end + cmp rbx, rcx + jge magic + ; al = str[rdi+rbx] + mov al, byte [rdi+rbx] + ; al = al - 2 + sub al, 0x02 + ; al = al ^ 11h + xor al, 0x11 + ; al = ~al + not al + ; al = al + 1 + add al, 0x01 + ; al = al ^ 22 + xor al, 0x22 + ; str[rdi+rbx] = al + mov byte [rdi+rbx], al + ; ebx ++ + inc rbx + ; loop + jmp link_start +magic: + ; magic + mov al, 0xca + mov byte [rdi+0x00], al + mov al, 0xfe + mov byte [rdi+0x01], al + mov al, 0xba + mov byte [rdi+0x02], al + mov al, 0xbe + mov byte [rdi+0x03], al + ; signature + mov rsi, rcx + sub rsi, 0x01 + mov al, byte [rdi+rsi] + mov ah, byte [rdi+0x04] + mov byte [rdi+0x04], al + mov byte [rdi+rsi], ah + ; reset + xor ah, ah + xor al, al + xor rsi, rsi + + pop rdi + pop rsi + pop rdx + pop rcx + pop rbx + pop rax + + ; recover rbp + pop rbp + ret diff --git a/native/start_macos.c b/native/start_macos.c new file mode 100644 index 0000000..ce0105c --- /dev/null +++ b/native/start_macos.c @@ -0,0 +1,276 @@ +#include +#include +#include +#include +#include + +#include "xxtea_de.h" +#include "core_de.h" + +// PACKAGE +char *PACKAGE_NAME; +// KEY +char *KEY; + +unsigned char **split_string(const char *str, int *num_tokens, const char *sp) { + unsigned char **tokens = NULL; + char copy[100]; + char *token; + int count = 0; + + strncpy(copy, str, sizeof(copy) - 1); + copy[sizeof(copy) - 1] = '\0'; + + token = strtok(copy, sp); + while (token != NULL) { + count++; + token = strtok(NULL, sp); + } + + tokens = (unsigned char **) malloc(count * sizeof(unsigned char *)); + if (tokens == NULL) { + fprintf(stderr, "memory allocation failed\n"); + return NULL; + } + + strncpy(copy, str, sizeof(copy) - 1); + copy[sizeof(copy) - 1] = '\0'; + + token = strtok(copy, sp); + count = 0; + while (token != NULL) { + tokens[count] = (unsigned char *) malloc(strlen(token) + 1); + if (tokens[count] == NULL) { + fprintf(stderr, "memory allocation failed\n"); + for (int i = 0; i < count; i++) { + free(tokens[i]); + } + free(tokens); + return NULL; + } + strncpy((char *) tokens[count], token, strlen(token) + 1); + count++; + token = strtok(NULL, sp); + } + + *num_tokens = count; + + return tokens; +} + +void internal(unsigned char *_data, int start) { + unsigned char first[4]; + for (int i = start; i < start + 4; i++) { + first[i - start] = _data[i]; + } + unsigned char second[4]; + for (int i = start + 4; i < start + 8; i++) { + second[i - start - 4] = _data[i]; + } + uint32_t v[2] = {convert(first), convert(second)}; + + unsigned char *key_part1 = (unsigned char *) KEY; + unsigned char *key_part2 = (unsigned char *) KEY + 4; + unsigned char *key_part3 = (unsigned char *) KEY + 8; + unsigned char *key_part4 = (unsigned char *) KEY + 12; + + uint32_t const k[4] = { + (unsigned int) convert(key_part1), + (unsigned int) convert(key_part2), + (unsigned int) convert(key_part3), + (unsigned int) convert(key_part4), + }; + + tea_decrypt(v, k); + unsigned char first_arr[4]; + unsigned char second_arr[4]; + revert(v[0], first_arr); + revert(v[1], second_arr); + for (int i = start; i < start + 4; i++) { + _data[i] = first_arr[i - start]; + } + for (int i = start + 4; i < start + 8; i++) { + _data[i] = second_arr[i - start - 4]; + } +} + +// 1. tea encrypt +// 2. asm encrypt +void JNICALL ClassDecryptHook( + jvmtiEnv *jvmti_env, + JNIEnv *jni_env, + jclass class_being_redefined, + jobject loader, + const char *name, + jobject protection_domain, + jint class_data_len, + const unsigned char *class_data, + jint *new_class_data_len, + unsigned char **new_class_data) { + *new_class_data_len = class_data_len; + (*jvmti_env)->Allocate(jvmti_env, class_data_len, new_class_data); + unsigned char *_data = *new_class_data; + if (name && strncmp(name, PACKAGE_NAME, strlen(PACKAGE_NAME)) == 0) { + for (int i = 0; i < class_data_len; i++) { + _data[i] = class_data[i]; + } + + if (class_data_len < 18) { + return; + } + + DE_LOG("START DECRYPT"); + // 1. all xxtea + int total = (class_data_len - 10) / 8; + for (int i = 0; i < total; i++) { + internal(_data, 10 + i * 8); + } + + // 2. asm encrypt + decrypt((unsigned char *) _data, class_data_len); + } else { + for (int i = 0; i < class_data_len; i++) { + _data[i] = class_data[i]; + } + } +} + +JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm) { + DE_LOG("UNLOAD AGENT"); +} + +JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved) { + // REPLACE . -> / + char modified_str[256]; + size_t modified_str_size = sizeof(modified_str); + strncpy(modified_str, options, modified_str_size - 1); + modified_str[modified_str_size - 1] = '\0'; + + for (size_t i = 0; modified_str[i] != '\0'; ++i) { + if (modified_str[i] == '.') { + modified_str[i] = '/'; + } + } + + unsigned char *v1 = NULL; + unsigned char *v2 = NULL; + int num_tokens; + unsigned char **tokens = split_string(modified_str, &num_tokens, ","); + if (tokens != NULL) { + unsigned char *pack = tokens[0]; + unsigned char *key = tokens[1]; + + tokens = split_string((char *) pack, &num_tokens, "="); + if (strcmp((char *) tokens[0], "PACKAGE_NAME") == 0) { + v1 = tokens[1]; + PACKAGE_NAME = (char *) malloc(strlen((char *) v1) + 1); + strcpy(PACKAGE_NAME, (char *) v1); + } else { + printf("ERROR"); + return 0; + } + + tokens = split_string((char *) key, &num_tokens, "="); + if (strcmp((char *) tokens[0], "KEY") == 0) { + v2 = tokens[1]; + KEY = (char *) malloc(strlen((char *) v2) + 1); + strcpy(KEY, (char *) v2); + } else { + printf("ERROR"); + return 0; + } + } + + if (v1 == NULL) { + DE_LOG("NEED PACKAGE_NAME PARAMS\n"); + return 0; + } + + if (v2 == NULL) { + DE_LOG("NEED KEY PARAMS\n"); + return 0; + } + + jvmtiEnv *jvmti; + DE_LOG("INIT JVMTI ENVIRONMENT"); + jint ret = (*vm)->GetEnv(vm, (void **) &jvmti, JVMTI_VERSION); + if (JNI_OK != ret) { + printf("ERROR: Unable to access JVMTI!\n"); + printf("PLEASE USE JVM VERSION 8"); + return ret; + } + DE_LOG("INIT JVMTI CAPABILITIES"); + jvmtiCapabilities capabilities; + (void) memset(&capabilities, 0, sizeof(capabilities)); + + capabilities.can_generate_all_class_hook_events = 1; + + DE_LOG("ADD JVMTI CAPABILITIES"); + jvmtiError error = (*jvmti)->AddCapabilities(jvmti, &capabilities); + if (JVMTI_ERROR_NONE != error) { + printf("ERROR: Unable to AddCapabilities JVMTI!\n"); + return error; + } + + DE_LOG("INIT JVMTI CALLBACKS"); + jvmtiEventCallbacks callbacks; + (void) memset(&callbacks, 0, sizeof(callbacks)); + + DE_LOG("SET JVMTI CLASS FILE LOAD HOOK"); + callbacks.ClassFileLoadHook = &ClassDecryptHook; + error = (*jvmti)->SetEventCallbacks(jvmti, &callbacks, sizeof(callbacks)); + if (JVMTI_ERROR_NONE != error) { + printf("ERROR: Unable to SetEventCallbacks JVMTI!\n"); + return error; + } + DE_LOG("SET EVENT NOTIFICATION MODE"); + error = (*jvmti)->SetEventNotificationMode(jvmti, JVMTI_ENABLE, JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, NULL); + if (JVMTI_ERROR_NONE != error) { + printf("ERROR: Unable to SetEventNotificationMode JVMTI!\n"); + return error; + } + + DE_LOG("INIT JVMTI SUCCESS"); + + void *gHotSpotVMStructs; + for (uint32_t i = 0; i < _dyld_image_count(); i++) { + const char* image_name = _dyld_get_image_name(i); + if (strstr(image_name, "libjvm.dylib") != NULL) { + const struct mach_header_64* header = (const struct mach_header_64*)_dyld_get_image_header(i); + const char* image_base = (const char*)header; + const struct load_command* cmd = (const struct load_command*)(image_base + sizeof(struct mach_header_64)); + + uint64_t extraSize = 0; + + for (uint32_t j = 0; j < header->ncmds; j++) { + if (cmd->cmd == LC_SEGMENT_64) { + const struct segment_command_64 *segmentCmd = (const struct segment_command_64 *) cmd; + if (strcmp(segmentCmd->segname, SEG_DATA) == 0) { + extraSize = segmentCmd->vmsize - segmentCmd->filesize; + } + } else if (cmd->cmd == LC_SYMTAB) { + const struct symtab_command* symtab = (const struct symtab_command*)cmd; + const struct nlist_64* symbols = (const struct nlist_64*)(image_base + symtab->symoff + extraSize); + const char* strtab = image_base + symtab->stroff + extraSize; + + for (uint32_t k = 0; k < symtab->nsyms; k++) { + uint32_t strx = symbols[k].n_un.n_strx; + if (strcmp("_gHotSpotVMStructs", strtab + symbols[k].n_un.n_strx) == 0) { + if (symbols[k].n_value != 0) { + gHotSpotVMStructs = (void*)(symbols[k].n_value + _dyld_get_image_vmaddr_slide(i)); + // printf("gHotSpotVMStructs=%p\n", gHotSpotVMStructs); + *(size_t *) gHotSpotVMStructs = 0; + DE_LOG("HACK JVM FINISH"); + return JNI_OK; + } + } + } + } + cmd = (const struct load_command*)((const char*)cmd + cmd->cmdsize); + } + } + } + + printf("ERROR: HACK JVM FAILED!\n"); + return 1; +} \ No newline at end of file diff --git a/src/main/resources/libdecrypter.dylib b/src/main/resources/libdecrypter.dylib new file mode 100644 index 0000000000000000000000000000000000000000..fe426cc2d82ca7dc66b03d359ff3afee197703a4 GIT binary patch literal 18104 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/libdecrypter_x86.dll b/src/main/resources/libdecrypter_x86.dll new file mode 100644 index 0000000000000000000000000000000000000000..b61b9971a8a2f6998f18544875a55028fe4fb1ac GIT binary patch literal 12288 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 literal 0 HcmV?d00001 From 7f1807d397d64287231ba9dfc0d21f53ee2a8f5d Mon Sep 17 00:00:00 2001 From: pcdlrzxx <60462183+pcdlrzxx@users.noreply.github.com> Date: Tue, 23 Jul 2024 11:31:56 +0800 Subject: [PATCH 3/3] Update Constants.java --- src/main/java/me/n1ar4/jar/obfuscator/jvmti/Constants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/n1ar4/jar/obfuscator/jvmti/Constants.java b/src/main/java/me/n1ar4/jar/obfuscator/jvmti/Constants.java index eb156b1..3386a0f 100644 --- a/src/main/java/me/n1ar4/jar/obfuscator/jvmti/Constants.java +++ b/src/main/java/me/n1ar4/jar/obfuscator/jvmti/Constants.java @@ -5,7 +5,7 @@ */ @SuppressWarnings("all") public interface Constants { - String DecrypterDLL = "libdecrypter.dll"; + String DecrypterDLL = "libdecrypter.dll"; String DecrypterSo = "libdecrypter.so"; String DecrypterDylib = "libdecrypter.dylib"; String EncryptorDLL = "libencryptor.dll";