11
11
#include " parcel.hpp"
12
12
#include " zygisk.hpp"
13
13
14
- using zygisk::Api;
15
- using zygisk::AppSpecializeArgs;
16
- using zygisk::ServerSpecializeArgs;
17
-
18
14
#define LOGD (...) __android_log_print(ANDROID_LOG_DEBUG, " zygisk-detach" , __VA_ARGS__)
19
15
20
- static unsigned char * DETACH_TXT;
21
- static uint8_t HEADERS_COUNT;
16
+ static uint8_t * DETACH_TXT;
17
+ static uint8_t HEADERS_LEN;
18
+
19
+ struct PParcel {
20
+ size_t error;
21
+ uint8_t * data;
22
+ size_t data_size;
23
+ };
22
24
23
- static inline void handle_transact ( uint8_t * data, size_t data_size ) {
24
- auto p = FakeParcel{data, 0 };
25
- if (!p.enforceInterface (data_size, HEADERS_COUNT )) return ;
25
+ static inline void detach (PParcel* parcel, uint32_t code ) {
26
+ auto p = FakeParcel{parcel-> data , 0 };
27
+ if (!p.enforceInterface (parcel-> data_size , HEADERS_LEN )) return ;
26
28
uint32_t pkg_len = p.readInt32 ();
27
29
uint32_t pkg_len_b = pkg_len * 2 - 1 ;
30
+ if (pkg_len_b > UINT8_MAX) return ;
31
+ if (code == getPackageInfo_code) return ;
28
32
auto pkg_ptr = p.readString16 (pkg_len);
29
33
30
34
size_t i = 0 ;
31
35
uint8_t dlen;
32
36
while ((dlen = DETACH_TXT[i])) {
33
- unsigned char * dptr = DETACH_TXT + i + sizeof (dlen);
37
+ uint8_t * dptr = DETACH_TXT + i + sizeof (dlen);
34
38
i += sizeof (dlen) + dlen;
35
- if (dlen != pkg_len_b) continue ;
39
+ if (dlen != pkg_len_b)
40
+ continue ;
36
41
if (!memcmp (dptr, pkg_ptr, dlen)) {
37
42
*pkg_ptr = 0 ;
38
43
return ;
@@ -42,28 +47,28 @@ static inline void handle_transact(uint8_t* data, size_t data_size) {
42
47
43
48
int (*transact_orig)(void *, int32_t , uint32_t , void *, void *, uint32_t );
44
49
45
- struct PParcel {
46
- size_t error;
47
- uint8_t * data;
48
- size_t data_size;
49
- };
50
-
51
50
int transact_hook (void * self, int32_t handle, uint32_t code, void * pdata, void * preply, uint32_t flags) {
52
51
auto parcel = (PParcel*)pdata;
53
- handle_transact (parcel-> data , parcel-> data_size );
52
+ detach (parcel, code );
54
53
return transact_orig (self, handle, code, pdata, preply, flags);
55
54
}
56
55
57
- class Sigringe : public zygisk ::ModuleBase {
58
- public:
59
- void onLoad (Api* api, JNIEnv* env) override {
56
+ class ZygiskDetach : public zygisk ::ModuleBase {
57
+ public:
58
+ void onLoad (zygisk:: Api* api, JNIEnv* env) override {
60
59
this ->api = api;
61
60
this ->env = env;
62
61
}
63
62
64
- void preAppSpecialize (AppSpecializeArgs* args) override {
63
+ void preServerSpecialize (zygisk::ServerSpecializeArgs* args) override {
64
+ (void )args;
65
+ api->setOption (zygisk::DLCLOSE_MODULE_LIBRARY);
66
+ }
67
+
68
+ void preAppSpecialize (zygisk::AppSpecializeArgs* args) override {
65
69
const char * process = env->GetStringUTFChars (args->nice_name , nullptr );
66
- if (memcmp (process, " com.android.vending\0 " , 20 )) {
70
+ #define vending " com.android.vending"
71
+ if (memcmp (process, vending, STR_LEN (vending))) {
67
72
env->ReleaseStringUTFChars (args->nice_name , process);
68
73
api->setOption (zygisk::Option::DLCLOSE_MODULE_LIBRARY);
69
74
return ;
@@ -81,12 +86,12 @@ class Sigringe : public zygisk::ModuleBase {
81
86
char sdk_str[2 ];
82
87
if (__system_property_get (" ro.build.version.sdk" , sdk_str)) {
83
88
int sdk = atoi (sdk_str);
84
- if (sdk >= 30 ) HEADERS_COUNT = 3 ;
85
- else if (sdk == 29 ) HEADERS_COUNT = 2 ;
86
- else HEADERS_COUNT = 1 ;
89
+ if (sdk >= 30 ) HEADERS_LEN = 3 * sizeof ( uint32_t ) ;
90
+ else if (sdk == 29 ) HEADERS_LEN = 2 * sizeof ( uint32_t ) ;
91
+ else HEADERS_LEN = 1 * sizeof ( uint32_t ) ;
87
92
} else {
88
93
LOGD (" WARN: could not get sdk version (fallback=3)" );
89
- HEADERS_COUNT = 3 ;
94
+ HEADERS_LEN = 3 * sizeof ( uint32_t ) ;
90
95
}
91
96
92
97
ino_t inode;
@@ -106,8 +111,8 @@ class Sigringe : public zygisk::ModuleBase {
106
111
}
107
112
}
108
113
109
- private:
110
- Api* api;
114
+ private:
115
+ zygisk:: Api* api;
111
116
JNIEnv* env;
112
117
113
118
bool getBinder (ino_t * inode, dev_t * dev) {
@@ -119,7 +124,8 @@ class Sigringe : public zygisk::ModuleBase {
119
124
unsigned int dev_major, dev_minor;
120
125
int cur;
121
126
sscanf (mapbuf, " %*s %s %*x %x:%x %lu %*s%n" , flags, &dev_major, &dev_minor, inode, &cur);
122
- if (memcmp (&mapbuf[cur - 12 ], " libbinder.so" , 12 ) == 0 && flags[2 ] == ' x' ) {
127
+ #define libbinder " libbinder.so"
128
+ if (memcmp (&mapbuf[cur - STR_LEN (libbinder)], libbinder, STR_LEN (libbinder)) == 0 && flags[2 ] == ' x' ) {
123
129
*dev = makedev (dev_major, dev_minor);
124
130
fclose (fp);
125
131
return true ;
@@ -139,7 +145,7 @@ class Sigringe : public zygisk::ModuleBase {
139
145
LOGD (" ERROR: detach.bin <= 0" );
140
146
return 0 ;
141
147
}
142
- DETACH_TXT = (unsigned char *)malloc (size + 1 );
148
+ DETACH_TXT = (uint8_t *)malloc (size + 1 );
143
149
auto r = read (fd, DETACH_TXT, size);
144
150
if (r < 0 ) {
145
151
LOGD (" ERROR: read companion" );
@@ -185,5 +191,5 @@ static void companion_handler(int remote_fd) {
185
191
close (fd);
186
192
}
187
193
188
- REGISTER_ZYGISK_MODULE (Sigringe )
189
- REGISTER_ZYGISK_COMPANION(companion_handler)
194
+ REGISTER_ZYGISK_MODULE (ZygiskDetach )
195
+ REGISTER_ZYGISK_COMPANION(companion_handler)
0 commit comments