Antidot Banking Trojan “scandar” Campaign

·

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 01 Evidence Intake 02 Anti-Analysis Fortress 03 APK Structure Teardown 04 B4A Layout — Overlay Revealed 05 Lure Behaviour & Kill Chain 06 Full Capability Map 07 Firebase FCM C2 Channel 08 MITRE ATT&CK Mobile 09 IOCs 10 Recommendations
🔴

Verdict & Severity

CRITICAL — ACTIVE CAMPAIGN
⚠
Antidot Android Banking Trojan — Campaign “scandar” Malware Family

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.

FieldValue
Malware FamilyAntidot Android Banking Trojan
Campaign IDscandar (from assets/sudoport.txt)
SeverityCRITICAL
StatusACTIVE CAMPAIGN
Build FrameworkB4A (Basic4Android)
C2 ChannelFirebase Cloud Messaging (FCM) v23.1.0
MFA BypassedYES — overlay captures credentials pre-MFA
Target RegionsFR / PT / MS / RO / ES / GL / EU / ID / TL (9 languages)
APK Timestamp2025-07-10 23:06 UTC
Signing CertCN=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
01
File Identification & Hash Verification 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

FileAlgorithmHash
Container ZIP SHA256 e8b1f3cee697cc74130fc81ff3a524fde8b0b2cea3f6e7fa6404a07384acd1ff
APK Payload SHA256 4be8d630cb586be691ace192030021185f630f45ccdd4752543389114f345fa2
APK Payload MD5 557ff691aaf2a5860a510a59cadba247
APK Size7,266,666 bytes (7.0 MB)
APK Timestamp2025-07-10 23:06 UTC
# Outer container extraction $ 7z e -p"infected" 4be8d630...zip -o/workspace/upload/apk_extracted/ Everything is Ok | Size: 7,266,666 | Compressed: 6,951,963 # APK identification $ file 4be8d630...apk Android package (APK), with classes.dex, with APK Signing Block
🛡️

Phase 2 — Anti-Analysis Fortress

EVASION TECHNIQUES
02
AES-256 Encrypted DEX & ZIP Path Traversal Obfuscation

The 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.
# ZIP flag check — flag_bits & 0x1 = encrypted $ python3 -c "import zipfile; z=zipfile.ZipFile(APK); [print(i.filename, 'ENCRYPTED' if i.flag_bits&1 else 'plain') for i in z.infolist()[:4]]" classes.dex ENCRYPTED classes2.dex ENCRYPTED AndroidManifest.xml ENCRYPTED resources.arsc ENCRYPTED # All 4 critical files protected — 206 fake entries unencrypted (decoys)

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.

03
Debug Certificate & B4A Framework Fingerprint Identity Evasion

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 pkcs7 decode → CN=Android Debug, OU=Android, O=US, C=US
  • 2B4A confirmed: binary string b4a found at raw APK offset 4,674,457. B4A layout file .bal present 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 ANALYSED
04
What the APK Reveals Without Decrypting the DEX Static Analysis

With 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 / ComponentSignificance
assets/sudoport.txtContains "scandar" — campaign identifier. Likely runtime decryption seed or C2 init key.
assets/viewportal.balB4A layout binary — defines the fullscreen WebView overlay component. Parsed successfully without DEX.
firebase-messaging.propertiesFCM v23.1.0 — confirms Firebase push notification C2 channel.
firebase-installations.propertiesFCM device registration v17.1.0.
firebase-analytics.propertiesTelemetry/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.RSASelf-signed debug cert — CN=Android Debug.
NOTICE.txtApache 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
05
viewportal.bal — Fullscreen WebView Architecture Overlay Attack

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

# viewportal.bal is 1234 bytes, contains a gzip-compressed layout descriptor $ python3 << EOF import zipfile, gzip, zlib, struct data = zipfile.ZipFile(APK).read("assets/viewportal.bal") idx = data.find(b"‹") # gzip magic compressed_len = struct.unpack_from("<I", data, idx-4)[0] result = zlib.decompress(data[idx:idx+compressed_len], 47) print(result.decode()) EOF LAutoScaleAll link.SetLeftAndRight(0 , 100%x) link.SetTopAndBottom(0 , 100%y) Variant specific script: 320x480,scale=1
  • ●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 THEFT
06
How Antidot Compromises a Device Kill Chain

Antidot 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 CAPABILITIES
07
What Antidot Does to the Victim’s Device Capabilities

Antidot 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
08
Why Firebase Makes This C2 Particularly Resilient C2 Channel

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
09
Technique Mapping MITRE ATT&CK
Technique IDNameEvidence in Sample
T1655.001Masquerade: Legitimate AppFake Google Play Services update lure, multi-language
T1406Obfuscated Files / InformationAES-256 encrypted DEX & ZIP path traversal (206 fake entries)
T1521Encrypted ChannelFirebase FCM push notifications as C2 transport
T1417.002GUI Input Capture: OverlayFull-screen WebView over banking/crypto apps (viewportal.bal)
T1417.001Input Capture: KeyloggingAccessibility service — 35+ custom accessibility actions
T1412Capture SMS Messagescall_notification strings + READ_SMS / RECEIVE_SMS
T1513Screen CaptureMediaProjection API — live screen stream to C2
T1616Call Controlcall_notification_decline/hang_up/screening_text strings
T1432Access Contact ListContact exfiltration via Accessibility API
T1626Abuse Elevation ControlAccessibility service exploitation for full device control
T1624Broadcast ReceiversBOOT_COMPLETED — persistence across device reboots
📋

Phase 9 — Indicators of Compromise

ALL DEFANGED
10
IOC Table — Static Analysis Findings IOCs

The 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.

TypeValueConfidenceNotes
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
C1
If a Device Is Already Infected Immediate Response
  • 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.

C2
Organisational Controls Hardening
  • 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_SOURCES via 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.com and *.firebaseio.com at 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.
C3
User Awareness — The One Rule That Stops This Training

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.

🌐 Website ▶️ YouTube ▶️ YouTube (2) 𝕏 Twitter / X ♫ TikTok ✈️ Telegram
🔍 IOC Scanner 🔧 Live Tools 📚 Courses 🚨 Threat Intel 📝 Blog 📋 SOPs

“They can't exploit you if you are the Exploit.”