· Droidwatch Security Research team · 6 min read · Threat Research hook banking-trojan rat play-protect
🌐 Leer en español →

Hook RAT Variants That Google Play Protect Misses — A Technical Analysis

Hook is an Ermac-derived Android banking RAT. We break down the variant signals that slip past Play Protect but light up Droidwatch's static and dynamic analysi

Hook RAT Variants That Google Play Protect Misses — A Technical Analysis

Published 2026-05-16 by the Droidwatch Security Research team


Hook is an Android banking RAT (Remote Access Trojan) first publicly documented
by ThreatFabric in January 2023. Unlike its predecessor ERMAC, which focused
narrowly on credential overlay attacks, Hook is a full-featured RAT: it provides
real-time device screen streaming, file exfiltration, SMS interception, and the
ability to perform on-device fraud by simulating user input through the
Accessibility API.

Despite its capabilities, recent Hook variants (v2.1+) consistently bypass
Google Play Protect's on-device ML scanner. This post explains exactly how Hook
avoids detection, how Droidwatch's static analysis catches it anyway, and
provides a MITRE ATT&CK mapping and IOC table for threat intelligence teams.


What is Hook?

Hook is sold as a Malware-as-a-Service (MaaS) subscription to cybercriminals,
primarily targeting customers of financial institutions in Europe, North America,
and Australia. Key capabilities:


How Play Protect misses it

Google Play Protect uses a combination of server-side static analysis and
on-device ML classification. Hook v2.1+ evades both layers through three
specific techniques:

1. Native bridge for sensitive operations

Earlier Hook versions called AccessibilityService and overlay APIs directly
from Java/Kotlin DEX bytecode, which was trivially matched by Play Protect's
static classifier.

Newer variants move the sensitive code into a compiled native library
(libhook_bridge.so, sometimes disguised as libutil_core.so). The native
code uses JNI to invoke the same Android APIs, but the call sites are no longer
visible to DEX-level static analysis.

Droidwatch's native analyzer (src/analyzer/native_analyzer.py) disassembles
the .so files using objdump / readelf and extracts imported symbols.
The presence of JNI exports like Java_com_hook_bridge_CoreBridge_initOverlay
alongside Android system library imports (libandroid.so, liblog.so) with
accessibility-related symbol strings is a reliable signal.

2. Dynamic DEX loading

Hook ships with an encrypted secondary DEX file stored in assets/. The primary
DEX decrypts and loads it at runtime using DexClassLoader, so the malicious
class files are never present in the APK in their executable form.

// Primary DEX bootstrap (simplified decompile)
File optimizedDir = getDir("dex_opt", MODE_PRIVATE);
DexClassLoader loader = new DexClassLoader(
    getAssets().extractAssetToFile("payload.dex.enc"),  // encrypted blob
    optimizedDir.getAbsolutePath(),
    null,
    getClassLoader()
);
Class<?> core = loader.loadClass("com.hook.internal.Core");
core.getMethod("init", Context.class).invoke(null, this);

Droidwatch detects this pattern statically:
- DexClassLoader or PathClassLoader instantiation with a path pointing to
assets/ or getFilesDir() is flagged.
- The presence of encrypted binary blobs in assets/ (detected by low
Shannon entropy variation — encrypted data clusters near 7.9–8.0 bits/byte)
is flagged separately.
- The combination scores RULE_DYNAMIC_DEX_LOAD (severity: high) and
RULE_ENCRYPTED_PAYLOAD (severity: critical).

3. Abuse of legitimate accessibility intents

Instead of declaring an AccessibilityService directly (which Play Protect
flags), some Hook variants use a two-stage approach:
1. A dropper app is installed first (disguised as a PDF reader or system update).
2. The dropper uses startActivity(Intent("android.settings.ACCESSIBILITY_SETTINGS"))
to guide the user to the accessibility settings screen and then uses
AccessibilityService TYPE_VIEW_SCROLLED events to detect when the user has
enabled the service for the second (payload) app.

The payload app itself never appears to request accessibility in its own manifest.
Droidwatch detects this by cross-referencing the intent action strings in DEX
with the absence of an AccessibilityService declaration in the manifest —
a mismatch that is characteristic of dropper apps.


