cloudfox-coreshift-core 2.13.0

Low-level Linux and Android systems primitives for CoreShift (CloudFox)
Documentation
use coreshift_core::android::dex::{find_transaction_code, resolve_uid_observer_codes};

fn main() {
    let jar = std::env::args()
        .nth(1)
        .unwrap_or_else(|| "/system/framework/framework.jar".to_string());
    let am = "Landroid/app/IActivityManager$Stub;";
    let uid_obs = "Landroid/app/IUidObserver$Stub;";

    println!("jar = {jar}");
    for (name, desc, field) in [
        ("registerUidObserver", am, "TRANSACTION_registerUidObserver"),
        (
            "registerUidObserverForUids",
            am,
            "TRANSACTION_registerUidObserverForUids",
        ),
        (
            "unregisterUidObserver",
            am,
            "TRANSACTION_unregisterUidObserver",
        ),
        ("onUidGone", uid_obs, "TRANSACTION_onUidGone"),
        ("onUidActive", uid_obs, "TRANSACTION_onUidActive"),
        ("onUidIdle", uid_obs, "TRANSACTION_onUidIdle"),
        (
            "onUidStateChanged",
            uid_obs,
            "TRANSACTION_onUidStateChanged",
        ),
        (
            "onUidProcAdjChanged",
            uid_obs,
            "TRANSACTION_onUidProcAdjChanged",
        ),
        (
            "onUidCachedChanged",
            uid_obs,
            "TRANSACTION_onUidCachedChanged",
        ),
    ] {
        match find_transaction_code(&jar, desc, field) {
            Some(c) => println!("OK   {name:32} {c}"),
            None => println!("MISS {name:32}"),
        }
    }

    match resolve_uid_observer_codes() {
        Some(codes) => println!(
            "resolver: reg={} unreg={} for_uids={:?} gone={} active={} idle={} cached={} state={} adj={}",
            codes.register_code,
            codes.unregister_code,
            codes.register_for_uids_code,
            codes.on_gone_code,
            codes.on_active_code,
            codes.on_idle_code,
            codes.on_cached_code,
            codes.on_state_code,
            codes.on_adj_code,
        ),
        None => println!("resolver: FAILED (hardcoded /system path — needs device run)"),
    }
}