Product

APK and app scanner: a full teardown of any Android app

What actually happens, step by step, when you drop an Android app into the GuestSpy scanner, and how to read the report it gives you back.

22 min readUpdated November 2, 2026Evidence-first
01

The short version

You have an app on a phone and you don’t trust it. Maybe it appeared after someone else "borrowed" your phone for ten minutes. Maybe it is called "System Service" and has no icon. Maybe it is a perfectly ordinary-looking keyboard that your partner insisted you install.

The GuestSpy app scanner takes that app’s install file (an APK), pulls it apart in your browser, and tells you what it is, who signed it, what it is allowed to do, where it talks to, and whether any of that matches the 176 stalkerware and monitoring families in our database. Then it shows you the evidence for every single claim. No "trust us, it’s bad". You see the permission, the component, the domain, the rule ID and the danger code, in plain English.

Nothing is uploaded. The APK is parsed with code that runs inside your browser tab, and the indicator database is downloaded to your device, not the other way round. When you close the tab, the file is gone.

9:41
‹Deep scanLIVE
147/ 212 apps
✓Hash check 212 / 212
✓Certificate check 212 / 212
Behaviour rules 147 / 212
Network indicators queued
[00.84s] com.android.core.monitor → cert 0E0BE37D… MATCH Hoverwatch
[00.91s] com.whatsapp → clean
[00.93s] com.systemservice → pkg MATCH TheTruthSpy
[01.02s] com.wondershare.famisafe → watchware
[01.05s] org.telegram.messenger → clean
Nothing leaves this phone · 2 threats so far
Dropping an APK into the Web Scanner. Each stage lights up as it completes: hash, ZIP, manifest, certificate, strings, network, code, score.
This page is the long version. It walks through each stage of the analysis, then through a full example deep report, then through the things that go wrong (false positives, missing files) and how to get an APK off a phone in the first place.

02

What an APK actually is

Before the stages make sense, it helps to know what the scanner is looking at.

An APK is a ZIP archive with a specific layout. Inside it you will usually find:

01

AndroidManifest.xml

– the app’s declaration of itself: package name, version, which permissions it wants, which services and receivers it registers. On disk this file is in a compressed binary XML format, not readable text.

02

classes.dex

(sometimes classes2.dex, classes3.dex and so on) – the compiled app code that runs on the Android runtime.

03

resources.arsc

And res/ – strings, layouts, images.

04