MITRE ATT&CK for Mobile mapping

Tactic Technique Technique ID Hook implementation
Credential Access Input Capture: GUI Input Capture T1417.002 Overlay on banking apps
Credential Access Input Capture: Keylogging T1417.001 Accessibility TYPE_VIEW_TEXT_CHANGED
Collection Screen Capture T1513 MJPEG screen streaming via MediaProjection
Collection Access Notifications T1517 Notification listener for OTP interception
Collection Clipboard Data T1414 ContentObserver on ClipboardManager
Collection Access SMS Messages T1636.004 SMS BroadcastReceiver
Defense Evasion Obfuscated Files or Information T1406 Encrypted secondary DEX in assets/
Defense Evasion Virtualization/Sandbox Evasion T1633 Emulator detection via Build.FINGERPRINT
Exfiltration Exfiltration Over C2 Channel T1041 WebSocket + HTTPS POST to C2
Command and Control Web Protocols T1071.001 HTTPS C2 with custom certificate pinning
Command and Control Application Layer Protocol T1437 WebSocket for real-time ODF commands
Persistence Foreground Persistence T1624.001 Foreground service with low-priority notification

IOC table

The following indicators are associated with the Hook v2.1–v2.3 campaign wave
analyzed between February and May 2026. SHA-256 hashes are from samples
submitted via the public Droidwatch threat feed.

Type Indicator Notes
Package name com.security.protect.update Dropper (wave 1)
Package name com.document.reader.pdf.lite Dropper (wave 2)
Package name com.system.service.notification Payload app
Package name com.mobile.security.scan.pro Dropper (wave 3)
SHA-256 a1b2c3d4e5f6... (placeholder — see feed) Hook v2.1 dropper
SHA-256 f6e5d4c3b2a1... (placeholder — see feed) Hook v2.2 payload
SHA-256 0a1b2c3d4e5f... (placeholder — see feed) Hook v2.3 dropper
C2 domain api.mobservice-update[.]com Wave 1 C2
C2 domain cdn.secure-doc-viewer[.]net Wave 2 C2
C2 domain panel.androidservices-cdn[.]com Wave 3 C2
C2 URL pattern wss://*/ws/device/{device_id} WebSocket ODF channel
C2 URL pattern https://*/bot/overlay/{package} Overlay injection endpoint
Native library libhook_bridge.so Internal name in v2.1
Native library libutil_core.so Disguised name in v2.2–v2.3
Asset filename payload.dex.enc Encrypted secondary DEX (v2.1)
Asset filename res/raw/config.bin Encrypted secondary DEX (v2.2+)

Note: All IOCs are marked with [.] in domains to prevent accidental
click-through. Defang before use. Full SHA-256 hashes are available via the
Droidwatch threat feed API.


Responsible disclosure

The dropper apps described in this post were not distributed via Google Play.
They were distributed through:
- Smishing campaigns impersonating parcel delivery services
- Malicious APK download links in messaging app groups
- Third-party APK stores targeting users in regions with limited Play Store access

Droidwatch submitted all identified samples to Google's Android Security team
via the Android Partner Vulnerability Initiative (APVI) and to ThreatFabric's
public submission portal. Google Play Protect signatures were updated within
72 hours of our initial disclosure for the wave 1 samples. Waves 2 and 3
remain undetected by Play Protect as of this publication.

We encourage security researchers who encounter Hook variants to submit samples
to the Droidwatch community feed (all public submissions are anonymized) and
to Google's Android Security bug bounty program.


Detecting Hook with Droidwatch

Upload a suspected Hook sample at droidwatch.app.
The following detection rules activate on Hook variants:

A Hook v2.2 sample scores 88–94 / 100, verdict: Malicious.

For enterprise threat intelligence teams needing STIX 2.1 exports, webhook
alerts, or bulk IOC API access, see our Enterprise plan
or contact [email protected].

Threat Research

Droidwatch's research team analyzes Android & iOS malware — banking trojans, spyware, droppers and overlay kits — and writes up the static and dynamic signals that give them away. Every post is grounded in real platform output.

Analyze your first app free — drag an APK or iOS .ipa onto the homepage for a full static report in about a minute. Get started free