Manipulacja i inżynieria wsteczna
W testach bezpieczeństwa aplikacji mobilnych sprawdzamy nie tylko podatności, ale też odporność na manipulację i inżynierię wsteczną. Celem jest ocena, czy zastosowane mechanizmy utrudniają atakującemu analizę i modyfikację aplikacji, czy można je łatwo obejść.
Inżynieria wsteczna i manipulacja aplikacją
Inżynieria wsteczna (Reverse engineering) to rozbieranie aplikacji na części (dekompilacja, disassembly, analiza kodu i zasobów), żeby zrozumieć, jak działa. Z kolei Manipulacja aplikacją (Tampering) to ingerencja w aplikację (binarkę lub proces w czasie działania), żeby zmienić jej zachowanie — np. obejść zabezpieczenia albo sprawdzić, jak reaguje na manipulacje (np. obejście SSL pinning, root/jailbreak check, sprawdzić zabezpieczenia z MASVS-R).
Disassemblers / Decompilers - tłumaczenie kodu binarnego na assembler lub język wysokiego poziomu (Java, ARM). Narzędzia: JADX, Ghidra, IDA, Hopper.Przykład: analiza funkcji zawierającej string „jailbreak” i sprawdzenie jej logiki. Moesz to wykorzystać dalej np. Znajdujesz w binarce funkcję checkJailbreak(), widzisz, że zwraca true, jeśli wykryje plik /Applications/Cydia.app. To miejsce możesz potem wykorzystać do modyfikacji: np. w patchingu zmienić return true na return false albo w injection podmienić wynik w runtime. 👉 Decompiler jest więc krokiem przygotowawczym do binary patchingu lub code injection.
Binary Patching (modyfikacja na stałe) - modyfikacja skompilowanej aplikacji (APK/IPA). Zmiany wprowadzane w hex-edytorze lub po dekompilacji i ponownej kompilacji. Wymaga ponownego podpisania aplikacji. Przykład: zmiana komunikatu alertu lub usunięcie sprawdzania roota/jailbreaka.
Code Injection (modyfikacja w locie) - wstrzykiwanie kodu do działającej aplikacji w celu podmiany zachowania metod.Narzędzia: Frida (Android/iOS), Xposed (Android), ElleKit (iOS).Przykład: hook metody isJailbroken() i zwrócenie false.
Debugging i tracing (nie zmieniasz kodu, tylko podglądasz) - podgląd i kontrola, bez modyfikacji (ale też można zmienić stan pamięci w locie, więc granica jest cienka).Debugging: - interaktywne zatrzymanie procesu, sprawdzanie stanu pamięci/rejestrów.Tracing: - pasywne logowanie wywołań (np. API calls).
Binary Patching (modyfikacja na stałe) - modyfikacja skompilowanej aplikacji (APK/IPA). Zmiany wprowadzane w hex-edytorze lub po dekompilacji i ponownej kompilacji. Wymaga ponownego podpisania aplikacji. Przykład: zmiana komunikatu alertu lub usunięcie sprawdzania roota/jailbreaka.
Code Injection (modyfikacja w locie) - wstrzykiwanie kodu do działającej aplikacji w celu podmiany zachowania metod.Narzędzia: Frida (Android/iOS), Xposed (Android), ElleKit (iOS).Przykład: hook metody isJailbroken() i zwrócenie false.
Debugging i tracing (nie zmieniasz kodu, tylko podglądasz) - podgląd i kontrola, bez modyfikacji (ale też można zmienić stan pamięci w locie, więc granica jest cienka).Debugging: - interaktywne zatrzymanie procesu, sprawdzanie stanu pamięci/rejestrów.Tracing: - pasywne logowanie wywołań (np. API calls).
Utrudnienia (Anti-Reversing Defenses)
| Technika | Android / iOS | Cel | Typowe obejście przez pentestera |
|---|---|---|---|
| Obfuscation | Android & iOS | Utrudnienie zrozumienia logiki kodu (ukrywanie nazw, dead code, szyfrowanie stringów). | Deobfuscatory, manualna analiza w Ghidra/JADX, Frida hook. |
| Anti-Debugging | Android & iOS | Wykrywanie podpiętego debuggera (ptrace, LLDB, JDWP). | Binary patching, bypass w Frida (Interceptor.detachAll). |
| Anti-Hooking | Android & iOS | Blokowanie frameworków typu Frida, Xposed, ElleKit. | Ukrywanie Fridy (frida-gadget, obfuscation), patchowanie metod. |
| Root Detection | Android | Sprawdzenie obecności roota (pliki /su, Magisk, busybox). | Hookowanie metod isRooted(), usunięcie checków z binarki. |
| Jailbreak Detection | iOS | Sprawdzenie jailbreaka (np. obecność Cydia, dostęp do /Applications). | Hook w isJailbroken(), patch funkcji, podmiana zwrotów na false. |
| Emulator Detection | Android | Wykrywanie środowiska QEMU/Genymotion (np. brak IMEI, nietypowy hardware). | Podmiana właściwości systemowych, Frida hook. |
| Integrity Checks | iOS | Sprawdzanie integralności binarki (czy IPA nie była modyfikowana). | Binary patching → usunięcie/wypaczenie checków. |
⚠️ Uwagi:
- Brak powyższych mechanizmów nie oznacza podatności — to tylko dodatkowe utrudnienia.
- Wszystkie techniki można obejść, ale ich łączenie (defense-in-depth) znacząco zwiększa koszt i czas ataku.
- W praktyce pentester sprawdza nie tylko czy są obecne, ale też jak łatwo można je obejść.