lib/<abi>/*.so

– native libraries compiled for ARM or x86, if the app has any.

05

META-INF/

– the signing block: certificate files (*.RSA, *.DSA, *.EC), the manifest of file digests, and for newer apps an APK Signature Scheme v2/v3 block stored outside the ZIP entries.

06

assets/

– anything else the developer wanted to ship, which is also where packed or encrypted secondary payloads tend to hide.

Every one of those parts tells a different piece of the story. Stalkerware authors can lie in the app’s name and icon. It is far harder for them to lie in the manifest, because the operating system reads the manifest and refuses to grant anything that isn’t declared there. That is why the scanner spends most of its time on the parts of the file the user never sees.

03

Stage by stage: what happens when you drop in an APK

Stage 1: SHA-256 against known samples

The first thing the scanner does is hash the entire file with SHA-256. This is a fixed-length fingerprint of every byte in the file. Change one byte and the fingerprint changes completely.

That fingerprint is checked against roughly 2,950 known sample hashes from the Echap stalkerware indicator set. If it matches, the scan is effectively over before it has started: the file is byte-for-byte identical to a sample that has already been analysed and attributed to a specific family. This is the highest confidence a verdict can have. The report will say Known stalkerware, name the family, give the danger code (for example GS-STK-AND-7685 for the mSpy family) and set confidence to Exact hash match.

Most files you scan will not match at this stage, and that is normal. Stalkerware vendors rebuild their apps often, and a rebuild with a different version string produces a new hash. A miss here means nothing on its own. The scanner carries on.

We also compute SHA-1 and MD5 for the Identity section, because other tools and online sandboxes often index by those, and you may want to cross-reference.

Stage 2: ZIP parse

Next the scanner reads the ZIP central directory and lists every entry. This sounds dull, but a few things are already visible at this stage:

01

Whether the archive is well-formed

Some malware deliberately corrupts ZIP headers in ways Android tolerates but analysis tools choke on. The scanner notes this as evidence (rule GS-R-002, "Malformed or non-standard ZIP structure") rather than giving up.

02

How many DEX files there are, and whether there are extra ones with unusual names.

03

Whether assets/ or res/raw/ contains files that look like second-stage payloads: another .apk, a .dex, a .jar, or a large blob with no recognisable type.

04

Native libraries under lib/, and which architectures are included.

The entry list is kept for the Code section of the report.

Stage 3: Decoding AndroidManifest.xml

The manifest is stored as Android binary XML ("AXML"). The scanner decodes it back into a readable tree, and this is where most of the real information comes from.

From the manifest the scanner extracts:

Identity. The package name (com.example.something), the version name and version code, and the minimum and target SDK levels. Package names matter enormously: the database contains 600+ package names tied to specific families, and stalkerware apps have a habit of choosing names that look like system components (com.android.core.monitor, android.helper.system, com.system.user, com.systemservice). A match on package name gives Package-name match confidence, one step below a certificate match, because package names can be copied by anyone.

A very low target SDK is also noted. Apps targeting old Android versions get older, looser permission behaviour, and some monitoring apps deliberately keep an old target to avoid newer restrictions on background location or SMS access.

Permissions. Every <uses-permission> line, sorted into risk tiers. The permission audit page explains each one in depth. Here, the scanner is interested in both single high-risk permissions and combinations. Reading SMS on its own might be a legitimate messaging app. Reading SMS plus call log plus fine location together is rule GS-R-030 and is what a monitoring app looks like.

Services.

Background components. The scanner flags any service that declares the android.accessibilityservice.AccessibilityService intent filter together with BIND_ACCESSIBILITY_SERVICE. An accessibility service, once the user enables it in settings, can read the text of everything on screen, including messages in apps that otherwise encrypt their traffic, and can observe every key press. That is rule GS-R-021, "Accessibility service can read screen content", mapped to ATT&CK T1417.001 (Keylogging) and T1513 (Screen Capture). The scanner also reads the service’s own configuration resource, if it can find it, to see whether it asks for flagRetrieveInteractiveWindows or canRetrieveWindowContent.

Notification listener services (BIND_NOTIFICATION_LISTENER_SERVICE) get the same treatment. A notification listener sees the content of every notification, which on most phones means the content of every incoming message from every messaging app, without needing any SMS permission at all. ATT&CK T1517, Access Notifications.

Receivers.

Broadcast receivers that wake the app up on events. Two are of special interest:

  • A receiver for android.intent.action.BOOT_COMPLETED, together with the RECEIVE_BOOT_COMPLETED permission, means the app starts itself every time the phone restarts. Normal for an alarm clock. Essential for anything that wants to monitor you without being reopened.
  • A receiver protected by BIND_DEVICE_ADMIN with the android.app.action.DEVICE_ADMIN_ENABLED filter means the app is a device administrator. Device admin apps can be made very hard to uninstall (the uninstall button is greyed out until admin is revoked), can wipe the device, and can enforce lock settings. Rule GS-R-018, ATT&CK T1626.001.

Hidden launcher icon. The scanner looks at the app’s activities. If there is no activity with the MAIN action and LAUNCHER category, or if the launcher activity is an activity-alias that the app can disable programmatically, the app can exist on the phone with no icon in the app drawer. Rule GS-R-014, "Hides launcher icon", ATT&CK T1628.001. Legitimate apps almost never do this. Nearly every stalkerware app does.

Intent filters. The scanner lists any filter that catches outgoing calls (NEW_OUTGOING_CALL), incoming SMS (SMS_RECEIVED, with a high priority value so it sees the message before the default messaging app), or package install events (PACKAGE_ADDED, used to notice when the victim installs a security app).

Stage 4: Certificate extraction and signer matching

Every Android app must be signed, and the signing certificate cannot be changed without breaking updates. This makes the certificate one of the most reliable identifiers of who really built an app, regardless of what name or icon they gave it.

The scanner reads the certificate from META-INF/*.RSA (or .DSA/.EC) and, where present, from the APK Signature Scheme v2/v3 block. It computes the SHA-1 and SHA-256 fingerprints of the certificate and extracts the subject and issuer fields (the "CN=" and "O=" values the developer typed when they generated the key).

The fingerprints are then compared against 470+ signing certificates in the database. A certificate match gives Signing-certificate match confidence. This catches a huge amount that package-name matching misses: when a vendor renames their app from "SpyPhone" to "Battery Saver Pro" and changes the package name, they very often keep signing with the same key, because changing it would break updates for existing paying customers.

The scanner also notes:

  • Self-signed debug certificates (CN=Android Debug), which appear in apps built from a developer machine rather than released properly.
  • Certificates whose subject fields are empty, random-looking, or deliberately imitate Google (CN=Android, O=Google Inc. without the real Google key).
  • Certificates with absurdly long or short validity windows, which are weak signals on their own but add up.

Stage 5: String extraction – domains, IPs, URLs

The scanner walks through every DEX file, the resource table, and anything in assets/ that looks like text or configuration, and pulls out strings that look like network destinations: fully qualified domain names, IPv4 addresses, full URLs, and a few things that look like API keys for push and analytics services.

Why strings? Because an app that sends your messages to a server has to know the server’s address, and that address is somewhere in the file. Obfuscation tools can scramble class names, but a domain has to be a domain at the moment it is used, and in most stalkerware it is simply sitting there as a plain string constant.

The extracted list is shown in full in the Network indicators section, with the obvious noise (Google, Android schema URLs, common libraries) grouped separately so the interesting addresses stand out.

Stage 6: C2 matching

Each extracted domain and IP is compared with 900+ known command-and-control domains and with the distribution and website domains of every family in the database. Command and control (C2) is the server a monitoring app reports to and takes instructions from: "upload the last hour of audio", "send the current GPS fix", "turn on the camera".

A match here gives C2-domain match confidence and names the family. To give a concrete example, the TheTruthSpy family (GS-STK-AND-1405, which also covers the old GuestSpy monitoring builds, package com.guest) uses dozens of subdomains following patterns like protocol-a###.thetruthspy.com and media-sync-a###.fonetracker.com; these are in the database, and an app containing any of them will be attributed to that family even if its package name and certificate are new.

The scanner also applies a few generic network rules with no family attribution: hard-coded raw IP addresses used as the primary endpoint (GS-R-041), domains using "dynamic DNS" style hosting, and endpoints whose path contains words like /upload, /sync, /keylog, /callrecord, /sms.

Stage 7: Native libraries and packers

Some monitoring apps ship native code to record calls, capture audio at low level, or simply to hide logic from DEX-level analysis. The scanner lists each .so file and architecture and extracts strings from the native binaries too, so a C2 domain hidden in native code is still found.

It also checks for signs of commercial or open-source packers and protectors. The usual pattern is a tiny stub DEX whose only job is to decrypt and load the real code from assets/ at runtime. The scanner looks for known stub class names, for high-entropy blobs in assets/, and for the DexClassLoader / InMemoryDexClassLoader calls that load code dynamically. Packing is not proof of anything; plenty of banking and game apps use it. But a tiny app with a device admin receiver, an accessibility service, no launcher icon, and a packed payload is a combination that has only one sensible explanation. Packing is reported as GS-R-050 ("Dynamically loads code at runtime") and feeds into the score.

Stage 8: Danger scoring and the verdict

Now the scanner has a list of findings, each tagged with a rule ID, a weight, and any family attribution. It produces three things:

Severity (0-100). A weighted sum of findings, capped at 100. Family-level matches set a floor (a certificate match to a stalkerware family will never score below the Dangerous band, whatever else is going on). Combinations count more than sums: GS-R-030 adds more than the three permissions it is built from would add separately.

Confidence. The strongest kind of evidence found, in a fixed order: Exact hash match, then Signing-certificate match, then Package-name match, then C2-domain match, then Heuristic. This is shown separately from severity on purpose. An app can be high severity and heuristic-only (it behaves like spyware but we cannot name it) or lower severity with exact-hash confidence (a known "watchware" parental app that is honest about what it does).

Verdict. One of five words: Clean, Low risk, Suspicious, Dangerous, Known stalkerware. "Known stalkerware" is reserved for family matches of hash, certificate or package name in the stalkerware (STK) class. Apps in the watchware (WCH) class, meaning visible monitoring and parental apps such as Life360 (GS-WCH-AND-7021), are given their own purple label and explained as what they are: software that monitors, but doesn’t hide. Whether that is OK depends entirely on whether you knew it was installed and agreed to it.

Every finding carries a danger code in the format GS-<CLASS>-<PLATFORM>-<NNNN>. The class tells you the kind of problem (STK, WCH, SPY, TRJ, ADW, PUA, CFG, DOC, CLN); the platform here is always AND; the number identifies the family or, for heuristic verdicts, the heuristic profile.

04 · Reading the report

Walking through a full deep report

Here is how a report reads from top to bottom for an app that was pulled off a phone because it had no icon and the owner didn’t remember installing it. The details below are what the scanner would produce for a Hoverwatch-style monitoring build; the family, package and domain patterns come from the database.

🔒 guestspy.com/scanner#report-GSR-M3K2
Known stalkerware Signing-certificate match

Sync Services v2.4.1

com.guest · APK · 4.2 MB · SHA-256 7f3a9c…e21b
96/ 100
Identity
Package
com.guest
Label
Sync Services
SDK
API 19 → API 22
Launcher icon
none
Signer
CN=Unknown, O=Unknown · RSA 2048
Valid
2015-03-02 → 2042-07-19
Permissions by tier
Critical 9High 6Medium 7Low 5
  • CREAD_SMS
  • CREAD_CALL_LOG
  • CACCESS_BACKGROUND_LOCATION
  • CRECORD_AUDIO
  • CBIND_ACCESSIBILITY_SERVICE
  • CBIND_DEVICE_ADMIN
Network indicators
  • guestspy.com known infrastructure
  • media-sync-a.thetruthspy.com known infrastructure
  • api.github.com
  • 69.64.81.166 known C2 IP
ATT&CK techniques
T1430Location TrackingT1636.004SMS MessagesT1417.001KeyloggingT1628.001Suppress App IconT1626.001Device Administrator
The deep report for a flagged app. Verdict, severity and confidence at the top; every section below is evidence.

Overview

Verdict: Known stalkerware
Family: Hoverwatch
Danger code: GS-STK-AND-7843
Severity: 96 / 100
Confidence: Signing-certificate match
Summary: This app is signed with a certificate attributed to the Hoverwatch monitoring family, hides its launcher icon, registers an accessibility service and a device administrator, starts at boot, and contains the Hoverwatch command-and-control domain. It can read your messages, record calls, track your location and send all of it to a remote dashboard.

The overview is written for someone who may read nothing else. It says what the app is, how sure we are, and what it can do to you. If you are in a hurry, this and the Removal plan are the two sections to read.

Identity

Field Value
Package com.android.core.monitor
App label "Sync Services"
Version 7.2.1 (code 7210)
Min SDK / Target SDK 21 / 28
File SHA-256 (full hash shown; no match in sample DB)
Signer SHA-1 0E0BE37D…CE227C – matches Hoverwatch
Signer SHA-256 (full fingerprint shown)
Certificate subject CN=hw, O=hw
Signature scheme v1 + v2

Two things to notice. The package name imitates an Android system component, and the certificate, not the hash, is what made the attribution. The hash is new because this is a build we had not seen, but the vendor used the same signing key as every other Hoverwatch build in the database.

Permissions by risk tier

The scanner groups permissions into Critical, High, Medium and Low. For this app:

Critical: READ_SMS, RECEIVE_SMS, READ_CALL_LOG, RECORD_AUDIO, ACCESS_FINE_LOCATION, ACCESS_BACKGROUND_LOCATION, BIND_ACCESSIBILITY_SERVICE (via service), BIND_DEVICE_ADMIN (via receiver), BIND_NOTIFICATION_LISTENER_SERVICE (via service).

High: CAMERA, READ_CONTACTS, PROCESS_OUTGOING_CALLS, SYSTEM_ALERT_WINDOW, READ_EXTERNAL_STORAGE, PACKAGE_USAGE_STATS, QUERY_ALL_PACKAGES.

Medium: RECEIVE_BOOT_COMPLETED, REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, GET_ACCOUNTS, READ_PHONE_STATE, FOREGROUND_SERVICE.

Low: INTERNET, WAKE_LOCK, ACCESS_NETWORK_STATE, VIBRATE.

Beneath the tiers, the combination rules that fired:

  • GS-R-030 Reads SMS + call log + location together.
  • GS-R-031 Records audio with background location and boot start.
  • GS-R-033 Reads notifications and has accessibility service (double message capture).

Each permission line expands to a plain-English sentence ("READ_SMS: can read every text message stored on the phone, including two-factor codes") and the ATT&CK technique it enables.

Components

01

Accessibility service

com.android.core.monitor.AccService – GS-R-021. Config requests canRetrieveWindowContent=true, event types: all. This can log keystrokes and read on-screen text in any app.

02

Device admin receiver

.AdminReceiver – GS-R-018. Policies: force-lock, wipe-data. Uninstall will be blocked until admin is deactivated.

03

Notification listener

.NotifService – GS-R-023.

04

Boot receiver

.BootReceiver for BOOT_COMPLETED, QUICKBOOT_POWERON and USER_PRESENT – GS-R-011.

05

Outgoing call receiver

With priority 2147483647 – GS-R-036.

06

Launcher icon:

No LAUNCHER activity found – GS-R-014. The app is invisible in the app drawer.

07

Foreground service

Declared with type location|microphone|camera.

The Components section is where you see how the permissions are actually wired up. A permission is a request; a component is the machinery that uses it.

Network indicators

01

a.hw.cab

– C2 match: Hoverwatch

02

hw.cab

– C2 match: Hoverwatch

03

a.hwa.cab

– C2 match: Hoverwatch

04

https://a.hw.cab/api/v2/upload

– path keyword upload

05

firebaseinstallations.googleapis.com

– common library (collapsed)

06

crashlytics.com

– common library (collapsed)

Three matches on the family’s own infrastructure. Even without the certificate, this would have attributed the app.

Code

01

DEX files: 2 (classes.dex, classes2.dex)

02

Native libraries

Lib/armeabi-v7a/librec.so, lib/arm64-v8a/librec.so – strings include AudioRecord, /dev/snd/

03

Dynamic code loading: not detected

04

Packer: not detected

05

Obfuscation: ProGuard-style short class names (common, low weight)

ATT&CK mapping

Technique Evidence
T1636.004 SMS Messages READ_SMS, RECEIVE_SMS, SMS receiver
T1636.002 Call Log READ_CALL_LOG
T1636.003 Contact List READ_CONTACTS
T1430 Location Tracking fine + background location, foreground service type
T1429 Audio Capture RECORD_AUDIO, librec.so
T1512 Video Capture CAMERA
T1417.001 Keylogging accessibility service
T1513 Screen Capture accessibility service canRetrieveWindowContent
T1517 Access Notifications notification listener
T1626.001 Device Administrator Permissions device admin receiver
T1628.001 Suppress Application Icon no launcher activity
T1624.001 Broadcast Receivers boot and call receivers
T1437.001 Web Protocols HTTPS C2

The mapping is there so that a report can be handed to an advocate, a lawyer, a police officer or an IT department and be understood in a standard vocabulary without re-explaining everything.

Removal plan

The removal plan is specific to the findings. For this app it reads:

  1. 1
    Before doing anything, read the safety note below.
  2. 2
    Deactivate device admin: Settings > Security (or Security & privacy) > More security settings > Device admin apps (names vary by manufacturer). Toggle off "Sync Services".
  3. 3
    Turn off the accessibility service: Settings > Accessibility > Downloaded apps (or Installed apps) > "Sync Services" > Off.
  4. 4
    Remove notification access: Settings > Notifications > Device & app notifications (or Notification access).
  5. 5
    Uninstall: Settings > Apps > See all apps > "Sync Services" > Uninstall. If the button is still greyed out, step 2 did not take; repeat it.
  6. 6
    Change the passwords for your Google account and anything you logged into from this phone, from a different device.
  7. 7
    Consider a factory reset if you cannot be sure this was the only thing installed.
Before you remove anything

Removing stalkerware can alert the person who installed it. Their dashboard may show "device offline" within minutes. If that person is someone you live with or are afraid of, make a safety plan first. The Coalition Against Stalkerware (stopstalkerware.org) lists support organisations by country. In the US, the National Domestic Violence Hotline is 1-800-799-7233. You may also want to keep the evidence (export this report as PDF) before removal. See our safety page.

Community verdicts

The last section shows what other GuestSpy users have said about this package name or file hash: Safe, Suspicious or Malicious votes, with moderated comments. If nobody has reported it yet, the section says so. We never pre-fill this section, so an empty community section is honest, not broken. You can add your own vote from here.

🔒 guestspy-report-GS-STK-AND-1405.pdf
GuestSpy
Scan reportGSR-M3K2 · 2 Nov 2026 · GuestSpy Web Scanner 1.0
Known stalkerware
Subject

Sync Services (com.guest) v2.4.1
APK · 4.2 MB
SHA-256 7f3a9c0e…4e21b

Verdict

Severity 96 / 100
Confidence: signing-certificate match
Danger code GS-STK-AND-1405

Family

TheTruthSpy
also: Copy9, iSpyoo, FoneTracker, GuestSpy (legacy)

Evidence (12)
CERTSigner matches TheTruthSpy familyCertificate
GS-R-014Hides launcher iconT1628.001
GS-R-021Accessibility service declaredT1417.001
GS-R-030SMS + call log + location combinationT1636.004
GS-R-018Device administrator receiverT1626.001
GS-IOC-C2media-sync-a.thetruthspy.comT1437.001
Checks performed

37 rules evaluated · 12 fired · 25 passed · 5 evidence levels · database 176 families / 2,953 hashes

Page 1 of 4 · Files are analysed locally; this report was generated in the browser.
Export the full report as a PDF. Useful for an advocate, lawyer or police report, and as a record of what was on the phone before removal.
05 · Step by step

False positives, and how to read a "Suspicious" result

The scanner is designed to show its work precisely because automated scoring can be wrong. A few patterns that generate noise, and how the report handles them:

Legitimate apps with scary permissions.

A real SMS backup app reads SMS. A real call recorder records audio and processes outgoing calls. A password manager uses an accessibility service to autofill. A corporate MDM agent is a device admin. None of these are stalkerware, and the scanner will typically land them in Suspicious or Low risk with Heuristic confidence, not in Known stalkerware. The report will say which rules fired, and you can judge whether the app’s stated purpose explains them. If the app is a flashlight and it fired GS-R-030, the stated purpose does not explain it.

Watchware.

Parental control and family-locator apps are honest about monitoring. They have icons, they show notifications, they are on the Play Store. The database classifies them as WCH and the scanner shows them in purple with an explanation. The relevant question is consent: did you install this, do you know who sees the data, can you turn it off? If the answer is no, the technical class doesn’t make it OK.

Shared certificates. Occasionally a signing certificate in the database belongs to a developer who publishes both a monitoring app and unrelated apps. The report states the match and the family; you can see from the Permissions and Components sections whether the app actually has monitoring capability. A certificate match with no monitoring permissions is worth a second look rather than panic.

Repackaged and modded apps. "Modded" versions of popular apps from third-party sites are frequently re-signed with a new certificate and may contain injected code. The scanner will flag the certificate mismatch against the known official signer for well-known packages (GS-R-060, "Package name belongs to a known publisher but certificate does not match") and show you the extra network indicators.

Heuristic-only Dangerous. If the verdict is Dangerous but no family matched, you are looking at something that behaves like monitoring software and is not yet in the database. This is exactly the case where community reports matter. Vote, add what you know, and if you are comfortable doing so, share the hash so it can be added to the indicator set.

When the scanner says Clean. Clean means no family match and no heuristic rule above the Low tier fired. It does not mean the app has been proven safe; no scanner can prove that. It means that in the parts of the file we can read, there is nothing that looks like monitoring. If you still have a strong reason to think the phone is compromised, check the other usual places: your Google account’s device list, Play Protect status, accessibility services, device admin apps, and anything with notification access.

06

Where to get the APK

The Web Scanner runs in a browser, so it needs the APK file. A web page cannot reach into a phone and pull files out by itself. Here are the practical ways to get the file.

Option A: the GuestSpy Android app

If you can install our app on the phone (see download), it reads the list of installed packages, exports each one’s APK and hands them to the scanner on-device. This is the easiest route and the only one that doesn’t need a computer. It also catches apps that are hidden from the app drawer, because it reads the package list from the system, not from the launcher.

Option B: adb from a computer

If you have a computer and a USB cable:

  1. 1
    On the phone, enable Developer options (Settings > About phone > tap "Build number" seven times; on Samsung it is under Settings > About phone > Software information).
  2. 2
    Settings > System > Developer options > USB debugging: on.
  3. 3
    Install the Android platform tools on your computer and connect the phone. Accept the "Allow USB debugging" prompt on the phone.
  4. 4
    List packages: adb shell pm list packages -3 (third-party apps only). Look for anything you don’t recognise. Add -f to see the file path for each.
  5. 5
    Find the path: adb shell pm path com.suspicious.package
  6. 6
    Pull it: adb pull /data/app/.../base.apk ./suspicious.apk
  7. 7
    Drop suspicious.apk into the Web Scanner.

You can also paste the whole output of pm list packages into the scanner’s Installed-apps list check mode. It will match every package name against the database without needing any files at all. It is less thorough than a full APK scan but takes thirty seconds.

🔒 guestspy.com/scanner#pkglist
212
apps
2
stalkerware
1
watchware
3
suspicious
Stalkerwarecom.android.core.monitor
Hoverwatch · GS-STK-AND-7843 · sideloaded
GS-R-070 system-name impostor · GS-R-030 7 surveillance permissions
Stalkerwarecom.systemservice
TheTruthSpy · GS-STK-AND-1405
installer: null · 2 components disabled
Watchwarecom.wondershare.famisafe
FamiSafe · GS-WCH-AND-0487
Play Store · visible icon
Suspiciouscom.wifi.sync.serviceGS-R-072 generic system name · sideloaded · installed 3 days ago
OKcom.whatsappno findings
Paste the output of <code>adb shell pm list packages</code> and the scanner matches every package name against the database.

Option C: a file manager with APK export

Several file managers and "APK extractor" apps can save an installed app’s APK to the Downloads folder. Then you can share it to a computer, or open the Web Scanner in the phone’s own browser and choose the file from Downloads. This works for most apps, but note:

  • An app that is hidden from the launcher may still be visible in the file manager’s app list; look for the package name rather than a friendly name.
  • Some device-admin stalkerware blocks other apps from reading its APK path. If export fails for exactly one app, that in itself is a finding worth writing down.
  • Use a file manager you already trust. Installing a random "APK extractor" from a third-party site to investigate stalkerware is not a great trade.

Option D: the original installer file

If the app was sideloaded, the installer may still be sitting in Downloads, in a messaging app’s media folder, or in the browser’s download history. Those files can be scanned directly, and the download timestamp is useful evidence of when, and from where, the app arrived.

Scan it before you install it

The scanner is just as useful before installation. If someone sends you an APK and asks you to install it "so we can share location" or "it’s a better keyboard", scan it first. If it hides its icon and wants device admin, you have your answer without ever installing it.

07 · Background

What the app scanner cannot do

We would rather you know the limits than find them out at a bad moment.

01

It cannot scan a phone remotely

It analyses a file you give it. The GuestSpy Android app can enumerate installed packages on the device it runs on, and only that device.

02

It cannot see what code does at runtime

The analysis is static. An app can download its real logic after installation, and a static scan of the stub only sees the stub. Dynamic code loading is flagged for exactly this reason.

03

It cannot read the APK of an app installed by a work profile or MDM that restricts package visibility, and it cannot analyse system apps that are part of the firmware unless you extract them yourself.

04

It does not detect iPhone apps

IOS apps cannot list other installed apps, and iOS monitoring usually works through account access or configuration profiles rather than an installed app, which is why the iPhone security check is a different tool entirely.

05

It can be wrong

That is why every verdict shows its evidence and why there is a community section underneath.

08 · Questions

Frequently asked questions

Does the APK get uploaded to your servers?

No. The parsing, hashing, decoding and matching all run inside your browser. The indicator database is downloaded to your device as part of the page. The only thing that leaves your device is a community report if you choose to submit one, and that contains the package name or hash and your vote, not the file.

The scan says "Known stalkerware" but the app looks like a normal game. Is that possible?

Yes. The match may be on the signing certificate or an embedded C2 domain, neither of which are visible from the app’s icon or name. Open the Identity and Network sections to see exactly what matched. Repackaged games with monitoring code injected are a real distribution method.

Why is the confidence "Heuristic" when the severity is 90?

Severity measures what the app can do. Confidence measures how certain we are about who made it. An app with an accessibility service, device admin, hidden icon and boot start is capable of a great deal (high severity) even if its certificate and package are not in any database (heuristic confidence). Both numbers are shown because both matter.

What is the difference between "Dangerous" and "Known stalkerware"?

"Known stalkerware" means a specific family in the database matched by hash, certificate or package name. "Dangerous" means the heuristic score is in the top band without a family match. In terms of what to do next, treat them the same.

Can I scan a split APK or an .xapk / .apks bundle?

Yes. Drop in the whole bundle. The scanner analyses the base APK for the manifest and certificate and hashes each split separately. Split configuration APKs (language and density packs) rarely contain anything interesting and are listed in the Code section for completeness.

How often is the database updated?

The indicator set is rebuilt from the Echap repository and our own rules whenever either changes. The stats block on the scanner page shows the current counts of families, packages, certificates, hashes and C2 domains that your browser has loaded.

Run a free scan right now

Drop an APK, a file, your installed-apps list or an iPhone configuration profile into the GuestSpy Web Scanner. Everything is analysed inside your browser. Nothing is uploaded.