Skip to content

Conversation

@besendorf
Copy link
Collaborator

No description provided.

DonnchaC and others added 16 commits February 10, 2025 19:28
Adding support to automatically run ADB backup and bugreport modules
automatically when running the check-androidqf command. This is a first
step to deduplicate the code for Android modules.
This commit makes a structural change to MVT by changing binary
detected/not detected logic into a structured multi-level system
of alerts. This gives far more power to extend MVT and manage
alerts.

This commit also begins the process of adding proper typing for
key objects used in MVT including Indicators, IndicatorMatches,
and ModuleResults. This will also be keep to programmatically using
the output of MVT.
Resolved conflicts:
- pyproject.toml: Used v2 pinned dependency versions
- Removed cmd_check_adb.py (deleted in refactor branch)
- Updated all command files to include disable_version_check and disable_indicator_check flags
- Adopted new AlertStore system from refactor branch
- Updated version to 3.0.0
- Kept VirusTotal functionality commented out
- Consolidated imports and module lists
- Adopted refactor branch's simplified JSON loading
- Updated iOS modules to use new alertstore approach
- Add log_latest() call in root_binaries to log each alert
- Fix UnboundLocalError in cmd_check_androidqf by initializing bugreport variable
- Remove incorrect backup.close() call since load_backup() returns bytes
- Remove duplicate from_ab method in cmd_check_backup that was using old attributes
@github-actions
Copy link
Contributor

github-actions bot commented Nov 7, 2025

Coverage

Coverage Report
FileStmtsMissCoverMissing
src/mvt/android
   cli.py1152380%53, 73–76, 87, 98, 135–136, 195–196, 257–258, 285–294, 302–303
   cmd_check_androidqf.py1103172%74, 84–87, 91–92, 95, 104–105, 109–118, 127, 130–131, 140, 152–165, 168, 173–177
   cmd_check_backup.py701776%71–72, 78–79, 85–88, 105–118, 122
   cmd_check_bugreport.py45882%81–84, 88, 91, 97, 103
   utils.py16569%11–19
src/mvt/android/artifacts
   dumpsys_accessibility.py29197%14
   dumpsys_adb.py921386%50–51, 91, 99–101, 113–115, 141–142, 148–151
   dumpsys_appops.py1031189%27, 74–80, 117–118, 155, 171–173, 179
   dumpsys_battery_daily.py42490%19, 29, 45–46
   dumpsys_battery_history.py47785%16, 48–56
   dumpsys_dbinfo.py41685%18, 61–66
   dumpsys_package_activities.py39490%12, 65, 71–72
   dumpsys_packages.py122596%20–26, 164, 171
   dumpsys_platform_compat.py21290%16, 32
   dumpsys_receivers.py56984%24, 29, 34, 39, 45, 51, 101, 107–108
   file_timestamps.py18194%32
   getprop.py36586%40, 53, 59, 62–63
   mounts.py682859%53, 79–80, 84, 113–118, 129–165, 180–192
   processes.py32875%20, 24–25, 31, 55, 59, 63–66
   tombstone_crashes.py1481491%98–101, 104–111, 167–168, 194, 234–235, 275
src/mvt/android/modules/adb
   __init__.py13130%6–19
   chrome_history.py38380%6–117
   dumpsys_full.py17170%6–46
   files.py74740%6–160
   getprop.py15150%6–44
   logcat.py22220%6–58
   packages.py1211210%6–311
   processes.py14140%6–43
   root_binaries.py25250%6–75
   selinux_status.py18180%6–49
   settings.py26260%6–59
   sms.py80800%6–186
   whatsapp.py55550%6–121
src/mvt/android/modules/androidqf
   aqf_files.py792371%12–13, 83, 92–96, 100, 104–110, 115–117, 125, 134–139
   aqf_log_timestamps.py25250%6–63
   aqf_packages.py60985%47–53, 78, 83–88, 91–96, 117
   aqf_settings.py25292%52–53
   base.py44295%74–75
   mounts.py291548%51–74
   root_binaries.py44686%76–78, 81–82, 101
   sms.py501374%54, 58, 65–66, 82–87, 90, 94–100, 105–106
src/mvt/android/modules/backup
   base.py35391%61–62, 67
   helpers.py22195%27
   sms.py35489%41, 45, 49–52
