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

Utrudnienia (Anti-Reversing Defenses)

TechnikaAndroid / iOSCelTypowe obejście przez pentestera
ObfuscationAndroid & iOSUtrudnienie zrozumienia logiki kodu (ukrywanie nazw, dead code, szyfrowanie stringów).Deobfuscatory, manualna analiza w Ghidra/JADX, Frida hook.
Anti-DebuggingAndroid & iOSWykrywanie podpiętego debuggera (ptrace, LLDB, JDWP).Binary patching, bypass w Frida (Interceptor.detachAll).
Anti-HookingAndroid & iOSBlokowanie frameworków typu Frida, Xposed, ElleKit.Ukrywanie Fridy (frida-gadget, obfuscation), patchowanie metod.
Root DetectionAndroidSprawdzenie obecności roota (pliki /su, Magisk, busybox).Hookowanie metod isRooted(), usunięcie checków z binarki.
Jailbreak DetectioniOSSprawdzenie jailbreaka (np. obecność Cydia, dostęp do /Applications).Hook w isJailbroken(), patch funkcji, podmiana zwrotów na false.
Emulator DetectionAndroidWykrywanie środowiska QEMU/Genymotion (np. brak IMEI, nietypowy hardware).Podmiana właściwości systemowych, Frida hook.
Integrity ChecksiOSSprawdzanie 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ść.


References