void remount_service(int fd, void *cookie) { int ret = remount_system(); if (!ret) write_string(fd, "remount succeeded\n"); else { char buffer[200]; snprintf(buffer, sizeof(buffer), "remount failed: %s\n", strerror(errno)); write_string(fd, buffer); } sdb_close(fd); }
int main(int argc, char ** argv) { char * hijacked_executable = argv[0]; struct stat info; int result = 0; int i; if (NULL != strstr(hijacked_executable, "hijack")) { if (argc >= 2) { return busybox_driver(argc - 1, argv + 1); } return 0; } if ( 0 == stat(RECOVERY_MODE_FILE, &info)) result = remove(RECOVERY_MODE_FILE); result = remount_root("/system/bin/hijack", 1); result = mkdir("/preinstall", S_IRWXU); result = mkdir("/tmp", S_IRWXU); result = mkdir("/res", S_IRWXU); result = mkdir("/res/images", S_IRWXU); result = remove("/etc"); result = mkdir("/etc", S_IRWXU); result = rename("/sbin/adbd", "/sbin/adbd.old"); result = property_set("ctl.stop", "runtime"); result = property_set("ctl.stop", "zygote"); result = property_set("persist.service.adb.enable", "1"); printf("mountting cache and mount preinstall"); result = hijack_mount("/system/bin/hijack", "/dev/block/mmcblk0p15", "/cache"); result = hijack_mount("/system/bin/hijack", "/dev/block/mmcblk0p17", "/preinstall"); result = hijack_umount("/preinstall/hijack", "/pds"); result = hijack_umount("/preinstall/hijack", "/osh"); result = remount_system("/preinstall/hijack", 1); char * updater_args[] = { UPDATE_BINARY, "2", "0", RECOVERY_UPDATE_ZIP, NULL }; result = exec_and_wait(updater_args); return result; }