src/mvt/android/modules/bugreport
   base.py581869%47–48, 53–54, 61–66, 70, 85–92, 96–97
   dumpsys_accessibility.py18383%39–43, 52
   dumpsys_activities.py17288%43–47
   dumpsys_adb_state.py17382%39–43, 52
   dumpsys_appops.py16288%39–43
   dumpsys_battery_daily.py16288%39–43
   dumpsys_battery_history.py16288%39–43
   dumpsys_dbinfo.py17288%41–45
   dumpsys_getprop.py27774%41–45, 52–53, 58–61
   dumpsys_packages.py25388%40–44, 57
   dumpsys_platform_compat.py17288%39–43
   dumpsys_receivers.py17288%41–45
   tombstones.py25580%40–44, 53, 58–60
src/mvt/android/parsers
   backup.py110992%62, 102–103, 109, 129, 132, 175, 190–191
src/mvt/common
   alerts.py1032180%55, 65–69, 180, 205–212, 215–236
   cmd_check_iocs.py413222%30–44, 47–92
   command.py1785768%84–90, 96–114, 122–128, 138–144, 150–151, 157–185, 191–195, 198–200, 206, 268, 273, 290, 294–295
   indicators.py3136181%54–56, 69–75, 154, 166, 172, 178, 184, 206, 220–225, 308, 320, 332, 374–377, 414–432, 455, 465, 482, 501, 513, 529–537, 548, 569, 591, 600–601, 619, 641–651, 662, 665, 689, 732, 747
   log.py49296%64–65
   logo.py423517%18–83, 89–96
   module.py1213670%83–88, 105–131, 173, 182, 187, 197, 216–217, 233–234, 250–264
   options.py13377%27–33
   updates.py16013416%27–38, 43–56, 61–69, 72–74, 81–89, 92–94, 97–114, 117–137, 140–178, 185–219, 226–236, 239–269
   url.py25676%327, 366, 372–376
   utils.py1083766%49–51, 64, 96–97, 111, 125–126, 165–182, 197–198, 211–212, 219–228, 242, 252, 260
src/mvt/ios
   cli.py1516855%62, 82–85, 96, 125–169, 188–211, 254–255, 285–307, 327–342, 350–351
   cmd_check_fs.py14471%33–48, 51
   decrypt.py1149219%33–36, 39, 48–56, 61–64, 73–123, 131–181, 192–221, 227–231, 244–255
   versions.py32391%21, 30, 48
src/mvt/ios/modules
   base.py912375%55, 65, 72–97, 115, 123, 130, 138–139, 158–161, 196–197
   net_base.py1264961%73–75, 105–106, 187–245, 260–273, 290, 336–337, 345–346, 350
src/mvt/ios/modules/backup
   backup_info.py30293%44, 80
   configuration_profiles.py704831%48–53, 63, 66–93, 108–183
   manifest.py83792%64, 71, 119–120, 130, 176–177
   profile_events.py543437%49, 60–64, 67, 70–79, 83–109, 115–122
src/mvt/ios/modules/fs
   analytics.py675124%39, 49, 57–82, 87–144, 147–150, 153–159
   analytics_ios_versions.py372630%35, 45, 53–91
   cache_files.py473526%29, 39–50, 53–68, 71–86, 98–105
   filesystem.py43881%57, 61–62, 66, 82–83, 94–95
   net_netusage.py191047%35, 45–58
   safari_favicon.py382632%36, 46, 55–65, 68–120, 123–129
   shutdownlog.py665418%35, 45, 54–75, 78–133, 136–139
   version_history.py21957%37, 47, 55–70
   webkit_base.py231726%17–25, 28–39
   webkit_indexeddb.py14471%39, 49, 58–59
   webkit_localstorage.py13469%37, 47, 56–57
   webkit_safariviewservice.py11373%33, 43–44
src/mvt/ios/modules/mixed
   applications.py724242%52–59, 63–104, 115–123, 129–134, 144–156, 162, 164–166
   calendar.py50296%82–88
   calls.py231057%42, 54–83
   chrome_favicon.py372338%47, 55–66, 72–110
   chrome_history.py311745%49, 59–66, 72–107
   contacts.py291741%46–76
   firefox_favicon.py331942%48, 57–67, 73–111
   firefox_history.py311745%52, 60–67, 73–106
   global_preferences.py27293%47–48
   idstatuscache.py563832%51, 60–75, 83–113, 118–128
   interactionc.py564029%256–280, 286–325
   locationd.py856622%63–75, 78–150, 153–172, 177–189
   osanalytics_addaily.py321747%50, 61–68, 75–103
   safari_browserstate.py773061%75, 78–82, 105–117, 124–144, 179, 185–192
   safari_history.py714438%53, 64–103, 114, 117–120, 123–158, 170–178
   shortcuts.py685026%52–60, 76–83, 89–158
   sms.py711480%79–85, 94, 118–135, 148, 162
   sms_attachments.py452642%49, 62–77, 105–136
   tcc.py833163%73, 90, 114–134, 149–152, 172–214
   webkit_resource_load_statistics.py531179%71–73, 98–99, 133–140
   webkit_session_resource_log.py876328%57–67, 71, 74–116, 124–170, 177–194
   whatsapp.py523827%48–53, 61–68, 74–140
