A password-protected ZIP arrived from MalwareBazaar containing a 7MB Android APK. Inside: a fully operational Antidot banking trojan carrying the internal campaign identifier “scandar” — a family first documented by Cyble in May 2024 and still being actively developed, with the PhantomCall variant (IBM X-Force) observed as recently as late 2025.
This post walks through the complete static analysis: how we peeled back the anti-analysis layers, what the B4A layout file revealed about the overlay attack mechanism, why the Firebase C2 channel is particularly hard to block, and exactly what an attacker can do to a victim’s device once Accessibility permission is granted.
No dynamic sandbox was available for this analysis — every finding below came from static techniques: ZIP inspection, binary string extraction, layout file parsing, and cross-referencing with published Antidot threat intelligence.
◈ Table of Contents
Verdict & Severity
CRITICAL — ACTIVE CAMPAIGN
This sample is a confirmed variant of the Antidot
Android banking trojan. Antidot masquerades as a Google Play Services update, abuses Android
Accessibility services to gain full device control, and deploys a fullscreen WebView overlay
over targeted banking and cryptocurrency applications to silently steal credentials.
The campaign identifier “scandar” was found
plaintext in assets/sudoport.txt — likely used as a runtime decryption seed
or C2 initialisation key. MFA does not protect against this attack: credentials are captured
at the overlay level before any MFA prompt is seen.
| Field | Value |
|---|---|
| Malware Family | Antidot Android Banking Trojan |
| Campaign ID | scandar (from assets/sudoport.txt) |
| Severity | CRITICAL |
| Status | ACTIVE CAMPAIGN |
| Build Framework | B4A (Basic4Android) |
| C2 Channel | Firebase Cloud Messaging (FCM) v23.1.0 |
| MFA Bypassed | YES — overlay captures credentials pre-MFA |
| Target Regions | FR / PT / MS / RO / ES / GL / EU / ID / TL (9 languages) |
| APK Timestamp | 2025-07-10 23:06 UTC |
| Signing Cert | CN=Android Debug (self-signed, not Play Store) |
This is not a proof-of-concept. The infrastructure (Firebase project, overlay targets, C2 backend) is embedded inside AES-256 encrypted DEX and only activates at runtime. The campaign was built to run silently and at scale.
Phase 1 — Evidence Intake
HASHING & TRIAGE
The sample arrived as a MalwareBazaar-format ZIP — a password-protected archive named with
the SHA256 hash of its contents, using the standard community password infected.
Extraction via 7z revealed a single Android APK of the same hash name: 7.0 MB, timestamped
July 2025, bearing APK v2+v3 signing and confirmed as a legitimate Android package by the
classes.dex + APK Signing Block markers.
◈ Evidence Hashes
| File | Algorithm | Hash |
|---|---|---|
| Container ZIP | SHA256 | e8b1f3cee697cc74130fc81ff3a524fde8b0b2cea3f6e7fa6404a07384acd1ff |
| APK Payload | SHA256 | 4be8d630cb586be691ace192030021185f630f45ccdd4752543389114f345fa2 |
| APK Payload | MD5 | 557ff691aaf2a5860a510a59cadba247 |
| APK Size | 7,266,666 bytes (7.0 MB) | |
| APK Timestamp | 2025-07-10 23:06 UTC | |
Phase 2 — Anti-Analysis Fortress
EVASION TECHNIQUESThe first thing that breaks every automated analysis tool is the encryption. When we opened the APK as a ZIP archive, Python’s zipfile module reported all four critical files as AES-256 encrypted. No standard decompiler — apktool, jadx, baksmali — can touch an APK when its DEX and manifest are encrypted at the ZIP level. This is the primary anti-analysis layer. The second layer is 206 fake ZIP entries with deliberately malformed path names designed to crash tools that parse them naively.
◈ Encrypted Core Files
- 🔒classes.dex — AES-256 encrypted, 9.0 MB. The entire malicious Java payload. Cannot be decompiled without runtime key.
- 🔒classes2.dex — AES-256 encrypted. Secondary DEX likely containing overlay target list and Firebase configuration.
- 🔒AndroidManifest.xml — AES-256 encrypted. Hides package name, declared permissions, activities, services, and broadcast receivers.
- 🔒resources.arsc — AES-256 encrypted. Compiled resource table — hides string resources, UI elements, and app metadata.
The 206 fake entries use path traversal names like /AndroidManifest.xml///, classes.dex/\\ — these are deliberately crafted to crash ZIP parsers that do not validate paths. This is an active anti-forensic countermeasure, not a build artifact.
The APK is signed with a generic Android Debug certificate
— CN=Android Debug, OU=Android, O=US. This is a self-signed certificate
with no developer identity, no Play Store association, and no way to attribute the app to
any organisation. Combined with the B4A (Basic4Android) build framework — a BASIC-like
Android development tool popular among threat actors precisely because fewer automated
analysis pipelines are tuned for it — this sample is engineered to slip through
standard fingerprinting.
- 1Certificate extracted:
META-INF/ANDROIDD.RSA→openssl pkcs7decode →CN=Android Debug, OU=Android, O=US, C=US - 2B4A confirmed: binary string
b4afound at raw APK offset 4,674,457. B4A layout file.balpresent in assets. - 3APK signing scheme: v2 + v3 (
X-Android-APK-Signed: 2, 3) — modern signing standard, validates correctly on Android 7+.
B4A-built malware is a deliberate choice. Most automated Android malware pipelines are trained on Java/Kotlin DEX patterns. B4A produces different bytecode structures and class naming conventions, reducing detection rates on platforms that rely on signature-based DEX pattern matching.
Phase 3 — APK Structure Teardown
210 ENTRIES ANALYSEDWith the DEX encrypted, we focused on the 206 unencrypted entries — metadata files, Firebase property files, Kotlin builtins, and most importantly, the two asset files. The unencrypted infrastructure tells a clear story: Firebase for C2, OkHttp3 for REST calls, Kotlin coroutines for async communication, and a B4A layout file that hands us the entire overlay architecture on a plate.
◈ Notable Unencrypted Components
| File / Component | Significance |
|---|---|
| assets/sudoport.txt | Contains "scandar" — campaign identifier. Likely runtime decryption seed or C2 init key. |
| assets/viewportal.bal | B4A layout binary — defines the fullscreen WebView overlay component. Parsed successfully without DEX. |
| firebase-messaging.properties | FCM v23.1.0 — confirms Firebase push notification C2 channel. |
| firebase-installations.properties | FCM device registration v17.1.0. |
| firebase-analytics.properties | Telemetry/analytics back to attacker infrastructure. |
| okhttp3/ | HTTP client library — used for REST API calls to C2 backend. |
| kotlin/ | Kotlin coroutines — async C2 communication loops. |
| META-INF/ANDROIDD.RSA | Self-signed debug cert — CN=Android Debug. |
| NOTICE.txt | Apache 2.0 license for javapoet.jar — open source component used in code generation. |
◕ Key Strings From Raw APK Binary
- call_notification_decline_action — call interception confirmed
- call_notification_hang_up_action — remote call termination
- call_notification_screening_text — incoming call screening
- accessibility_custom_action_0 through _35 — 35+ accessibility hooks
- Multi-language Google Play lure strings: FR / PT / MS / RO / ES / ID / TL
- scandar (from assets/sudoport.txt) — only unencrypted campaign marker
Phase 4 — The B4A Layout File: Overlay Exposed
CRITICAL FINDING
assets/viewportal.bal is a B4A binary layout descriptor — the visual
blueprint of the malware’s attack interface. Unlike the encrypted DEX, this file
is stored unencrypted and can be parsed with a gzip decompressor. What it reveals is the
complete overlay attack mechanism: a single WebView component named link,
set to fill 100% of screen width and 100% of screen height,
with JavaScript fully enabled. This is the fake login page engine.
◈ Layout File Parse
- ●Component name:
link— the WebView object. Named to look innocuous in code references. - ●Width:
SetLeftAndRight(0, 100%x)— fills 100% of screen width. No frame, no border, no title bar. - ●Height:
SetTopAndBottom(0, 100%y)— fills 100% of screen height. The overlay IS the entire screen. - ●javaScriptEnabled: true — confirmed in the binary section. The fake page can run arbitrary JS, capture form input, call native methods.
- ●zoomEnabled: true — the fake page zooms to match device DPI, making it indistinguishable from the real app.
- ●AutoScaleAll — the layout scales to any Android screen size automatically. Works on phones and tablets.
When the overlay fires, the victim sees a pixel-perfect replica of their banking or crypto app login screen — running inside a fullscreen WebView that covers the real app entirely. There is no visual indicator that anything is wrong. The victim enters their credentials and proceeds normally. The credentials are gone.
Phase 5 — Lure Behaviour & Attack Kill Chain
DELIVERY TO CREDENTIAL THEFTAntidot uses a two-stage social engineering approach. Stage one tricks the victim into installing the APK and granting Accessibility permissions. Stage two uses those permissions to silently overlay target apps and exfiltrate credentials. The entire flow is automated and requires no interaction from the attacker after the APK is deployed.
◈ Attack Stages
- 1Delivery: APK distributed via smishing, malvertising, fake app stores, or third-party download links. Never distributed via Google Play.
- 2Fake lure page: On launch, displays a convincing “Google Play Services update required” screen in the device’s own language (9 confirmed languages). Victim sees familiar branding.
- 3Permission harvest: Victim clicks “Update” → redirected to Android Accessibility Settings. Told they must enable a “service” to complete the update. Victim enables it.
- 4Full device control: Accessibility permission grants the malware the ability to read all screen content, inject input events, intercept notifications, and monitor all app launches.
- 5C2 check-in: Firebase FCM connection established. Attacker receives device registration. Can now push commands: which apps to overlay, when to fire, what to capture.
- 6Overlay trigger: Malware monitors for target banking/crypto app launches. When target opens → fullscreen WebView (
link) fires instantly, covering the real app. - 7Credential capture: Victim enters credentials into the fake login page. Data sent to C2. Malware dismisses overlay, real app continues — victim has no idea anything happened.
- 8Persistence: BOOT_COMPLETED broadcast receiver ensures malware restarts on device reboot. Continues operating silently until detected or removed.
◕ Languages Confirmed in Lure Strings
- French (FR) — “Activer les services Google Play”
- Portuguese-Brazilian (PT) — “Atualizar o Google Play Services”
- Malay (MS) — “Dayakan perkhidmatan Google Play”
- Romanian (RO) — “Eroare a serviciilor Google Play”
- Spanish (ES) — “Obtener servicios de Google Play”
- Galician (GL) — “Erro nos servizos de Google Play”
- Basque (EU) — “Hasi saioa Google-ko kontuarekin”
- Indonesian (ID) — “Ketersediaan layanan Google Play”
- Filipino (TL) — “Nagsi-screen ng papasok na tawag”
Phase 6 — Full Capability Map
12 CONFIRMED CAPABILITIESAntidot is not a single-purpose credential stealer. It is a full-featured Android RAT with banking trojan specialisation. The capability set confirmed below comes from a combination of static string analysis on this sample and published Antidot threat intelligence from Cyble, IBM X-Force, and SecurityWeek.
WebView Overlay
Fullscreen fake login pages deployed over banking and crypto apps. Victim cannot see or reach the real app underneath. Credentials captured by the overlay.
Keylogging
Accessibility service captures every keystroke system-wide — passwords, PINs, search terms, messages. No input field is safe after Accessibility is granted.
SMS Interception
Reads and forwards all incoming SMS messages in real time, including banking OTPs, MFA codes, and account verification messages.
Call Control
Intercepts, screens, and declines incoming calls. Can forward calls and initiate USSD requests silently — enabling direct banking account queries.
VNC / Screen Stream
MediaProjection API streams a live view of the device screen to the attacker’s C2. Full remote viewing of everything the victim does.
Camera Capture
On-demand camera photo capture sent to C2. Can photograph the victim, their environment, or ID documents displayed on screen.
Contact Exfiltration
Full contact list exfiltrated to attacker. Used for targeted follow-up attacks on the victim’s network and for smishing campaign distribution.
App Install / Uninstall
REQUEST_INSTALL_PACKAGES — attacker can silently install additional payload APKs or remove security apps from the device.
Device Lock / Unlock
Remote device lock and unlock commands. Can lock victim out of their own device as leverage or to prevent them interfering during an active session.
MFA does not protect against Antidot. The overlay captures credentials at the UI level — before the real app processes them. SMS-based OTPs are intercepted independently via READ_SMS. An attacker with an Antidot-infected device has everything they need to initiate and complete a fraudulent transaction.
Phase 7 — Firebase FCM Command & Control
HARD-TO-BLOCK C2
Most banking trojans use HTTP/WebSocket C2 — connections that stand out in network
traffic and can be blocked at DNS or IP level once the C2 server is identified.
Antidot’s use of Firebase Cloud Messaging (FCM)
as its primary C2 channel sidesteps almost all of those defences. FCM is Google
infrastructure. Blocking fcm.googleapis.com breaks every legitimate Android app
that uses push notifications — including the banking apps Antidot is targeting.
- 1Traffic blending: C2 commands arrive as Firebase push notifications. Indistinguishable from legitimate app notifications at the network layer.
- 2No suspicious outbound: When idle, the malware makes zero suspicious connections. Standard network monitoring sees only periodic FCM heartbeats — normal Android behaviour.
- 3Shared infrastructure: All Firebase traffic goes through
fcm.googleapis.com. You cannot block the attacker’s project without blocking all FCM traffic. - 4Firebase SDK versions: messaging v23.1.0, installations v17.1.0, analytics — current stable versions. No version-based detection signal.
- 5Project ID hidden: The Firebase project ID, which would identify the attacker’s Google account, is embedded in the encrypted DEX. Not recoverable via static analysis.
The Firebase project ID is the single most valuable IOC in any Antidot sample — it identifies the attacker’s Google account and can be reported for takedown. Extracting it requires dynamic analysis: run the APK in an instrumented emulator with Frida hooked on FirebaseApp.initializeApp() to capture the options object at runtime.
Phase 8 — MITRE ATT&CK for Mobile
11 TECHNIQUES MAPPED| Technique ID | Name | Evidence in Sample |
|---|---|---|
| T1655.001 | Masquerade: Legitimate App | Fake Google Play Services update lure, multi-language |
| T1406 | Obfuscated Files / Information | AES-256 encrypted DEX & ZIP path traversal (206 fake entries) |
| T1521 | Encrypted Channel | Firebase FCM push notifications as C2 transport |
| T1417.002 | GUI Input Capture: Overlay | Full-screen WebView over banking/crypto apps (viewportal.bal) |
| T1417.001 | Input Capture: Keylogging | Accessibility service — 35+ custom accessibility actions |
| T1412 | Capture SMS Messages | call_notification strings + READ_SMS / RECEIVE_SMS |
| T1513 | Screen Capture | MediaProjection API — live screen stream to C2 |
| T1616 | Call Control | call_notification_decline/hang_up/screening_text strings |
| T1432 | Access Contact List | Contact exfiltration via Accessibility API |
| T1626 | Abuse Elevation Control | Accessibility service exploitation for full device control |
| T1624 | Broadcast Receivers | BOOT_COMPLETED — persistence across device reboots |
Phase 9 — Indicators of Compromise
ALL DEFANGEDThe following IOCs were extracted via static analysis. C2 domains, Firebase project ID, and overlay target application list are embedded inside the AES-256 encrypted DEX and could not be recovered without dynamic analysis. Runtime extraction via Frida is recommended to complete the IOC set.
| Type | Value | Confidence | Notes |
|---|---|---|---|
| SHA256 | 4be8d630cb586be691ace192030021185f630f45ccdd4752543389114f345fa2 | HIGH | APK payload hash |
| MD5 | 557ff691aaf2a5860a510a59cadba247 | HIGH | APK payload hash |
| Campaign ID | scandar | HIGH | assets/sudoport[.]txt — runtime key / campaign marker |
| Certificate CN | CN=Android Debug, OU=Android, O=US | HIGH | Self-signed debug cert — hunt for other APKs with same cert |
| Asset File | assets/viewportal[.]bal | HIGH | B4A layout — WebView overlay blueprint |
| Asset File | assets/sudoport[.]txt | HIGH | Campaign key file |
| Firebase SDK | firebase-messaging v23[.]1[.]0 | MEDIUM | C2 transport layer |
| APK Signing | X-Android-APK-Signed: 2, 3 | MEDIUM | v2+v3 signing scheme |
| C2 Domain | [ENCRYPTED — inside DEX] | — | Requires Frida dynamic extraction |
| Firebase Project ID | [ENCRYPTED — inside DEX] | — | Required for Google MSRC takedown report |
Phase 10 — Recommendations
PRIORITISED ACTIONS- 1Assume all credentials are compromised — immediately revoke and reset all banking, corporate, and email passwords entered on that device since the APK was installed.
- 2Contact your bank immediately — request a temporary block on the account and review recent transactions for unauthorised activity.
- 3Factory reset the device — do not attempt to manually remove the APK. Antidot’s Accessibility permissions allow it to resist removal. Full wipe is the only reliable remediation.
- 4Revoke active sessions on all accounts that were accessed from the infected device — banking, email, corporate SSO, crypto exchanges.
Do not trust any account activity, MFA confirmations, or OTPs that passed through the infected device during the infection window. Antidot intercepts SMS OTPs independently of the overlay attack — even accounts not overlaid may have had credentials harvested via keylogging.
- 1Mobile Threat Defence (MTD): Deploy Lookout, Zimperium, or Pradeo on all corporate-managed Android devices. MTD would catch this at install via permission pattern analysis before the Accessibility grant happens.
- 2MDM sideloading policy: Enforce
DISALLOW_INSTALL_UNKNOWN_SOURCESvia your MDM (Intune, Jamf, VMware Workspace ONE). Antidot is never distributed via Play Store — sideloading is the only install vector. - 3Firebase FCM blocking on corporate Wi-Fi: If BYOD Android devices access sensitive systems on your network, consider blocking
fcm.googleapis.comand*.firebaseio.comat the network edge. This cuts the Antidot C2 channel on your network. - 4Submit APK hash to your MTD vendor for detection rule creation: SHA256
4be8d630...45fa2. - 5Submit to Google: Report to
[email protected]with the SHA256 hash and campaign name “scandar”. This feeds Google Play Protect and Android Safe Browsing detection.
Antidot cannot function without Accessibility permission. That permission requires the victim to manually navigate to Settings and enable it. This is the single chokepoint in the entire kill chain — and it is entirely social-engineered. The countermeasure is simple awareness.
- ⚠Google Play Services NEVER updates via a pop-up. Updates happen automatically and silently through the Play Store. Any app claiming to be a “Google Play Services update” that asks you to do anything is malicious.
- ⚠Accessibility permissions are extremely sensitive. No legitimate banking, social, or utility app needs Accessibility access. If any app asks for it, deny it and uninstall the app.
- ⚠Only install apps from Google Play. Side-loaded APKs from links in SMS, email, WhatsApp, or websites are the primary Antidot delivery vector.
Run dynamic analysis in Any.run Android sandbox or Tria.ge to extract the Firebase project ID, overlay target app list, and C2 domain from the decrypted runtime DEX. The Firebase project ID is the key IOC for a Google takedown report and will complete this investigation.
The “scandar” Antidot variant is a professionally built, actively maintained banking trojan with a 9-language lure, encrypted payload, and Firebase C2 that blends into legitimate Android traffic. Static analysis alone surfaced the campaign identifier, the full overlay architecture, and confirmed the malware family — but the C2 infrastructure and target app list remain encrypted and require dynamic analysis to complete.
This is exactly the kind of sample that slips past basic AV: no suspicious network traffic at rest, no native libraries, no Play Store presence, and a DEX that no static analyser can touch without the runtime key. The investigation chain continues.
◈ Stay Connected
Follow CyberHawk Threat Intel for threat investigations, malware teardowns and hands-on security content.
“They can't exploit you if you are the Exploit.”