Skip to content

Commit 1c7f444

Browse files
committed
Merge remote-tracking branch 'upstream/master'
2 parents dea2141 + a9d3ea3 commit 1c7f444

11 files changed

+99
-61
lines changed

.gitignore

+3-2
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ local.properties
1717
b.sh
1818
test*
1919
magisk/system/bin/*
20-
fast-memmem
21-
*.log
20+
*.log
21+
zygisk-rust
22+
aidl/*.aidl*

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Hooks libbinder with zygisk
1010
* Flash zygisk-detach module
1111
* Reboot
1212
* Run the cli in termux: `su -c detach`
13-
or use [zygisk-detach-app](https://github.com/j-hc/zygisk-detach-app) if you dont wanna use the terminal
13+
or use [zygisk-detach-app](https://github.com/j-hc/zygisk-detach-app/releases/latest/download/app-release.apk) if you don't wanna use the terminal
1414
* Select apps you wish to detach. Changes are applied immediately, no need to reboot.
1515

1616
### Notes

aidl/aidl_gen.sh

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
BRANCHES=(android10-release android11-release android12-release android13-release android14-release)
6+
for B in "${BRANCHES[@]}"; do
7+
N=IPackageManager.aidl_$B
8+
if [ -f "$N" ]; then continue; fi
9+
U="https://android.googlesource.com/platform/frameworks/base/+/refs/heads/$B/core/java/android/content/pm/IPackageManager.aidl?format=TEXT"
10+
curl "$U" | base64 --decode >"$N"
11+
done
12+
13+
BRANCHES+=(android9) # android9 does not have a seperate branch, only a tag, dl manually
14+
for B in "${BRANCHES[@]}"; do
15+
N=IPackageManager.aidl_$B
16+
CODE=$(cat "$N" | sed '0,/^interface /d' | sed '/PackageInfo getPackageInfo/Q' | grep -c ';')
17+
CODE=$((CODE + 1))
18+
D=$(cut -d- -f1 <<<"$B")
19+
echo "#define getPackageInfo_${D}_code $CODE"
20+
done
21+
22+
# generates java with "aidl" binary. but parsing the files with with sed is easier tbh
23+
# AIDL_SRC=$(pwd)/aidl-src
24+
# OUT_DIR=$(pwd)/aidl-out
25+
# function pull_aidl() {
26+
# for B in "${BRANCHES[@]}"; do
27+
# echo "clone $B"
28+
# CLOUT=$AIDL_SRC/$B
29+
# if [ -d $CLOUT ]; then continue; fi
30+
# git clone --depth 1 -b $B https://android.googlesource.com/platform/frameworks/base $CLOUT
31+
# git clone --depth 1 -b $B https://android.googlesource.com/platform/frameworks/native $CLOUT
32+
# done
33+
# }
34+
# (
35+
# cd $AIDL_SRC/base
36+
# ~/Android/Sdk/build-tools/34.0.0/aidl --lang=java ./core/java/android/content/pm/IPackageManager.aidl --out $OUT_DIR -I. -I./core/java -I./graphics/java/ -I../native/aidl/binder/
37+
# )

cli/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ version = "0.1.0"
44
edition = "2021"
55

66
[dependencies]
7-
termion = "2"
7+
termion = "3"
88

99
[profile.dev]
1010
panic = "abort"

cli/src/colorize.rs

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ impl<D: Display> Display for Colored<D> {
1515
}
1616
}
1717

18+
#[allow(dead_code)]
1819
pub trait ToColored: Display + Sized {
1920
fn faint(&self) -> Colored<&Self> {
2021
Colored {

magisk/customize.sh

+2-8
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,8 @@ if [ -f "$MODPATH/detach.txt" ]; then
1919
ui_print "$OP"
2020
fi
2121

22-
ALIAS="alias detach='su -c detach'"
23-
BASHRC="/data/data/com.termux/files/home/.bashrc"
24-
if [ -d "/data/data/com.termux/files/home/" ]; then
25-
grep -qxF "$ALIAS" "$BASHRC" || echo "$ALIAS" >>"$BASHRC"
26-
ui_print "- Run 'detach' in termux after the reboot"
27-
else
28-
ui_print "- Run 'su -c detach' in terminal after the reboot"
29-
fi
22+
ui_print "- Run 'su -c detach' in terminal after the reboot"
23+
ui_print "- Or use zygisk-detach-app"
3024

3125
ui_print " by j-hc (github.com/j-hc)"
3226

magisk/module.prop

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
id=zygisk-detach
22
name=zygisk-detach
3-
version=v1.11.0
4-
versionCode=14
3+
version=v1.16.0
4+
versionCode=19
55
author=j-hc
66
description=Detaches installed apps from Play Store
77
updateJson=https://raw.githubusercontent.com/kazimmt/zygisk-detach/master/update.json

update.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"version": "v1.11.0",
3-
"versionCode": 14,
4-
"zipUrl": "https://github.com/kazimmt/zygisk-detach/releases/latest/download/zygisk-detach-v1.11.0.zip",
2+
"version": "v1.16.0",
3+
"versionCode": 19,
4+
"zipUrl": "https://github.com/kazimmt/zygisk-detach/releases/latest/download/zygisk-detach-v1.16.0.zip",
55
"changelog": "https://raw.githubusercontent.com/kazimmt/zygisk-detach/master/README.md"
66
}

zygisk/jni/module.cpp

+39-33
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,33 @@
1111
#include "parcel.hpp"
1212
#include "zygisk.hpp"
1313

14-
using zygisk::Api;
15-
using zygisk::AppSpecializeArgs;
16-
using zygisk::ServerSpecializeArgs;
17-
1814
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "zygisk-detach", __VA_ARGS__)
1915

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+
};
2224

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;
2628
uint32_t pkg_len = p.readInt32();
2729
uint32_t pkg_len_b = pkg_len * 2 - 1;
30+
if (pkg_len_b > UINT8_MAX) return;
31+
if (code == getPackageInfo_code) return;
2832
auto pkg_ptr = p.readString16(pkg_len);
2933

3034
size_t i = 0;
3135
uint8_t dlen;
3236
while ((dlen = DETACH_TXT[i])) {
33-
unsigned char* dptr = DETACH_TXT + i + sizeof(dlen);
37+
uint8_t* dptr = DETACH_TXT + i + sizeof(dlen);
3438
i += sizeof(dlen) + dlen;
35-
if (dlen != pkg_len_b) continue;
39+
if (dlen != pkg_len_b)
40+
continue;
3641
if (!memcmp(dptr, pkg_ptr, dlen)) {
3742
*pkg_ptr = 0;
3843
return;
@@ -42,28 +47,28 @@ static inline void handle_transact(uint8_t* data, size_t data_size) {
4247

4348
int (*transact_orig)(void*, int32_t, uint32_t, void*, void*, uint32_t);
4449

45-
struct PParcel {
46-
size_t error;
47-
uint8_t* data;
48-
size_t data_size;
49-
};
50-
5150
int transact_hook(void* self, int32_t handle, uint32_t code, void* pdata, void* preply, uint32_t flags) {
5251
auto parcel = (PParcel*)pdata;
53-
handle_transact(parcel->data, parcel->data_size);
52+
detach(parcel, code);
5453
return transact_orig(self, handle, code, pdata, preply, flags);
5554
}
5655

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 {
6059
this->api = api;
6160
this->env = env;
6261
}
6362

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 {
6569
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))) {
6772
env->ReleaseStringUTFChars(args->nice_name, process);
6873
api->setOption(zygisk::Option::DLCLOSE_MODULE_LIBRARY);
6974
return;
@@ -81,12 +86,12 @@ class Sigringe : public zygisk::ModuleBase {
8186
char sdk_str[2];
8287
if (__system_property_get("ro.build.version.sdk", sdk_str)) {
8388
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);
8792
} else {
8893
LOGD("WARN: could not get sdk version (fallback=3)");
89-
HEADERS_COUNT = 3;
94+
HEADERS_LEN = 3 * sizeof(uint32_t);
9095
}
9196

9297
ino_t inode;
@@ -106,8 +111,8 @@ class Sigringe : public zygisk::ModuleBase {
106111
}
107112
}
108113

109-
private:
110-
Api* api;
114+
private:
115+
zygisk::Api* api;
111116
JNIEnv* env;
112117

113118
bool getBinder(ino_t* inode, dev_t* dev) {
@@ -119,7 +124,8 @@ class Sigringe : public zygisk::ModuleBase {
119124
unsigned int dev_major, dev_minor;
120125
int cur;
121126
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') {
123129
*dev = makedev(dev_major, dev_minor);
124130
fclose(fp);
125131
return true;
@@ -139,7 +145,7 @@ class Sigringe : public zygisk::ModuleBase {
139145
LOGD("ERROR: detach.bin <= 0");
140146
return 0;
141147
}
142-
DETACH_TXT = (unsigned char*)malloc(size + 1);
148+
DETACH_TXT = (uint8_t*)malloc(size + 1);
143149
auto r = read(fd, DETACH_TXT, size);
144150
if (r < 0) {
145151
LOGD("ERROR: read companion");
@@ -185,5 +191,5 @@ static void companion_handler(int remote_fd) {
185191
close(fd);
186192
}
187193

188-
REGISTER_ZYGISK_MODULE(Sigringe)
189-
REGISTER_ZYGISK_COMPANION(companion_handler)
194+
REGISTER_ZYGISK_MODULE(ZygiskDetach)
195+
REGISTER_ZYGISK_COMPANION(companion_handler)

zygisk/jni/parcel.cpp

+5-11
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,8 @@
22

33
#include <stdint.h>
44

5-
#define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0]))
6-
#define PM_DESCRIPTOR_LEN (ARRAY_LEN(u"android.content.pm.IPackageManager") - 1)
5+
#define PM_DESCRIPTOR_LEN (STR_LEN(u"android.content.pm.IPackageManager"))
76
#define PM_DESCRIPTOR_BYTES (PM_DESCRIPTOR_LEN * 2)
8-
#define U32SZ (sizeof(uint32_t))
9-
10-
// bool String16Eq(const char16_t* s1, size_t len1, const char16_t* s2, size_t len2) {
11-
// return (len1 == len2 && !memcmp(s1, s2, len1 * sizeof(char16_t)));
12-
// }
137

148
void FakeParcel::skip(size_t skip) {
159
cur += skip;
@@ -27,10 +21,10 @@ char16_t* FakeParcel::readString16(uint32_t len) {
2721
return s;
2822
}
2923

30-
bool FakeParcel::enforceInterface(size_t data_size, uint8_t header_count) {
31-
// | headers |des len| descriptor |null+next|
32-
if (data_size < (U32SZ * header_count) + U32SZ + PM_DESCRIPTOR_BYTES + (U32SZ * 2)) return false;
33-
skip(U32SZ * header_count);
24+
bool FakeParcel::enforceInterface(size_t data_size, uint8_t headers) {
25+
// | headers | des len | descriptor | null+next |
26+
if (data_size < headers + sizeof(uint32_t) + PM_DESCRIPTOR_BYTES + (sizeof(uint32_t) * 2)) return false;
27+
skip(headers);
3428
uint32_t len = readInt32();
3529
readString16(len); // pi;
3630
return PM_DESCRIPTOR_LEN == len;

zygisk/jni/parcel.hpp

+5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
#include <stddef.h>
44
#include <stdint.h>
55

6+
#define ARRAY_LEN(a) (sizeof(a) / sizeof((a)[0]))
7+
#define STR_LEN(a) (ARRAY_LEN(a) - 1)
8+
9+
#define getPackageInfo_code 3
10+
611
struct FakeParcel {
712
unsigned char* data;
813
size_t cur;

0 commit comments

Comments
 (0)