From 41045b62dcf08b7439510575c60efb20dbb26a71 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 14 Jul 2019 17:41:51 -0700 Subject: [PATCH] Introduce more randomness - Use C++ random generator instead of old and broken rand() - Randomize string length to piss off stupid detectors --- native/jni/core/socket.cpp | 2 +- native/jni/init/rootdir.cpp | 20 ++++++----------- native/jni/utils/include/misc.h | 3 ++- native/jni/utils/misc.cpp | 39 +++++++++++++++++++++------------ 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/native/jni/core/socket.cpp b/native/jni/core/socket.cpp index 84f6abd03..217ee0498 100644 --- a/native/jni/core/socket.cpp +++ b/native/jni/core/socket.cpp @@ -22,7 +22,7 @@ socklen_t setup_sockaddr(struct sockaddr_un *sun, const char *name) { int create_rand_socket(struct sockaddr_un *sun) { memset(sun, 0, sizeof(*sun)); sun->sun_family = AF_LOCAL; - gen_rand_str(sun->sun_path + 1, 9); + gen_rand_str(sun->sun_path + 1, sizeof(sun->sun_path) - 1); int fd = xsocket(AF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0); xbind(fd, (struct sockaddr*) sun, ABS_SOCKET_LEN(sun)); xlisten(fd, 1); diff --git a/native/jni/init/rootdir.cpp b/native/jni/init/rootdir.cpp index 5b871516c..c7e9ad96d 100644 --- a/native/jni/init/rootdir.cpp +++ b/native/jni/init/rootdir.cpp @@ -19,15 +19,13 @@ using namespace std; static void patch_socket_name(const char *path) { - uint8_t *buf; - char name[sizeof(MAIN_SOCKET)]; + char *buf; size_t size; mmap_rw(path, buf, size); for (int i = 0; i < size; ++i) { if (memcmp(buf + i, MAIN_SOCKET, sizeof(MAIN_SOCKET)) == 0) { - gen_rand_str(name, sizeof(name)); - memcpy(buf + i, name, sizeof(name)); - i += sizeof(name); + gen_rand_str(buf + i, sizeof(MAIN_SOCKET)); + i += sizeof(MAIN_SOCKET); } } munmap(buf, size); @@ -50,14 +48,10 @@ static void patch_init_rc(FILE *rc) { fprintf(rc, "%s", line.data()); return true; }); - char pfd_svc[8], ls_svc[8], bc_svc[8]; - // Make sure to be unique - pfd_svc[0] = 'a'; - ls_svc[0] = '0'; - bc_svc[0] = 'A'; - gen_rand_str(pfd_svc + 1, sizeof(pfd_svc) - 1); - gen_rand_str(ls_svc + 1, sizeof(ls_svc) - 1); - gen_rand_str(bc_svc + 1, sizeof(bc_svc) - 1); + char pfd_svc[32], ls_svc[32], bc_svc[32]; + gen_rand_str(pfd_svc, sizeof(pfd_svc)); + gen_rand_str(ls_svc, sizeof(ls_svc)); + gen_rand_str(bc_svc, sizeof(bc_svc)); LOGD("Inject magisk services: [%s] [%s] [%s]\n", pfd_svc, ls_svc, bc_svc); fprintf(rc, magiskrc, pfd_svc, pfd_svc, ls_svc, bc_svc, bc_svc); } diff --git a/native/jni/utils/include/misc.h b/native/jni/utils/include/misc.h index ee90e2c2b..80188ba77 100644 --- a/native/jni/utils/include/misc.h +++ b/native/jni/utils/include/misc.h @@ -10,7 +10,6 @@ extern "C" { unsigned get_shell_uid(); int fork_dont_care(); int fork_no_zombie(); -void gen_rand_str(char *buf, int len); int strend(const char *s1, const char *s2); char *rtrim(char *str); void init_argv0(int argc, char **argv); @@ -24,6 +23,8 @@ int parse_int(const char *s); #include #include +void gen_rand_str(char *buf, int len, bool varlen = true); + #define str_contains(s, ss) ((ss) != nullptr && (s).find(ss) != std::string::npos) #define str_starts(s, ss) ((ss) != nullptr && (s).compare(0, strlen(ss), ss) == 0) diff --git a/native/jni/utils/misc.cpp b/native/jni/utils/misc.cpp index 456b3e4b3..f0a270568 100644 --- a/native/jni/utils/misc.cpp +++ b/native/jni/utils/misc.cpp @@ -1,6 +1,10 @@ /* misc.cpp - Store all functions that are unable to be catagorized clearly */ - + +#include +#include +#include +#include #include #include #include @@ -8,10 +12,7 @@ #include #include #include -#include -#include -#include -#include +#include #include #include @@ -49,17 +50,27 @@ int fork_no_zombie() { return 0; } -static bool rand_init = false; - -void gen_rand_str(char *buf, int len) { - constexpr const char base[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - if (!rand_init) { - srand(time(nullptr)); - rand_init = true; +constexpr char ALPHANUM[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; +static bool seeded = false; +static std::mt19937 gen; +static std::uniform_int_distribution dist(0, sizeof(ALPHANUM) - 1); +void gen_rand_str(char *buf, int len, bool varlen) { + if (!seeded) { + if (access("/dev/urandom", F_OK) == 0) { + std::random_device rdev; + gen.seed(rdev()); + } else { + // In magiskinit + gen.seed(time(nullptr)); + } + seeded = true; } - for (int i = 0; i < len - 1; ++i) { - buf[i] = base[rand() % (sizeof(base) - 1)]; + if (varlen) { + std::uniform_int_distribution len_dist(len / 2, len); + len = len_dist(gen); } + for (int i = 0; i < len - 1; ++i) + buf[i] = ALPHANUM[dist(gen)]; buf[len - 1] = '\0'; }