Skip to content

Commit

Permalink
调整arm so载入逻辑
Browse files Browse the repository at this point in the history
  • Loading branch information
Perfare committed May 22, 2023
1 parent d2c4c9c commit ede65d1
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 44 deletions.
23 changes: 6 additions & 17 deletions module/src/main/cpp/hack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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;
}

Expand All @@ -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);
Expand All @@ -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
}

Expand Down
9 changes: 1 addition & 8 deletions module/src/main/cpp/hack.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,6 @@

#include <stddef.h>

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
40 changes: 21 additions & 19 deletions module/src/main/cpp/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}
Expand All @@ -42,32 +42,34 @@ 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) {
LOGI("detect game: %s", package_name);
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);
Expand Down

0 comments on commit ede65d1

Please sign in to comment.