Downgrade to Zygisk api v2

This commit is contained in:
chiteroman
2024-08-12 02:43:44 +02:00
parent 1e7c98b389
commit bf87ea42b8

View File

@@ -19,7 +19,7 @@
#include <jni.h> #include <jni.h>
#define ZYGISK_API_VERSION 4 #define ZYGISK_API_VERSION 2
/* /*
@@ -142,7 +142,6 @@ namespace zygisk {
jint &gid; jint &gid;
jintArray &gids; jintArray &gids;
jint &runtime_flags; jint &runtime_flags;
jobjectArray &rlimits;
jint &mount_external; jint &mount_external;
jstring &se_info; jstring &se_info;
jstring &nice_name; jstring &nice_name;
@@ -150,7 +149,6 @@ namespace zygisk {
jstring &app_data_dir; jstring &app_data_dir;
// Optional arguments. Please check whether the pointer is null before de-referencing // Optional arguments. Please check whether the pointer is null before de-referencing
jintArray *const fds_to_ignore;
jboolean *const is_child_zygote; jboolean *const is_child_zygote;
jboolean *const is_top_app; jboolean *const is_top_app;
jobjectArray *const pkg_data_info_list; jobjectArray *const pkg_data_info_list;
@@ -174,9 +172,7 @@ namespace zygisk {
namespace internal { namespace internal {
struct api_table; struct api_table;
template <class T> void entry_impl(api_table *, JNIEnv *);
template<class T>
void entry_impl(api_table *, JNIEnv *);
} }
// These values are used in Api::setOption(Option) // These values are used in Api::setOption(Option)
@@ -245,22 +241,13 @@ namespace zygisk {
// Returns bitwise-or'd zygisk::StateFlag values. // Returns bitwise-or'd zygisk::StateFlag values.
uint32_t getFlags(); uint32_t getFlags();
// Exempt the provided file descriptor from being automatically closed.
//
// This API only make sense in preAppSpecialize; calling this method in any other situation
// is either a no-op (returns true) or an error (returns false).
//
// When false is returned, the provided file descriptor will eventually be closed by zygote.
bool exemptFd(int fd);
// Hook JNI native methods for a class // Hook JNI native methods for a class
// //
// Lookup all registered JNI native methods and replace it with your own methods. // Lookup all registered JNI native methods and replace it with your own methods.
// The original function pointer will be saved in each JNINativeMethod's fnPtr. // The original function pointer will be saved in each JNINativeMethod's fnPtr.
// If no matching class, method name, or signature is found, that specific JNINativeMethod.fnPtr // If no matching class, method name, or signature is found, that specific JNINativeMethod.fnPtr
// will be set to nullptr. // will be set to nullptr.
void hookJniNativeMethods(JNIEnv *env, const char *className, JNINativeMethod *methods, void hookJniNativeMethods(JNIEnv *env, const char *className, JNINativeMethod *methods, int numMethods);
int numMethods);
// Hook functions in the PLT (Procedure Linkage Table) of ELFs loaded in memory. // Hook functions in the PLT (Procedure Linkage Table) of ELFs loaded in memory.
// //
@@ -270,11 +257,13 @@ namespace zygisk {
// 56b4346000-56b4347000 r-xp 00002000 fe:00 235 /system/bin/app_process64 // 56b4346000-56b4347000 r-xp 00002000 fe:00 235 /system/bin/app_process64
// (More details: https://man7.org/linux/man-pages/man5/proc.5.html) // (More details: https://man7.org/linux/man-pages/man5/proc.5.html)
// //
// The `dev` and `inode` pair uniquely identifies a file being mapped into memory. // For ELFs loaded in memory with pathname matching `regex`, replace function `symbol` with `newFunc`.
// For matching ELFs loaded in memory, replace function `symbol` with `newFunc`.
// If `oldFunc` is not nullptr, the original function pointer will be saved to `oldFunc`. // If `oldFunc` is not nullptr, the original function pointer will be saved to `oldFunc`.
void void pltHookRegister(const char *regex, const char *symbol, void *newFunc, void **oldFunc);
pltHookRegister(dev_t dev, ino_t inode, const char *symbol, void *newFunc, void **oldFunc);
// For ELFs loaded in memory with pathname matching `regex`, exclude hooks registered for `symbol`.
// If `symbol` is nullptr, then all symbols will be excluded.
void pltHookExclude(const char *regex, const char *symbol);
// Commit all the hooks that was previously registered. // Commit all the hooks that was previously registered.
// Returns false if an error occurred. // Returns false if an error occurred.
@@ -282,9 +271,7 @@ namespace zygisk {
private: private:
internal::api_table *tbl; internal::api_table *tbl;
template <class T> friend void internal::entry_impl(internal::api_table *, JNIEnv *);
template<class T>
friend void internal::entry_impl(internal::api_table *, JNIEnv *);
}; };
// Register a class as a Zygisk module // Register a class as a Zygisk module
@@ -319,11 +306,8 @@ void zygisk_companion_entry(int client) { func(client); }
ModuleBase *impl; ModuleBase *impl;
void (*preAppSpecialize)(ModuleBase *, AppSpecializeArgs *); void (*preAppSpecialize)(ModuleBase *, AppSpecializeArgs *);
void (*postAppSpecialize)(ModuleBase *, const AppSpecializeArgs *); void (*postAppSpecialize)(ModuleBase *, const AppSpecializeArgs *);
void (*preServerSpecialize)(ModuleBase *, ServerSpecializeArgs *); void (*preServerSpecialize)(ModuleBase *, ServerSpecializeArgs *);
void (*postServerSpecialize)(ModuleBase *, const ServerSpecializeArgs *); void (*postServerSpecialize)(ModuleBase *, const ServerSpecializeArgs *);
module_abi(ModuleBase *module) : api_version(ZYGISK_API_VERSION), impl(module) { module_abi(ModuleBase *module) : api_version(ZYGISK_API_VERSION), impl(module) {
@@ -337,23 +321,15 @@ void zygisk_companion_entry(int client) { func(client); }
struct api_table { struct api_table {
// Base // Base
void *impl; void *impl;
bool (*registerModule)(api_table *, module_abi *); bool (*registerModule)(api_table *, module_abi *);
void (*hookJniNativeMethods)(JNIEnv *, const char *, JNINativeMethod *, int); void (*hookJniNativeMethods)(JNIEnv *, const char *, JNINativeMethod *, int);
void (*pltHookRegister)(const char *, const char *, void *, void **);
void (*pltHookRegister)(dev_t, ino_t, const char *, void *, void **); void (*pltHookExclude)(const char *, const char *);
bool (*exemptFd)(int);
bool (*pltHookCommit)(); bool (*pltHookCommit)();
int (*connectCompanion)(void * /* impl */); int (*connectCompanion)(void * /* impl */);
void (*setOption)(void * /* impl */, Option); void (*setOption)(void * /* impl */, Option);
int (*getModuleDir)(void * /* impl */); int (*getModuleDir)(void * /* impl */);
uint32_t (*getFlags)(void * /* impl */); uint32_t (*getFlags)(void * /* impl */);
}; };
@@ -373,35 +349,24 @@ void zygisk_companion_entry(int client) { func(client); }
inline int Api::connectCompanion() { inline int Api::connectCompanion() {
return tbl->connectCompanion ? tbl->connectCompanion(tbl->impl) : -1; return tbl->connectCompanion ? tbl->connectCompanion(tbl->impl) : -1;
} }
inline int Api::getModuleDir() { inline int Api::getModuleDir() {
return tbl->getModuleDir ? tbl->getModuleDir(tbl->impl) : -1; return tbl->getModuleDir ? tbl->getModuleDir(tbl->impl) : -1;
} }
inline void Api::setOption(Option opt) { inline void Api::setOption(Option opt) {
if (tbl->setOption) tbl->setOption(tbl->impl, opt); if (tbl->setOption) tbl->setOption(tbl->impl, opt);
} }
inline uint32_t Api::getFlags() { inline uint32_t Api::getFlags() {
return tbl->getFlags ? tbl->getFlags(tbl->impl) : 0; return tbl->getFlags ? tbl->getFlags(tbl->impl) : 0;
} }
inline void Api::hookJniNativeMethods(JNIEnv *env, const char *className, JNINativeMethod *methods, int numMethods) {
inline bool Api::exemptFd(int fd) { if (tbl->hookJniNativeMethods) tbl->hookJniNativeMethods(env, className, methods, numMethods);
return tbl->exemptFd != nullptr && tbl->exemptFd(fd);
} }
inline void Api::pltHookRegister(const char *regex, const char *symbol, void *newFunc, void **oldFunc) {
inline void if (tbl->pltHookRegister) tbl->pltHookRegister(regex, symbol, newFunc, oldFunc);
Api::hookJniNativeMethods(JNIEnv *env, const char *className, JNINativeMethod *methods,
int numMethods) {
if (tbl->hookJniNativeMethods)
tbl->hookJniNativeMethods(env, className, methods, numMethods);
} }
inline void Api::pltHookExclude(const char *regex, const char *symbol) {
inline void Api::pltHookRegister(dev_t dev, ino_t inode, const char *symbol, void *newFunc, if (tbl->pltHookExclude) tbl->pltHookExclude(regex, symbol);
void **oldFunc) {
if (tbl->pltHookRegister) tbl->pltHookRegister(dev, inode, symbol, newFunc, oldFunc);
} }
inline bool Api::pltHookCommit() { inline bool Api::pltHookCommit() {
return tbl->pltHookCommit != nullptr && tbl->pltHookCommit(); return tbl->pltHookCommit != nullptr && tbl->pltHookCommit();
} }