cloudfox-coreshift-core 2.26.1

Low-level Linux and Android systems primitives for CoreShift (CloudFox)
Documentation
//! Verify every DEX resolver lookup lands on a real framework.jar.
//!
//! Run:  cargo run --example verify_dex -- /path/to/framework.jar
//!
//! Exercises the same `find_transaction_code` parser the resolvers use,
//! against a jar pulled from a live device (`adb pull /system/framework/framework.jar`).
//! Each line: resolver -> value | MISSING.

use std::process::ExitCode;

fn main() -> ExitCode {
    let jar = std::env::args().nth(1).unwrap_or_else(|| {
        eprintln!("usage: verify_dex <framework.jar>");
        std::process::exit(2);
    });

    let mut missing = 0usize;

    macro_rules! check {
        ($name:expr, $class:expr, $field:expr) => {{
            let v = coreshift_core::android::dex::find_transaction_code(&jar, $class, $field);
            match v {
                Some(code) => println!("{:<28} = {code}", $name),
                None => {
                    println!("{:<28} = MISSING", $name);
                    missing += 1;
                }
            }
            v
        }};
    }

    // IActivityManager
    check!(
        "AM registerProcessObserver",
        "Landroid/app/IActivityManager$Stub;",
        "TRANSACTION_registerProcessObserver"
    );
    check!(
        "AM getFocusedRootTaskInfo",
        "Landroid/app/IActivityManager$Stub;",
        "TRANSACTION_getFocusedRootTaskInfo"
    );
    check!(
        "AM getFocusedStackInfo",
        "Landroid/app/IActivityManager$Stub;",
        "TRANSACTION_getFocusedStackInfo"
    );
    check!(
        "AM registerForegroundProcessObserver",
        "Landroid/app/IActivityManager$Stub;",
        "TRANSACTION_registerForegroundProcessObserver"
    );
    check!(
        "AM getContentProviderExternal",
        "Landroid/app/IActivityManager$Stub;",
        "TRANSACTION_getContentProviderExternal"
    );
    check!(
        "AM removeContentProviderExternalAsUser",
        "Landroid/app/IActivityManager$Stub;",
        "TRANSACTION_removeContentProviderExternalAsUser"
    );
    check!(
        "AM registerUidObserver",
        "Landroid/app/IActivityManager$Stub;",
        "TRANSACTION_registerUidObserver"
    );
    check!(
        "AM unregisterUidObserver",
        "Landroid/app/IActivityManager$Stub;",
        "TRANSACTION_unregisterUidObserver"
    );
    check!(
        "AM registerUidObserverForUids",
        "Landroid/app/IActivityManager$Stub;",
        "TRANSACTION_registerUidObserverForUids"
    );

    // Observers
    check!(
        "IProcessObserver onForegroundActivitiesChanged",
        "Landroid/app/IProcessObserver$Stub;",
        "TRANSACTION_onForegroundActivitiesChanged"
    );
    check!(
        "IForegroundProcessObserver onForegroundProcessChanged",
        "Landroid/app/IForegroundProcessObserver$Stub;",
        "TRANSACTION_onForegroundProcessChanged"
    );
    check!(
        "IUidObserver onUidGone",
        "Landroid/app/IUidObserver$Stub;",
        "TRANSACTION_onUidGone"
    );
    check!(
        "IUidObserver onUidActive",
        "Landroid/app/IUidObserver$Stub;",
        "TRANSACTION_onUidActive"
    );
    check!(
        "IUidObserver onUidIdle",
        "Landroid/app/IUidObserver$Stub;",
        "TRANSACTION_onUidIdle"
    );
    check!(
        "IUidObserver onUidCachedChanged",
        "Landroid/app/IUidObserver$Stub;",
        "TRANSACTION_onUidCachedChanged"
    );
    check!(
        "IUidObserver onUidStateChanged",
        "Landroid/app/IUidObserver$Stub;",
        "TRANSACTION_onUidStateChanged"
    );
    check!(
        "IUidObserver onUidProcAdjChanged",
        "Landroid/app/IUidObserver$Stub;",
        "TRANSACTION_onUidProcAdjChanged"
    );

    // Display / Power
    check!(
        "IDisplayManager registerCallback",
        "Landroid/hardware/display/IDisplayManager$Stub;",
        "TRANSACTION_registerCallback"
    );
    check!(
        "IDisplayManager getDisplayInfo",
        "Landroid/hardware/display/IDisplayManager$Stub;",
        "TRANSACTION_getDisplayInfo"
    );
    check!(
        "IPowerManager isInteractive",
        "Landroid/os/IPowerManager$Stub;",
        "TRANSACTION_isInteractive"
    );

    // FPS / TaskStack
    check!(
        "IWindowManager registerTaskFpsCallback",
        "Landroid/view/IWindowManager$Stub;",
        "TRANSACTION_registerTaskFpsCallback"
    );
    check!(
        "IWindowManager unregisterTaskFpsCallback",
        "Landroid/view/IWindowManager$Stub;",
        "TRANSACTION_unregisterTaskFpsCallback"
    );
    check!(
        "ITaskFpsCallback onFpsReported",
        "Landroid/window/ITaskFpsCallback$Stub;",
        "TRANSACTION_onFpsReported"
    );
    check!(
        "IActivityTaskManager registerTaskStackListener",
        "Landroid/app/IActivityTaskManager$Stub;",
        "TRANSACTION_registerTaskStackListener"
    );
    check!(
        "IActivityTaskManager unregisterTaskStackListener",
        "Landroid/app/IActivityTaskManager$Stub;",
        "TRANSACTION_unregisterTaskStackListener"
    );

    println!("\nmissing: {missing}");
    if missing == 0 {
        ExitCode::SUCCESS
    } else {
        ExitCode::FAILURE
    }
}