TOTAL6508250362% 

Tests Skipped Failures Errors Time
111 1 💤 0 ❌ 0 🔥 7.345s ⏱️

@github-actions
Copy link
Contributor

github-actions bot commented Nov 7, 2025

Coverage

Coverage Report
FileStmtsMissCoverMissing
src/mvt/android
   cli.py1152380%53, 73–76, 87, 98, 135–136, 195–196, 257–258, 285–294, 302–303
   cmd_check_androidqf.py1103172%74, 84–87, 91–92, 95, 104–105, 109–118, 127, 130–131, 140, 152–165, 168, 173–177
   cmd_check_backup.py701776%71–72, 78–79, 85–88, 105–118, 122
   cmd_check_bugreport.py45882%81–84, 88, 91, 97, 103
   utils.py16569%11–20
src/mvt/android/artifacts
   dumpsys_accessibility.py30197%14
   dumpsys_adb.py921386%50–51, 91, 99–101, 113–115, 141–142, 148–151
   dumpsys_appops.py1031189%27, 76–82, 120–121, 158, 174–176, 182
   dumpsys_battery_daily.py42490%17, 27, 42–43
   dumpsys_battery_history.py48785%16, 47–55
   dumpsys_dbinfo.py42686%18, 62–67
   dumpsys_package_activities.py40490%12, 66, 72–73
   dumpsys_packages.py123596%20–27, 164, 171
   dumpsys_platform_compat.py22291%16, 31
   dumpsys_receivers.py57984%24, 29, 34, 39, 45, 51, 99, 105–106
   file_timestamps.py18194%32
   getprop.py37586%40, 53, 59, 62–63
   mounts.py703057%53, 79–80, 84, 113–118, 129–168, 183–197
   processes.py34974%20, 24–25, 31, 55, 59, 63–65
   tombstone_crashes.py1491590%98–100, 103–110, 167–168, 194, 234–235, 275
src/mvt/android/modules/adb
   __init__.py13130%6–19
   chrome_history.py39390%6–116
   dumpsys_full.py17170%6–46
   files.py73730%6–156
   getprop.py15150%6–44
   logcat.py22220%6–58
   packages.py1231230%6–311
   processes.py14140%6–43
   root_binaries.py26260%6–71
   selinux_status.py18180%6–49
   settings.py26260%6–59
   sms.py81810%6–187
   whatsapp.py54540%6–118
src/mvt/android/modules/androidqf
   aqf_files.py812569%12–13, 83, 92–95, 99, 103–109, 114–117, 123, 132–137
   aqf_log_timestamps.py25250%6–63
   aqf_packages.py63986%47–54, 82, 87–93, 96–102, 123
   aqf_settings.py25292%52–53
   base.py44295%74–75
   mounts.py291548%51–74
   root_binaries.py44686%77–79, 82–83, 102
   sms.py511473%54, 58–59, 66–67, 83–88, 91, 95–101, 106–107
src/mvt/android/modules/backup
   base.py35391%61–62, 67
   helpers.py22195%27
   sms.py36586%41, 45, 49–53
src/mvt/android/modules/bugreport
   base.py581869%47–48, 53–54, 61–66, 70, 85–92, 96–97
   dumpsys_accessibility.py18383%39–43, 52
   dumpsys_activities.py17288%43–47
   dumpsys_adb_state.py17382%39–43, 52
   dumpsys_appops.py16288%39–43
   dumpsys_battery_daily.py16288%39–43
   dumpsys_battery_history.py16288%39–43
   dumpsys_dbinfo.py17288%41–45
   dumpsys_getprop.py27774%41–45, 52–53, 58–61
   dumpsys_packages.py25388%40–44, 57
   dumpsys_platform_compat.py17288%39–43
   dumpsys_receivers.py17288%41–45
   tombstones.py25580%40–44, 53, 58–60
src/mvt/android/parsers
   backup.py110992%62, 102–103, 109, 129, 132, 175, 190–191
