📱 objection - runtime mobile exploration
This report summarizes scanner evidence for sensepost/objection, a Python project with 9,436 GitHub stars. SynthScan examined 22,918 lines of code across 344 source files, recording 362 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 29.7 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 292 finding(s).
Are imports declared and package/API names verified? 29 finding(s).
Are wrappers, guards, and repeated structures necessary? 293 finding(s).
Which changes need focused human review? 362 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 362 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | objection/utils/helpers.py | 125 | def print_frida_connection_help() -> None: | CODE |
| LOW | objection/utils/helpers.py | 149 | def warn_about_older_operating_systems() -> None: | CODE |
| LOW | objection/utils/patchers/ios.py | 330 | def patch_and_codesign_binary(self, frida_gadget: str, codesign_signature: str, gadget_config: str) -> None: | CODE |
| LOW | objection/utils/patchers/ios.py | 450 | def _set_bundle_id_from_profile(self): | CODE |
| LOW | objection/utils/patchers/android.py | 391 | def get_temp_working_directory(self) -> str: | CODE |
| LOW | objection/utils/patchers/android.py | 429 | def inject_internet_permission(self): | CODE |
| LOW | objection/utils/patchers/android.py | 463 | def extract_native_libs_patch(self): | CODE |
| LOW | objection/utils/patchers/android.py | 531 | def add_network_security_config(self): | CODE |
| LOW | objection/utils/patchers/android.py | 586 | def _determine_smali_path_for_class(self, target_class) -> str: | CODE |
| LOW | objection/utils/patchers/android.py | 631 | def _determine_end_of_smali_method_from_line(smali: list, start: int) -> int: | CODE |
| LOW | objection/utils/patchers/android.py | 666 | def _determine_first_inject_point_of_smali_method_from_line(smali: list, start: int) -> int: | CODE |
| LOW | objection/utils/patchers/android.py | 704 | def _patch_smali_with_load_library(self, smali_lines: list, inject_marker: int) -> list: | CODE |
| LOW | objection/commands/memory.py | 27 | def _should_only_dump_offsets(args: list) -> bool: | CODE |
| LOW | objection/commands/filemanager.py | 301 | def _humanize_size_if_possible(size: str) -> str: | CODE |
| LOW | objection/commands/filemanager.py | 807 | def _get_short_android_listing() -> list: | CODE |
| LOW | objection/commands/filemanager.py | 845 | def list_folders_in_current_fm_directory() -> dict: | CODE |
| LOW | objection/commands/filemanager.py | 879 | def list_files_in_current_fm_directory() -> dict: | CODE |
| LOW | objection/commands/filemanager.py | 913 | def list_content_in_current_fm_directory() -> dict: | CODE |
| LOW | objection/commands/frida_commands.py | 10 | def _should_disable_exception_handler(args: list = None) -> bool: | CODE |
| LOW | objection/commands/ios/heap.py | 12 | def _should_ignore_methods_with_arguments(args) -> bool: | CODE |
| LOW | objection/commands/ios/heap.py | 45 | def _should_interpret_inline_js(args) -> bool: | CODE |
| LOW | objection/commands/ios/bundles.py | 8 | def _should_include_apple_bundles(args: list) -> bool: | CODE |
| LOW | objection/commands/ios/hooking.py | 52 | def _should_ignore_native_classes(args: list) -> bool: | CODE |
| LOW | objection/commands/ios/hooking.py | 67 | def _should_include_parent_methods(args: list) -> bool: | CODE |
| LOW | objection/commands/ios/hooking.py | 82 | def _class_is_prefixed_with_native(class_name: str) -> bool: | CODE |
| LOW | objection/commands/ios/hooking.py | 132 | def _should_dump_return_value(args: list) -> bool: | CODE |
| LOW | objection/commands/ios/hooking.py | 143 | def _should_print_only_classes(args: list) -> bool: | CODE |
| LOW | objection/commands/ios/keychain.py | 33 | def _data_flag_has_identifier(args: list) -> bool: | CODE |
| LOW | objection/commands/android/heap.py | 12 | def _should_ignore_methods_with_arguments(args) -> bool: | CODE |
| LOW | objection/commands/android/hooking.py | 76 | def _should_dump_return_value(args: list = None) -> bool: | CODE |
| LOW | objection/commands/android/hooking.py | 109 | def _should_print_only_classes(args: list = None) -> bool: | CODE |
| LOW | objection/commands/android/hooking.py | 162 | def show_android_class_loaders(args: list = None) -> None: | CODE |
| LOW | objection/commands/android/hooking.py | 179 | def show_android_class_methods(args: list = None) -> None: | CODE |
| LOW | objection/commands/android/hooking.py | 329 | def show_registered_broadcast_receivers(args: list = None) -> None: | CODE |
| LOW | objection/commands/android/hooking.py | 361 | def show_registered_activities(args: list = None) -> None: | CODE |
| LOW | objection/console/repl.py | 174 | def _find_command_exec_method(self, tokens: list) -> tuple: | CODE |
| LOW | tests/helpers.py | 23 | def normalize_table_whitespace(text: str) -> str: | CODE |
| LOW⚡ | tests/utils/test_helpers.py | 14 | def test_pretty_concat_with_less_than_seventy_five_chars(self): | CODE |
| LOW⚡ | tests/utils/test_helpers.py | 19 | def test_pretty_concat_with_more_than_max_chars(self): | CODE |
| LOW⚡ | tests/utils/test_helpers.py | 24 | def test_pretty_concat_with_more_than_max_chars_to_the_left(self): | CODE |
| LOW⚡ | tests/utils/test_helpers.py | 29 | def test_sizeof_formats_values(self): | CODE |
| LOW⚡ | tests/utils/test_helpers.py | 34 | def test_gets_tokens_without_quotes(self): | CODE |
| LOW⚡ | tests/utils/test_helpers.py | 39 | def test_gets_tokens_with_quotes(self): | CODE |
| LOW⚡ | tests/utils/test_helpers.py | 44 | def test_gets_tokens_and_handles_missing_quotes(self): | CODE |
| LOW⚡ | tests/utils/test_helpers.py | 49 | def test_cleans_argument_lists_with_flags(self): | CODE |
| LOW⚡ | tests/utils/test_helpers.py | 53 | def test_prints_frida_connection_help(self): | CODE |
| LOW | tests/utils/patchers/test_github.py | 32 | def test_makes_call_and_stores_result_in_cache(self, mock_requests): | CODE |
| LOW | tests/utils/patchers/test_github.py | 45 | def test_makes_call_and_stores_result_in_cache_and_fetches_next_from_cache(self, mock_requests): | CODE |
| LOW | tests/utils/patchers/test_github.py | 67 | def test_makes_call_and_gets_latest_version(self, mock_requests): | CODE |
| LOW | tests/utils/patchers/test_github.py | 79 | def test_makes_call_and_fails_to_get_assets(self, mock_requests): | CODE |
| LOW | tests/utils/patchers/test_github.py | 90 | def test_makes_call_and_gets_assets(self, mock_requests): | CODE |
| LOW | tests/utils/patchers/test_ios.py | 42 | def test_checks_if_gadget_exists(self, mock_os): | CODE |
| LOW | tests/utils/patchers/test_ios.py | 49 | def test_can_find_asset_download_url(self): | CODE |
| LOW | tests/utils/patchers/test_ios.py | 65 | def test_sets_provisioning_profile(self): | CODE |
| LOW⚡ | tests/utils/patchers/test_android.py | 39 | def test_raises_exception_with_invalid_architecture(self): | CODE |
| LOW⚡ | tests/utils/patchers/test_android.py | 43 | def test_sets_architecture_and_returns_context(self): | CODE |
| LOW⚡ | tests/utils/patchers/test_android.py | 47 | def test_gets_architecture_when_set(self): | CODE |
| LOW⚡ | tests/utils/patchers/test_android.py | 53 | def test_gets_frida_library_path(self): | CODE |
| LOW⚡ | tests/utils/patchers/test_android.py | 59 | def test_fails_to_get_frida_library_path_without_architecture(self): | CODE |
| LOW⚡ | tests/utils/patchers/test_android.py | 64 | def test_checks_if_gadget_exists_if_it_really_exists(self, mock_os): | CODE |
| 191 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | objection/utils/agent.py | 16 | from objection.utils.helpers import debug_print | CODE |
| CRITICAL | objection/utils/plugin.py | 5 | from objection.utils.helpers import debug_print | CODE |
| CRITICAL | objection/commands/ios/plist.py | 6 | from objection.utils.helpers import is_unix_absolute_path | CODE |
| CRITICAL | objection/commands/ios/bundles.py | 5 | from objection.utils.helpers import pretty_concat | CODE |
| CRITICAL | objection/commands/ios/hooking.py | 7 | from objection.utils.helpers import clean_argument_flags | CODE |
| CRITICAL | objection/commands/android/intents.py | 4 | from objection.utils.helpers import clean_argument_flags | CODE |
| CRITICAL | objection/commands/android/hooking.py | 7 | from objection.utils.helpers import clean_argument_flags | CODE |
| CRITICAL | objection/console/cli.py | 10 | from objection.utils.helpers import debug_print, warn_about_older_operating_systems | CODE |
| CRITICAL | …console/helpfiles/android.hooking.set.return_value.txt | 19 | android hooking set return_value com.example.test.encryption.hasKey.overload("java.lang.String") true | CODE |
| CRITICAL | …console/helpfiles/android.hooking.set.return_value.txt | 20 | android hooking set return_value com.example.test.communication.setPinningType.overload("java.lang.String", "[B") fal | CODE |
| CRITICAL⚡ | tests/utils/test_helpers.py | 4 | from objection.utils.helpers import clean_argument_flags | CODE |
| CRITICAL⚡ | tests/utils/test_helpers.py | 5 | from objection.utils.helpers import get_tokens | CODE |
| CRITICAL⚡ | tests/utils/test_helpers.py | 6 | from objection.utils.helpers import pretty_concat | CODE |
| CRITICAL⚡ | tests/utils/test_helpers.py | 7 | from objection.utils.helpers import print_frida_connection_help | CODE |
| CRITICAL⚡ | tests/utils/test_helpers.py | 8 | from objection.utils.helpers import sizeof_fmt | CODE |
| CRITICAL⚡ | tests/utils/test_helpers.py | 9 | from objection.utils.helpers import warn_about_older_operating_systems | CODE |
| CRITICAL | agent/src/android/hooking.ts | 304 | // public final rx.c.b<java.lang.Throwable> com.apple.android.music.icloud.a.a(rx.c.b<java.lang.Throwable>) | COMMENT |
| CRITICAL | agent/src/android/hooking.ts | 486 | currentApplication.mLoadedApk.value.mServices.value.values().toArray().map((potentialServices) => { | CODE |
| CRITICAL | agent/src/android/hooking.ts | 520 | currentApplication.mLoadedApk.value.mReceivers.value.values().toArray().map((potentialReceivers) => { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | objection/commands/memory.py | 0 | checks if --smart is in the list of tokens received from the command line. :param args: :return: | STRING |
| HIGH | objection/commands/filemanager.py | 0 | checks if --smart is in the list of tokens received from the command line. :param args: :return: | STRING |
| HIGH | objection/commands/ios/keychain.py | 0 | checks if --smart is in the list of tokens received from the command line. :param args: :return: | STRING |
| HIGH | objection/commands/android/keystore.py | 0 | checks if --smart is in the list of tokens received from the command line. :param args: :return: | STRING |
| HIGH | objection/commands/ios/cookies.py | 0 | check if --json is part of the arguments. :param args: :return: | STRING |
| HIGH | objection/commands/ios/hooking.py | 0 | check if --json is part of the arguments. :param args: :return: | STRING |
| HIGH | objection/commands/android/hooking.py | 0 | check if --json is part of the arguments. :param args: :return: | STRING |
| HIGH | objection/commands/ios/hooking.py | 0 | check if --dump-backtrace is part of the arguments. :param args: :return: | STRING |
| HIGH | objection/commands/android/intents.py | 0 | check if --dump-backtrace is part of the arguments. :param args: :return: | STRING |
| HIGH | objection/commands/android/hooking.py | 0 | check if --dump-backtrace is part of the arguments. :param args: :return: | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | objection/utils/__init__.py | 59 | except Exception: | CODE |
| HIGH | objection/utils/agent.py | 247 | except ValueError: | CODE |
| HIGH | objection/utils/agent.py | 228 | except frida.InvalidArgumentError: | CODE |
| HIGH | objection/utils/agent.py | 254 | except frida.ProcessNotFoundError: | CODE |
| HIGH | objection/utils/helpers.py | 174 | except Exception: | CODE |
| HIGH | objection/console/repl.py | 405 | except KeyboardInterrupt: | CODE |
| HIGH | objection/console/repl.py | 315 | except (frida.InvalidOperationError, Exception): | CODE |
| HIGH | objection/console/repl.py | 321 | except (frida.InvalidOperationError, Exception): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | objection/utils/assets/javahookmanager.js | 1 | // Frida Java hooking helper class. | COMMENT |
| LOW | objection/utils/assets/javahookmanager.js | 141 | // console.log(JSON.stringify(args)); | COMMENT |
| LOW | objection/utils/assets/objchookmanager.js | 1 | // Frida Objective-C hooking helper class. | COMMENT |
| LOW | objection/console/completer.py | 41 | # we will also cleanup flags that come in the form | COMMENT |
| LOW | objection/console/commands.py | 141 | 'dynamic': filemanager.list_content_in_current_fm_directory, | COMMENT |
| LOW | agent/src/ios/userinterface.ts | 41 | // Instead of using `ObjC.choose()` and looking for UIViewController instances | COMMENT |
| LOW | agent/src/ios/userinterface.ts | 61 | // dispatch_async(dispatch_get_main_queue(), ^{ | COMMENT |
| LOW | agent/src/ios/keychain.ts | 41 | // | COMMENT |
| LOW | agent/src/ios/keychain.ts | 61 | // continue; | COMMENT |
| LOW | agent/src/ios/crypto.ts | 181 | // selected (by the absence of any mode bits in | COMMENT |
| LOW | agent/src/ios/crypto.ts | 241 | // args[3] Raw key material, length keyLength bytes. | COMMENT |
| LOW | agent/src/ios/pinning.ts | 21 | // - NSURLSession. | COMMENT |
| LOW | agent/src/ios/pinning.ts | 221 | // Example handler source | COMMENT |
| LOW | agent/src/ios/lib/constants.ts | 61 | // tslint:disable-next-line:max-line-length | COMMENT |
| LOW | agent/src/android/keystore.ts | 21 | // Ref: https://developer.android.com/reference/java/security/KeyStore.html | COMMENT |
| LOW | agent/src/android/keystore.ts | 141 | var a = aliases.nextElement(); | COMMENT |
| LOW | agent/src/android/shell.ts | 21 | // | COMMENT |
| LOW | agent/src/android/pinning.ts | 21 | COMMENT | |
| LOW | agent/src/android/pinning.ts | 81 | SSLContextInit.call(this, keyManager, TrustManagers, secureRandom); | COMMENT |
| LOW | agent/src/android/pinning.ts | 141 | // Example used to test this bypass. | COMMENT |
| LOW | agent/src/generic/http.ts | 61 | // return; | COMMENT |
| LOW | agent/src/generic/http.ts | 81 | COMMENT | |
| LOW | .github/workflows/codeql-analysis.yml | 41 | # By default, queries listed here will override any specified in a config file. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | objection/__init__.py | 21 | except Exception: | CODE |
| LOW | objection/utils/__init__.py | 59 | except Exception: | CODE |
| LOW | objection/utils/agent.py | 73 | except Exception as e: | CODE |
| LOW | objection/utils/agent.py | 107 | except Exception as e: | CODE |
| LOW | objection/utils/agent.py | 208 | except Exception as e: | CODE |
| LOW | objection/utils/update_checker.py | 94 | except Exception: | CODE |
| LOW | objection/utils/helpers.py | 174 | except Exception: | CODE |
| LOW | objection/utils/patchers/ios.py | 77 | except Exception: | CODE |
| LOW | objection/utils/patchers/ios.py | 116 | except Exception: | CODE |
| LOW | objection/utils/patchers/ios.py | 524 | except Exception as err: | CODE |
| LOW | objection/utils/patchers/android.py | 997 | except Exception as err: | CODE |
| LOW | objection/api/rpc.py | 36 | except Exception as e: | CODE |
| LOW | objection/api/rpc.py | 51 | except Exception as e: | CODE |
| LOW | objection/api/script.py | 33 | except Exception as e: | CODE |
| LOW | objection/commands/memory.py | 154 | except Exception as e: | CODE |
| LOW | objection/commands/plugin_manager.py | 52 | except Exception as e: | CODE |
| LOW | objection/console/repl.py | 337 | except Exception as e: | CODE |
| LOW | objection/console/repl.py | 399 | except Exception as e: | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | objection/utils/agent.py | 79 | CODE | |
| LOW | objection/utils/agent.py | 155 | CODE | |
| LOW | objection/utils/agent.py | 190 | CODE | |
| LOW | objection/utils/agent.py | 321 | CODE | |
| LOW | objection/commands/memory.py | 107 | CODE | |
| LOW | objection/commands/android/hooking.py | 261 | CODE | |
| LOW | objection/console/repl.py | 174 | CODE | |
| LOW | objection/console/repl.py | 283 | CODE | |
| LOW | objection/console/repl.py | 345 | CODE | |
| LOW | objection/console/completer.py | 19 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | objection/utils/patchers/ios.py | 147 | 'installation': ('git clone https://github.com/Tyilo/insert_dylib && cd insert_dylib &&' | CODE |
| HIGH | objection/utils/patchers/ios.py | 148 | 'xcodebuild && cp build/Release/insert_dylib /usr/local/bin/insert_dylib') | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | objection/utils/assets/javahookmanager.js | 30 | print(message) { | CODE |
| HIGH | objection/utils/assets/objchookmanager.js | 30 | print(message) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | objection/utils/patchers/android.py | 371 | # that fits we can just return and move on | COMMENT |
| LOW | objection/commands/filemanager.py | 861 | # just return. | COMMENT |
| LOW | objection/commands/filemanager.py | 895 | # just return. | COMMENT |
| LOW | objection/commands/filemanager.py | 929 | # just return. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | objection/console/commands.py | 1 | CODE | |
| LOW | plugins/stetho/__init__.py | 6 | CODE | |
| LOW | plugins/flex/__init__.py | 6 | CODE | |
| LOW | tests/utils/test_helpers.py | 3 | CODE | |
| LOW | tests/utils/test_helpers.py | 3 | CODE | |
| LOW | tests/utils/test_helpers.py | 9 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | objection/utils/update_checker.py | 41 | def update_version_cache(version: str) -> None: | CODE |
| LOW | objection/utils/patchers/ios.py | 192 | def set_provsioning_profile(self, provision_file: str = None, bundle_id: str = None) -> None: | CODE |
| LOW | objection/utils/patchers/ios.py | 304 | def set_application_binary(self, binary: str = None) -> None: | CODE |
| LOW | objection/commands/ios/hooking.py | 253 | def set_method_return_value(args: list) -> None: | CODE |
| LOW | objection/commands/android/hooking.py | 391 | def set_method_return_value(args: list = None) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | objection/utils/patchers/android.py | 486 | # Check if the flag is present and set to false | COMMENT |
| LOW | objection/utils/patchers/android.py | 736 | # Check if there is an existing clinit here. If there is, then we need | COMMENT |
| LOW | objection/commands/android/hooking.py | 22 | # Check if CLASS and METHOD is defined at all | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | objection/commands/mobile_packages.py | 99 | CODE |