diff --git a/module/src/main/cpp/hack.cpp b/module/src/main/cpp/hack.cpp index a95247f8..874bab2e 100644 --- a/module/src/main/cpp/hack.cpp +++ b/module/src/main/cpp/hack.cpp @@ -111,7 +111,7 @@ struct NativeBridgeCallbacks { void *(*loadLibraryExt)(const char *libpath, int flag, void *ns); }; -bool NativeBridgeLoad(const char *game_data_dir, int api_level, ArmLoader *loader) { +bool NativeBridgeLoad(const char *game_data_dir, int api_level, void *data, size_t length) { //TODO 等待houdini初始化 sleep(5); @@ -130,24 +130,14 @@ bool NativeBridgeLoad(const char *game_data_dir, int api_level, ArmLoader *loade return false; } - void *data; - size_t length; auto lib_dir = GetLibDir(vms); if (lib_dir.empty()) { LOGE("GetLibDir error"); return false; } - if (lib_dir.find("arm64") != std::string::npos) { - LOGI("load arm64"); - data = loader->arm64; - length = loader->arm64_length; - } else if (lib_dir.find("arm") != std::string::npos) { - LOGI("load arm"); - data = loader->arm; - length = loader->arm_length; - } else { - //TODO 可能有x86_64载入x86游戏的情况? + if (lib_dir.find("/lib/x86") != std::string::npos) { LOGI("no need NativeBridge"); + munmap(data, length); return false; } @@ -170,6 +160,7 @@ bool NativeBridgeLoad(const char *game_data_dir, int api_level, ArmLoader *loade void *mem = mmap(nullptr, length, PROT_WRITE, MAP_SHARED, fd, 0); memcpy(mem, data, length); munmap(mem, length); + munmap(data, length); char path[PATH_MAX]; snprintf(path, PATH_MAX, "/proc/self/fd/%d", fd); LOGI("arm path %s", path); @@ -195,19 +186,17 @@ bool NativeBridgeLoad(const char *game_data_dir, int api_level, ArmLoader *loade return false; } -void hack_prepare(const char *game_data_dir, ArmLoader *loader) { +void hack_prepare(const char *game_data_dir, void *data, size_t length) { LOGI("hack thread: %d", gettid()); int api_level = android_get_device_api_level(); LOGI("api level: %d", api_level); #if defined(__i386__) || defined(__x86_64__) - if (!NativeBridgeLoad(game_data_dir, api_level, loader)) { + if (!NativeBridgeLoad(game_data_dir, api_level, data, length)) { #endif hack_start(game_data_dir); #if defined(__i386__) || defined(__x86_64__) } - munmap(loader->arm, loader->arm_length); - munmap(loader->arm64, loader->arm64_length); #endif } diff --git a/module/src/main/cpp/hack.h b/module/src/main/cpp/hack.h index f97e4b33..30912edb 100644 --- a/module/src/main/cpp/hack.h +++ b/module/src/main/cpp/hack.h @@ -7,13 +7,6 @@ #include -struct ArmLoader { - void *arm; - size_t arm_length; - void *arm64; - size_t arm64_length; -}; - -void hack_prepare(const char *game_data_dir, ArmLoader *loader); +void hack_prepare(const char *game_data_dir, void *data, size_t length); #endif //ZYGISK_IL2CPPDUMPER_HACK_H diff --git a/module/src/main/cpp/main.cpp b/module/src/main/cpp/main.cpp index efb8985c..9e4cbbba 100644 --- a/module/src/main/cpp/main.cpp +++ b/module/src/main/cpp/main.cpp @@ -32,7 +32,7 @@ class MyModule : public zygisk::ModuleBase { void postAppSpecialize(const AppSpecializeArgs *) override { if (enable_hack) { - std::thread hack_thread(hack_prepare, game_data_dir, loader); + std::thread hack_thread(hack_prepare, game_data_dir, data, length); hack_thread.detach(); } } @@ -42,21 +42,8 @@ class MyModule : public zygisk::ModuleBase { JNIEnv *env; bool enable_hack; char *game_data_dir; - ArmLoader *loader; - - void loadSo(const char *path, void *&data, size_t &length) { - int dirfd = api->getModuleDir(); - int fd = openat(dirfd, path, O_RDONLY); - if (fd != -1) { - struct stat sb{}; - fstat(fd, &sb); - length = sb.st_size; - data = mmap(nullptr, length, PROT_READ, MAP_PRIVATE, fd, 0); - close(fd); - } else { - LOGW("Unable to open %s", path); - } - } + void *data; + size_t length; void preSpecialize(const char *package_name, const char *app_data_dir) { if (strcmp(package_name, GamePackageName) == 0) { @@ -64,10 +51,25 @@ class MyModule : public zygisk::ModuleBase { enable_hack = true; game_data_dir = new char[strlen(app_data_dir) + 1]; strcpy(game_data_dir, app_data_dir); + +#if defined(__i386__) + auto path = "zygisk/armeabi-v7a.so"; +#endif +#if defined(__x86_64__) + auto path = "zygisk/arm64-v8a.so"; +#endif #if defined(__i386__) || defined(__x86_64__) - loader = new ArmLoader(); - loadSo("zygisk/armeabi-v7a.so", loader->arm, loader->arm_length); - loadSo("zygisk/arm64-v8a.so", loader->arm64, loader->arm64_length); + int dirfd = api->getModuleDir(); + int fd = openat(dirfd, path, O_RDONLY); + if (fd != -1) { + struct stat sb{}; + fstat(fd, &sb); + length = sb.st_size; + data = mmap(nullptr, length, PROT_READ, MAP_PRIVATE, fd, 0); + close(fd); + } else { + LOGW("Unable to open arm file"); + } #endif } else { api->setOption(zygisk::Option::DLCLOSE_MODULE_LIBRARY);