#include #include #include #include #include #include #include #include #include "hack.h" #include "zygisk.hpp" #include "game.h" #include "log.h" #include "dlfcn.h" using zygisk::Api; using zygisk::AppSpecializeArgs; using zygisk::ServerSpecializeArgs; class MyModule : public zygisk::ModuleBase { public: void onLoad(Api *api, JNIEnv *env) override { this->api = api; this->env = env; } void preAppSpecialize(AppSpecializeArgs *args) override { auto package_name = env->GetStringUTFChars(args->nice_name, nullptr); auto app_data_dir = env->GetStringUTFChars(args->app_data_dir, nullptr); LOGI("preAppSpecialize %s %s", package_name, app_data_dir); preSpecialize(package_name, app_data_dir); env->ReleaseStringUTFChars(args->nice_name, package_name); env->ReleaseStringUTFChars(args->app_data_dir, app_data_dir); } void postAppSpecialize(const AppSpecializeArgs *) override { if (enable_hack) { std::thread hack_thread(hack_prepare, _data_dir, data, length); hack_thread.detach(); } } private: Api *api; JNIEnv *env; bool enable_hack; char *_data_dir; void *data; size_t length; void preSpecialize(const char *package_name, const char *app_data_dir) { if (strcmp(package_name, AimPackageName) == 0) { LOGI("成功注入目标进程: %s", package_name); enable_hack = true; _data_dir = new char[strlen(app_data_dir) + 1]; strcpy(_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__) 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); } } }; REGISTER_ZYGISK_MODULE(MyModule)