diff --git a/cli/src/main.rs b/cli/src/main.rs index b73f21f..7fe3286 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -32,6 +32,19 @@ extern "C" { } fn main() -> ExitCode { + std::panic::set_hook(Box::new(|panic| { + use termion::raw::IntoRawMode; + if let Ok(mut stderr) = io::stderr().into_raw_mode() { + let _ = writeln!(stderr, "\r\n{panic}\r\n"); + let _ = writeln!(stderr, "This should not have happened.\r"); + let _ = writeln!( + stderr, + "Report at https://github.com/j-hc/zygisk-detach/issues\r" + ); + let _ = write!(stderr, "{}", cursor::Show); + } + })); + let mut args = std::env::args().skip(1); if matches!(args.next().as_deref(), Some("--serialize")) { match args.next() { @@ -52,7 +65,7 @@ fn main() -> ExitCode { } let ret = match interactive() { - Ok(_) => ExitCode::SUCCESS, + Ok(()) => ExitCode::SUCCESS, Err(err) => { eprintln!("\rERROR: {err}"); ExitCode::FAILURE @@ -162,9 +175,11 @@ fn get_detached_apps(detach_txt: &[u8]) -> Vec<(String, Range)> { let len: u8 = detach_txt[i]; const SZ_LEN: usize = size_of::(); i += SZ_LEN; - let encoded_name = &detach_txt - .get(i..i + len as usize) - .expect("corrupted detach.bin"); + let Some(encoded_name) = &detach_txt.get(i..i + len as usize) else { + eprintln!("Corrupted detach.bin. Reset and try again."); + let _ = cursor_show(); + std::process::exit(1); + }; let name = String::from_utf8(encoded_name.iter().step_by(2).cloned().collect()).unwrap(); detached.push((name, i - SZ_LEN..i + len as usize)); i += len as usize; diff --git a/zygisk/jni/module.cpp b/zygisk/jni/module.cpp index 00b776a..b34be99 100644 --- a/zygisk/jni/module.cpp +++ b/zygisk/jni/module.cpp @@ -115,12 +115,11 @@ class Sigringe : public zygisk::ModuleBase { FILE* fp = fopen("/proc/self/maps", "r"); if (!fp) return false; char mapbuf[256]; - while (fgets(mapbuf, sizeof mapbuf, fp)) { + while (fgets(mapbuf, sizeof(mapbuf), fp)) { char flags[8]; unsigned int dev_major, dev_minor; int cur; - sscanf(mapbuf, "%*s %s %*x %x:%x %lu%n", flags, &dev_major, &dev_minor, inode, &cur); - while (mapbuf[cur] != '\n') cur++; + sscanf(mapbuf, "%*s %s %*x %x:%x %lu %*s%n", flags, &dev_major, &dev_minor, inode, &cur); if (memcmp(&mapbuf[cur - 12], "libbinder.so", 12) == 0 && flags[2] == 'x') { *dev = makedev(dev_major, dev_minor); fclose(fp); @@ -140,7 +139,7 @@ class Sigringe : public zygisk::ModuleBase { if (size <= 0) { LOGD("ERROR: detach.bin <= 0"); return 0; - } else if (size > DETACH_CAP - 1) { // -1 because for the null terminator + } else if (size > DETACH_CAP - 1) { // -1 because of the null terminator LOGD("ERROR: detach.bin > %d", DETACH_CAP - 1); return 0; } diff --git a/zygisk/jni/parcel.cpp b/zygisk/jni/parcel.cpp index 1f4766d..07d2d7c 100644 --- a/zygisk/jni/parcel.cpp +++ b/zygisk/jni/parcel.cpp @@ -28,15 +28,15 @@ char16_t* FakeParcel::readString16(uint32_t len) { return s; } -bool FakeParcel::enforceInterfaceIntent() { - readInt32(); - readInt32(); - uint32_t len = readInt32(); - readString16(len); // pi; - readInt32(); - return PM_DESCRIPTOR_LEN == len; - // return String16Eq(PM_DESCRIPTOR, PM_DESCRIPTOR_LEN, pi, len); -} +// bool FakeParcel::enforceInterfaceIntent() { +// readInt32(); +// readInt32(); +// uint32_t len = readInt32(); +// readString16(len); // pi; +// readInt32(); +// return PM_DESCRIPTOR_LEN == len; +// // return String16Eq(PM_DESCRIPTOR, PM_DESCRIPTOR_LEN, pi, len); +// } bool FakeParcel::enforceInterfaceInfo() { readInt32(); @@ -45,12 +45,13 @@ bool FakeParcel::enforceInterfaceInfo() { uint32_t len = readInt32(); readString16(len); // pi; return PM_DESCRIPTOR_LEN == len; - // return String16Eq(len == PM_DESCRIPTOR_LEN && !memcmp(pi, PM_DESCRIPTOR, len * sizeof(char16_t))); + // return String16Eq(PM_DESCRIPTOR, PM_DESCRIPTOR_LEN, pi, len); } bool FakeParcel::enforceInterface(uint32_t code) { switch (code) { case 3: + case 9: case 51: case 83: return enforceInterfaceInfo(); diff --git a/zygisk/jni/parcel.hpp b/zygisk/jni/parcel.hpp index 6de9d42..bfea9ab 100644 --- a/zygisk/jni/parcel.hpp +++ b/zygisk/jni/parcel.hpp @@ -10,7 +10,7 @@ struct FakeParcel { void skip(size_t skip); uint32_t readInt32(); char16_t* readString16(uint32_t len); - bool enforceInterfaceIntent(); + // bool enforceInterfaceIntent(); bool enforceInterfaceInfo(); bool enforceInterface(uint32_t code); };