1 view
mvt-project/mvt
MVT (Mobile Verification Toolkit) helps with conducting forensics of mobile devices in order to find signs of a potential compromise.
Python★ 14,757+272 that day#7 on trending
C62.4/100
Duplication40
11.8% in python, bash, perlDead code89
1.2%Complexity70
26.3% The score is jscpd's own --health model: markup, data and text left out, tests kept. The numbers below are the trending scan's.
16.1%duplicated code · 3,755 of 23,328 lines
241clones in code
150code files of 307 scanned
10.47%duplicated over all files · 281 clones
Most complex files
- src/mvt/common/command.py142 cx
- src/mvt/common/updates.py130 cx
- src/mvt/common/indicators.py117 cx
- src/mvt/android/modules/intrusion_logs/security_event.py111 cx
- src/mvt/common/module_loader.py87 cx
- tests/common/test_command.py84 cx
- src/mvt/ios/modules/mixed/interactionc.py74 cx
- src/mvt/android/cmd_check_androidqf.py71 cx
- src/mvt/ios/decrypt.py66 cx
- tests/common/test_plugin_updates.py66 cx
Dead code 1.21% unused · 4 findings
- src/mvt/common/plugin_config.pyunused-file
- src/mvt/plugin.pyunused-file
- src/mvt/android/parsers/backup.py:parse_tar_for_smsunused-export
- src/mvt/android/parsers/backup.py:PBKDF2_KEY_SIZEunused-export
The code number leaves out tests, fixtures, docs, examples, data files, styles, translations and vendored code, and 1 generated file: src/mvt/android/parsers/proto/tombstone.py.
Largest clones in the code
- 19 lines in 21 placespython100 tokenssrc/mvt/android/modules/androidqf/aqf_getprop.py:16–34src/mvt/android/modules/androidqf/aqf_packages.py:28–46src/mvt/android/modules/androidqf/aqf_processes.py:16–34src/mvt/android/modules/bugreport/dumpsys_accessibility.py:16–34src/mvt/android/modules/bugreport/dumpsys_adb_state.py:20–38and 16 more
16"""This module extracts data from get properties.""" 17 18def __init__( 19 self, 20 file_path: Optional[str] = None, 21 target_path: Optional[str] = None, 22 results_path: Optional[str] = None, 23 module_options: Optional[dict] = None, 24 log: logging.Logger = logging.getLogger(__name__), 25 results: Optional[ModuleResults] = None,First 10 of 19 lines.
- 13 lines in 24 placespython50 tokenssrc/mvt/android/modules/androidqf/aqf_files.py:43–55src/mvt/android/modules/androidqf/aqf_packages.py:36–48src/mvt/android/modules/androidqf/aqf_processes.py:24–36src/mvt/android/modules/bugreport/dumpsys_accessibility.py:24–36src/mvt/android/modules/bugreport/dumpsys_adb_state.py:28–40and 19 more
43 log: logging.Logger = logging.getLogger(__name__), 44 results: Optional[ModuleResults] = None, 45) -> None: 46 super().__init__( 47 file_path=file_path, 48 target_path=target_path, 49 results_path=results_path, 50 module_options=module_options, 51 log=log, 52 results=results,First 10 of 13 lines.
- 20 lines in 11 placespython102 tokenssrc/mvt/android/modules/androidqf/aqf_getprop.py:16–35src/mvt/android/modules/androidqf/base.py:17–36src/mvt/android/modules/backup/base.py:16–35src/mvt/android/modules/bugreport/base.py:18–38src/mvt/android/modules/bugreport/dumpsys_activities.py:18–38and 6 more
16"""This module extracts data from get properties.""" 17 18def __init__( 19 self, 20 file_path: Optional[str] = None, 21 target_path: Optional[str] = None, 22 results_path: Optional[str] = None, 23 module_options: Optional[dict] = None, 24 log: logging.Logger = logging.getLogger(__name__), 25 results: Optional[ModuleResults] = None,First 10 of 20 lines.
7 more
- 13 lines in 14 placespython54 tokens
- 13 lines in 13 placespython57 tokenssrc/mvt/android/modules/androidqf/aqf_processes.py:24–36src/mvt/android/modules/bugreport/dumpsys_accessibility.py:24–36src/mvt/android/modules/bugreport/dumpsys_adb_state.py:28–40src/mvt/android/modules/bugreport/dumpsys_appops.py:24–36src/mvt/android/modules/bugreport/dumpsys_battery_daily.py:24–36and 8 more
- 14 lines in 11 placespython63 tokens
- 11 lines in 11 placespython61 tokens
- 17 lines in 6 placespython103 tokens
- 19 lines in 6 placespython100 tokens
- 15 lines in 6 placespython90 tokens
Largest clones over all files, tests and data included
- 19 lines in 21 placespython100 tokenssrc/mvt/android/modules/androidqf/aqf_getprop.py:16–34src/mvt/android/modules/androidqf/aqf_packages.py:28–46src/mvt/android/modules/androidqf/aqf_processes.py:16–34src/mvt/android/modules/bugreport/dumpsys_accessibility.py:16–34src/mvt/android/modules/bugreport/dumpsys_adb_state.py:20–38and 16 more
16"""This module extracts data from get properties.""" 17 18def __init__( 19 self, 20 file_path: Optional[str] = None, 21 target_path: Optional[str] = None, 22 results_path: Optional[str] = None, 23 module_options: Optional[dict] = None, 24 log: logging.Logger = logging.getLogger(__name__), 25 results: Optional[ModuleResults] = None,First 10 of 19 lines.
- 13 lines in 24 placespython50 tokenssrc/mvt/android/modules/androidqf/aqf_files.py:43–55src/mvt/android/modules/androidqf/aqf_packages.py:36–48src/mvt/android/modules/androidqf/aqf_processes.py:24–36src/mvt/android/modules/bugreport/dumpsys_accessibility.py:24–36src/mvt/android/modules/bugreport/dumpsys_adb_state.py:28–40and 19 more
43 log: logging.Logger = logging.getLogger(__name__), 44 results: Optional[ModuleResults] = None, 45) -> None: 46 super().__init__( 47 file_path=file_path, 48 target_path=target_path, 49 results_path=results_path, 50 module_options=module_options, 51 log=log, 52 results=results,First 10 of 13 lines.
- 20 lines in 11 placespython102 tokenssrc/mvt/android/modules/androidqf/aqf_getprop.py:16–35src/mvt/android/modules/androidqf/base.py:17–36src/mvt/android/modules/backup/base.py:16–35src/mvt/android/modules/bugreport/base.py:18–38src/mvt/android/modules/bugreport/dumpsys_activities.py:18–38and 6 more
16"""This module extracts data from get properties.""" 17 18def __init__( 19 self, 20 file_path: Optional[str] = None, 21 target_path: Optional[str] = None, 22 results_path: Optional[str] = None, 23 module_options: Optional[dict] = None, 24 log: logging.Logger = logging.getLogger(__name__), 25 results: Optional[ModuleResults] = None,First 10 of 20 lines.
- 104 lines in 2 placestxttests950 tokens
- 100 lines in 2 placestxttests890 tokens
By format, code only
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| python | 140 | 22,510 | 241 | 3,755 | 16.68% |
| bash | 9 | 644 | 0 | 0 | 0% |
| perl | 1 | 174 | 0 | 0 | 0% |
By format, all files
| Format | Files | Lines | Clones | Duplicated lines | Duplication |
|---|---|---|---|---|---|
| python | 225 | 32,935 | 260 | 3,975 | 12.07% |
| txt | 17 | 2,283 | 17 | 390 | 17.08% |
| markdown | 27 | 2,485 | 2 | 22 | 0.89% |
| json | 5 | 2,900 | 1 | 18 | 0.62% |
| yaml | 8 | 350 | 1 | 18 | 5.14% |
| bash | 19 | 718 | 0 | 0 | 0% |
| protobuf | 1 | 195 | 0 | 0 | 0% |
| perl | 1 | 174 | 0 | 0 | 0% |
| toml | 1 | 125 | 0 | 0 | 0% |
| text | 3 | 72 | 0 | 0 | 0% |
Trending appearances
| Day | Rank | Stars | Files | Lines | Clones | All files | Code | Health | Commit |
|---|---|---|---|---|---|---|---|---|---|
| Sep 25, 2026 | #7 | 14,757 (+272) | 307 | 42,237 | 281 | 10.47% | 16.1% | C 62.4 | 777db67 |
| Sep 24, 2026 | #11 | 14,524 (+543) | 307 | 42,237 | 281 | 10.47% | 16.1% | C 62.4 | 777db67 |
| Sep 23, 2026 | #5 | 14,213 (+441) | 307 | 42,237 | 281 | 10.47% | 16.1% | C 63.7 | 777db67 |
| Sep 22, 2026 | #6 | 13,683 (+169) | 307 | 42,238 | 281 | 10.47% | 16.1% | C 63.7 | e0697a5 |
Want this for your own project? Install jscpd and run jscpd ., or measure it the way the baselines were measured.