Improve handshake between the 2 daemons

This commit is contained in:
topjohnwu 2018-07-06 07:51:17 +08:00
parent 5d5ec08566
commit 46ee2c3f4e
4 changed files with 71 additions and 81 deletions

View File

@ -83,7 +83,7 @@ static void *request_handler(void *args) {
case LATE_START: case LATE_START:
late_start(client); late_start(client);
break; break;
case MONITOR: case HANDSHAKE:
/* Do NOT close the client, make it hold */ /* Do NOT close the client, make it hold */
break; break;
default: default:
@ -121,7 +121,12 @@ void main_daemon() {
close(fd); close(fd);
// Start the log monitor // Start the log monitor
monitor_logs(); loggable = exec_command_sync("/system/bin/logcat", "-d", "-f", "/dev/null", NULL) == 0;
if (loggable) {
connect_daemon2(LOG_DAEMON, &fd);
write_int(fd, HANDSHAKE);
close(fd);
}
struct sockaddr_un sun; struct sockaddr_un sun;
fd = setup_socket(&sun, MAIN_DAEMON); fd = setup_socket(&sun, MAIN_DAEMON);

View File

@ -55,24 +55,6 @@ static void sigpipe_handler(int sig) {
events[HIDE_EVENT].fd = -1; events[HIDE_EVENT].fd = -1;
} }
static void *socket_thread(void *args) {
/* This would block, so separate thread */
while(1) {
int fd = xaccept4(sockfd, NULL, NULL, SOCK_CLOEXEC);
switch(read_int(fd)) {
case HIDE_CONNECT:
pthread_mutex_lock(&lock);
close(events[HIDE_EVENT].fd);
events[HIDE_EVENT].fd = fd;
pthread_mutex_unlock(&lock);
break;
default:
close(fd);
break;
}
}
}
static void *monitor_thread(void *args) { static void *monitor_thread(void *args) {
// Block SIGPIPE to prevent interruption // Block SIGPIPE to prevent interruption
sigset_t block_set; sigset_t block_set;
@ -83,61 +65,19 @@ static void *monitor_thread(void *args) {
sleep(5); sleep(5);
int fd; int fd;
char b; char b;
do { while (1) {
fd = connect_daemon(); fd = connect_daemon();
write_int(fd, MONITOR); write_int(fd, HANDSHAKE);
// This should hold unless the daemon is killed // This should hold unless the daemon is killed
read(fd, &b, sizeof(b)); read(fd, &b, sizeof(b));
// The main daemon crashed, spawn a new one // The main daemon crashed, spawn a new one
close(fd); close(fd);
} while (1); }
} }
void log_daemon() { static void *logcat_thread(void *args) {
setsid();
struct sockaddr_un sun;
sockfd = setup_socket(&sun, LOG_DAEMON);
if (xbind(sockfd, (struct sockaddr*) &sun, sizeof(sun)))
exit(1);
xlisten(sockfd, 10);
LOGI("Magisk v" xstr(MAGISK_VERSION) "(" xstr(MAGISK_VER_CODE) ") logger started\n");
strcpy(argv0, "magisklogd");
// Start worker threads
pthread_t t;
pthread_create(&t, NULL, monitor_thread, NULL);
pthread_detach(t);
xpthread_create(&t, NULL, socket_thread, NULL);
pthread_detach(t);
// Set SIGPIPE handler
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = sigpipe_handler;
sigaction(SIGPIPE, &act, NULL);
// Setup log dumps
rename(LOGFILE, LOGFILE ".bak");
events[LOG_EVENT].fd = xopen(LOGFILE, O_CREAT | O_WRONLY | O_TRUNC | O_CLOEXEC | O_APPEND, 0644);
// Construct cmdline
vec_init(&log_cmd);
vec_push_back(&log_cmd, "/system/bin/logcat");
// Test whether these buffers actually works
const char* b[] = { "main", "events", "crash" };
for (int i = 0; i < 3; ++i) {
if (exec_command_sync("/system/bin/logcat", "-b", b[i], "-d", "-f", "/dev/null", NULL) == 0)
vec_push_back_all(&log_cmd, "-b", b[i], NULL);
}
vec_dup(&log_cmd, &clear_cmd);
vec_push_back_all(&log_cmd, "-v", "threadtime", "-s", "am_proc_start", "Magisk", "*:F", NULL);
vec_push_back(&log_cmd, NULL);
vec_push_back(&clear_cmd, "-c");
vec_push_back(&clear_cmd, NULL);
int log_fd = -1, log_pid; int log_fd = -1, log_pid;
char line[PIPE_BUF]; char line[4096];
while (1) { while (1) {
// Start logcat // Start logcat
log_pid = exec_array(0, &log_fd, NULL, (char **) vec_entry(&log_cmd)); log_pid = exec_array(0, &log_fd, NULL, (char **) vec_entry(&log_cmd));
@ -166,13 +106,61 @@ void log_daemon() {
} }
} }
/* Start new threads to monitor logcat and dump to logfile */ void log_daemon() {
void monitor_logs() { setsid();
loggable = exec_command_sync("/system/bin/logcat", "-d", "-f", "/dev/null", NULL) == 0; struct sockaddr_un sun;
if (loggable) { sockfd = setup_socket(&sun, LOG_DAEMON);
int fd; if (xbind(sockfd, (struct sockaddr*) &sun, sizeof(sun)))
connect_daemon2(LOG_DAEMON, &fd); exit(1);
write_int(fd, DO_NOTHING); xlisten(sockfd, 10);
LOGI("Magisk v" xstr(MAGISK_VERSION) "(" xstr(MAGISK_VER_CODE) ") logger started\n");
strcpy(argv0, "magisklogd");
// Set SIGPIPE handler
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = sigpipe_handler;
sigaction(SIGPIPE, &act, NULL);
// Setup log dumps
rename(LOGFILE, LOGFILE ".bak");
events[LOG_EVENT].fd = xopen(LOGFILE, O_CREAT | O_WRONLY | O_TRUNC | O_CLOEXEC | O_APPEND, 0644);
// Construct cmdline
vec_init(&log_cmd);
vec_push_back(&log_cmd, "/system/bin/logcat");
// Test whether these buffers actually works
const char* b[] = { "main", "events", "crash" };
for (int i = 0; i < 3; ++i) {
if (exec_command_sync("/system/bin/logcat", "-b", b[i], "-d", "-f", "/dev/null", NULL) == 0)
vec_push_back_all(&log_cmd, "-b", b[i], NULL);
}
vec_dup(&log_cmd, &clear_cmd);
vec_push_back_all(&log_cmd, "-v", "threadtime", "-s", "am_proc_start", "Magisk", "*:F", NULL);
vec_push_back(&log_cmd, NULL);
vec_push_back(&clear_cmd, "-c");
vec_push_back(&clear_cmd, NULL);
// Start worker threads
pthread_t thread;
pthread_create(&thread, NULL, monitor_thread, NULL);
pthread_detach(thread);
xpthread_create(&thread, NULL, logcat_thread, NULL);
pthread_detach(thread);
while(1) {
int fd = xaccept4(sockfd, NULL, NULL, SOCK_CLOEXEC);
switch(read_int(fd)) {
case HIDE_CONNECT:
pthread_mutex_lock(&lock);
close(events[HIDE_EVENT].fd);
events[HIDE_EVENT].fd = fd;
pthread_mutex_unlock(&lock);
break;
case HANDSHAKE:
default:
close(fd); close(fd);
break;
}
} }
} }

View File

@ -25,8 +25,8 @@ enum {
ADD_HIDELIST, ADD_HIDELIST,
RM_HIDELIST, RM_HIDELIST,
LS_HIDELIST, LS_HIDELIST,
MONITOR, HIDE_CONNECT,
HIDE_CONNECT HANDSHAKE
}; };
// Return codes for daemon // Return codes for daemon
@ -55,6 +55,7 @@ void auto_start_magiskhide();
// log_monitor.c // log_monitor.c
extern int loggable;
void log_daemon(); void log_daemon();
// socket.c // socket.c

View File

@ -46,10 +46,6 @@
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#define PLOGE(fmt, args...) LOGE(fmt " failed with %d: %s", ##args, errno, strerror(errno)) #define PLOGE(fmt, args...) LOGE(fmt " failed with %d: %s", ##args, errno, strerror(errno))
extern int loggable;
void monitor_logs();
#endif #endif
/******************** /********************