src/mvt/common
   alerts.py821878%115, 118, 143–150, 153–174
   cmd_check_iocs.py413222%30–44, 47–92
   command.py1785768%84–90, 96–114, 122–128, 138–144, 150–151, 157–185, 191–195, 198–200, 206, 268, 273, 290, 294–295
   indicators.py3136181%54–56, 69–75, 154, 166, 172, 178, 184, 206, 220–225, 308, 320, 332, 374–377, 414–432, 455, 465, 482, 501, 513, 529–537, 548, 569, 591, 600–601, 619, 641–651, 662, 665, 689, 732, 747
   log.py49296%64–65
   logo.py423517%18–83, 89–96
   module.py1223670%84–89, 106–132, 183, 192, 197, 207, 226–227, 243–244, 260–274
   options.py13377%27–33
   updates.py16013416%27–38, 43–56, 61–69, 72–74, 81–89, 92–94, 97–114, 117–137, 140–178, 185–219, 226–236, 239–269
   url.py25676%327, 366, 372–376
   utils.py1083766%49–51, 64, 96–97, 111, 125–126, 165–182, 197–198, 211–212, 219–228, 242, 252, 260
src/mvt/ios
   cli.py1516855%62, 82–85, 96, 125–169, 188–211, 254–255, 285–307, 327–342, 350–351
   cmd_check_fs.py14471%33–48, 51
   decrypt.py1149219%33–36, 39, 48–56, 61–64, 73–123, 131–181, 192–221, 227–231, 244–255
   versions.py32391%21, 30, 48
src/mvt/ios/modules
   base.py912375%55, 65, 72–97, 115, 123, 130, 138–139, 158–161, 196–197
   net_base.py1264961%73–75, 105–106, 187–245, 260–273, 290, 336–337, 345–346, 350
src/mvt/ios/modules/backup
   backup_info.py30293%44, 80
   configuration_profiles.py704831%48–53, 63, 66–93, 108–183
   manifest.py83792%64, 71, 119–120, 130, 176–177
   profile_events.py543437%49, 60–64, 67, 70–79, 83–109, 115–122
src/mvt/ios/modules/fs
   analytics.py675124%39, 49, 57–82, 87–144, 147–150, 153–159
   analytics_ios_versions.py372630%35, 45, 53–91
   cache_files.py473526%29, 39–50, 53–68, 71–86, 98–105
   filesystem.py43881%57, 61–62, 66, 82–83, 94–95
   net_netusage.py191047%35, 45–58
   safari_favicon.py382632%36, 46, 55–65, 68–120, 123–129
   shutdownlog.py665418%35, 45, 54–75, 78–133, 136–139
   version_history.py21957%37, 47, 55–70
   webkit_base.py231726%17–25, 28–39
   webkit_indexeddb.py14471%39, 49, 58–59
   webkit_localstorage.py13469%37, 47, 56–57
   webkit_safariviewservice.py11373%33, 43–44
src/mvt/ios/modules/mixed
   applications.py724242%52–59, 63–104, 115–123, 129–134, 144–156, 162, 164–166
   calendar.py50296%82–88
   calls.py231057%42, 54–83
   chrome_favicon.py372338%47, 55–66, 72–110
   chrome_history.py311745%49, 59–66, 72–107
   contacts.py291741%46–76
   firefox_favicon.py331942%48, 57–67, 73–111
   firefox_history.py311745%52, 60–67, 73–106
   global_preferences.py28389%49–53
   idstatuscache.py563832%51, 60–75, 83–113, 118–128
   interactionc.py564029%256–280, 286–325
   locationd.py856622%63–75, 78–150, 153–172, 177–189
   osanalytics_addaily.py321747%50, 61–68, 75–103
   safari_browserstate.py773061%75, 78–82, 105–117, 124–144, 179, 185–192
   safari_history.py714438%53, 64–103, 114, 117–120, 123–158, 170–178
   shortcuts.py685026%52–60, 76–83, 89–158
   sms.py711480%79–85, 94, 118–135, 148, 162
   sms_attachments.py452642%49, 62–77, 105–136
   tcc.py843163%73, 90, 113–133, 148–151, 171–213
   webkit_resource_load_statistics.py531179%71–73, 98–99, 133–140
   webkit_session_resource_log.py876328%57–67, 71, 74–116, 124–170, 177–194
   whatsapp.py523827%48–53, 61–68, 74–140
TOTAL6513251261% 

Tests Skipped Failures Errors Time
111 1 💤 0 ❌ 0 🔥 7.477s ⏱️

@besendorf besendorf requested a review from DonnchaC November 12, 2025 12:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants