diff options
| author | Mark Rowe <mark@vector35.com> | 2025-08-11 10:42:07 -0700 |
|---|---|---|
| committer | Mark Rowe <mark@vector35.com> | 2025-08-27 19:15:49 -0700 |
| commit | 2303f75b080f6dd0c9a5c669a71f64ce830f5650 (patch) | |
| tree | a49d80ea0a8131a50c16f85e767722679ff08c85 /plugins/workflow_objc/src/lib.rs | |
| parent | b302d7ba796f41b1102ee61feed8b8e212299997 (diff) | |
Rewrite Obj-C workflow in Rust
This is functionally equivalent to the previous workflow_objc, with the
following changes:
1. It mutates the `core.function.metaAnalysis` workflow rather than
registering a new named workflow. The activities now all check for
the presence of the Objective-C metadata added by `ObjCProcessor` to
determine whether they should do work, rather than relying on
`MachoView` to override the function workflow when Objective-C
metadata is present. This fixes
https://github.com/Vector35/binaryninja-api/issues/6779.
2. The auto-inlining of `objc_msgSend` selector stub functions is
performed in a separate activity from the processing of
`objc_msgSend` call sites. The selector stub inlining activity is
configured so that it does not run in `DSCView` as the shared cache
needs different behavior for stub functions more generally that
`SharedCacheWorkflow` already provides.
3. The way that types like `id` and `SEL` are referenced is fixed so
that they show up as `id` rather than `objc_struct*`.
This also replaces the Objective-C portion of the shared cache's
workflow, and incorporates several bug fixes that had been applied to it
but not the standalone Objective-C workflow.
Diffstat (limited to 'plugins/workflow_objc/src/lib.rs')
| -rw-r--r-- | plugins/workflow_objc/src/lib.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/plugins/workflow_objc/src/lib.rs b/plugins/workflow_objc/src/lib.rs new file mode 100644 index 00000000..d877301a --- /dev/null +++ b/plugins/workflow_objc/src/lib.rs @@ -0,0 +1,48 @@ +use binaryninja::{add_optional_plugin_dependency, logger::Logger, settings::Settings}; + +mod activities; +mod error; +mod metadata; +mod workflow; + +pub use error::Error; +use metadata::GlobalState; + +use log::LevelFilter; + +#[no_mangle] +#[allow(non_snake_case)] +pub extern "C" fn CorePluginDependencies() { + add_optional_plugin_dependency("arch_x86"); + add_optional_plugin_dependency("arch_armv7"); + add_optional_plugin_dependency("arch_arm64"); +} + +#[no_mangle] +#[allow(non_snake_case)] +pub extern "C" fn CorePluginInit() -> bool { + Logger::new("Plugin.Objective-C") + .with_level(LevelFilter::Debug) + .init(); + + if workflow::register_activities().is_err() { + log::warn!("Failed to register Objective-C workflow"); + return false; + }; + + let settings = Settings::new(); + settings.register_setting_json( + "analysis.objectiveC.resolveDynamicDispatch", + r#"{ + "title" : "Resolve Dynamic Dispatch Calls", + "type" : "boolean", + "default" : false, + "aliases": ["core.function.objectiveC.assumeMessageSendTarget", "core.function.objectiveC.rewriteMessageSendTarget"], + "description" : "Replaces objc_msgSend calls with direct calls to the first found implementation when the target method is visible. May produce false positives when multiple classes implement the same selector or when selectors conflict with system framework methods." + }"#, + ); + + GlobalState::register_cleanup(); + + true +} |
