Translated ['', 'src/mobile-pentesting/android-app-pentesting/android-an

This commit is contained in:
Translator 2025-09-29 12:18:30 +00:00
parent ca15772bd9
commit 4470f54f72

View File

@ -2,46 +2,46 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
यह पृष्ठ उन Android ऐप्स के खिलाफ dynamic analysis को बहाल करने के लिए एक व्यावहारिक वर्कफ़्लो प्रदान करता है जो instrumentation का पता लगाते/रूट‑ब्लॉक करते हैं या TLS pinning लागू करते हैं। यह तेज़ triage, सामान्य detections, और बिना repacking के संभव होने पर उन्हें bypass करने के लिए copypasteable hooks/tactics पर केन्द्रित है यह पृष्ठ उन Android apps के खिलाफ डायनामिक analysis वापस पाने के लिए एक व्यावहारिक वर्कफ़्लो प्रदान करता है जो instrumentation का पता लगाते/रूट‑ब्लॉक करते हैं या TLS pinning लागू करते हैं। यह तेज़ triage, सामान्य detections, और कॉपी‑पेस्ट करने योग्य hooks/tactics पर केंद्रित है ताकि संभव होने पर बिना repacking के उन्हें bypass किया जा सके
## Detection Surface (what apps check) ## Detection Surface (what apps check)
- Root checks: su binary, Magisk paths, getprop values, common root packages - रूट जाँच: su binary, Magisk paths, getprop values, common root packages
- Frida/debugger checks (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs - Frida/debugger जाँच (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs
- Native antidebug: ptrace(), syscalls, antiattach, breakpoints, inline hooks - Native antidebug: ptrace(), syscalls, antiattach, breakpoints, inline hooks
- Early init checks: Application.onCreate() or process start hooks that crash if instrumentation is present - Early init checks: Application.onCreate() or process start hooks that crash if instrumentation is present
- TLS pinning: custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pins - TLS pinning: custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pins
## Step 1 — Quick win: hide root with Magisk DenyList ## Step 1 — Quick win: hide root with Magisk DenyList
- Zygisk को Magisk में सक्षम करें - Magisk में Zygisk सक्षम करें
- DenyList सक्षम करें, लक्ष्य पैकेज जोड़ें - DenyList सक्षम करें, target package जोड़ें
- रीबूट करें और पुनः परीक्षण करें - रीबूट करें और पुनः परीक्षण करें
कई ऐप्स केवल स्पष्ट संकेतकों (su/Magisk paths/getprop) की तलाश करते हैं। DenyList अक्सर naive checks को बेअसर कर देता है। कई ऐप्स केवल स्पष्ट संकेतकों (su/Magisk paths/getprop) की तलाश करते हैं। DenyList अक्सर सरल जाँचों को निष्क्रिय कर देता है।
References: संदर्भ:
- Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk - Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk
## Step 2 — 30second Frida Codeshare tests ## Step 2 — 30second Frida Codeshare tests
गहराई से जाने से पहले सामान्य dropin scripts आज़माएँ: गहराई में जाने से पहले सामान्य dropin scripts आज़माएँ:
- anti-root-bypass.js - anti-root-bypass.js
- anti-frida-detection.js - anti-frida-detection.js
- hide_frida_gum.js - hide_frida_gum.js
Example: उदाहरण:
```bash ```bash
frida -U -f com.example.app -l anti-frida-detection.js frida -U -f com.example.app -l anti-frida-detection.js
``` ```
ये सामान्यतः Java के root/debug checks, process/service scans, और native ptrace() को stub करते हैं। हल्के सुरक्षा वाले apps में उपयोगी; hardened targets को tailored hooks की जरूरत पड़ सकती है। ये आमतौर पर Java के root/debug checks, process/service scans, और native ptrace() को stub करते हैं। हल्के सुरक्षा वाले ऐप्स पर उपयोगी; hardened targets के लिए tailored hooks की जरूरत पड़ सकती है।
- Codeshare: https://codeshare.frida.re/ - Codeshare: https://codeshare.frida.re/
## Medusa (Frida framework) के साथ स्वचालित करें ## Medusa (Frida framework) के साथ ऑटोमेट करें
Medusa 90+ ready-made मॉड्यूल प्रदान करता है SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception, और अन्य के लिए। Medusa 90+ ready-made मॉड्यूल प्रदान करता है जो SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception, और अन्य के लिए हैं
```bash ```bash
git clone https://github.com/Ch0pin/medusa git clone https://github.com/Ch0pin/medusa
cd medusa cd medusa
@ -54,31 +54,31 @@ use http_communications/multiple_unpinner
use root_detection/universal_root_detection_bypass use root_detection/universal_root_detection_bypass
run com.target.app run com.target.app
``` ```
टिप: Medusa कस्टम hooks लिखने से पहले जल्दी नतीजे पाने के लिए बेहतरीन है। आप modules को cherry-pick करके उन्हें अपने scripts के साथ combine कर सकते हैं। टिप: Medusa जल्दी नतीजे हासिल करने के लिए बेहतरीन है, custom hooks लिखने से पहले। आप modules को चुनकर उन्हें अपने scripts के साथ मिला सकते हैं।
## Step 3 — init-time detectors को late attach करके bypass करें ## Step 3 — init-time detectors को late attach करके बायपास करें
कई detections केवल process spawn/onCreate() के दौरान ही चलते हैं। Spawntime injection (-f) या gadgets पकड़े जा सकते हैं; UI load होने के बाद attach करने से वे छूट सकते हैं। कई detections केवल process spawn/onCreate() के दौरान ही चलते हैं। Spawntime injection (-f) या gadgets पकड़े जाते हैं; UI लोड होने के बाद attach करने से ये बच सकते हैं।
```bash ```bash
# Launch the app normally (launcher/adb), wait for UI, then attach # Launch the app normally (launcher/adb), wait for UI, then attach
frida -U -n com.example.app frida -U -n com.example.app
# Or with Objection to attach to running process # Or with Objection to attach to running process
aobjection --gadget com.example.app explore # if using gadget aobjection --gadget com.example.app explore # if using gadget
``` ```
यदि यह काम करता है, तो session को स्थिर रखें और map और stub checks पर आगे बढ़ें। यदि यह काम करता है, तो सत्र को स्थिर रखें और मैप तथा स्टब जांचों पर आगे बढ़ें।
## चरण 4 — Jadx और string hunting के माध्यम से detection logic को मैप करें ## Step 4 — Jadx और string hunting के माध्यम से detection logic का मैप बनाना
Static triage keywords in Jadx: Jadx में Static triage के लिए keywords:
- "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger" - "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger"
सामान्य Java पैटर्न: आम Java पैटर्न:
```java ```java
public boolean isFridaDetected() { public boolean isFridaDetected() {
return getRunningServices().contains("frida"); return getRunningServices().contains("frida");
} }
``` ```
सामान्य APIs जिन्हें review/hook करना चाहिए: सामान्य APIs जिनकी review/hook की जानी चाहिए:
- android.os.Debug.isDebuggerConnected - android.os.Debug.isDebuggerConnected
- android.app.ActivityManager.getRunningAppProcesses / getRunningServices - android.app.ActivityManager.getRunningAppProcesses / getRunningServices
- java.lang.System.loadLibrary / System.load (native bridge) - java.lang.System.loadLibrary / System.load (native bridge)
@ -87,7 +87,7 @@ return getRunningServices().contains("frida");
## चरण 5 — Runtime stubbing with Frida (Java) ## चरण 5 — Runtime stubbing with Frida (Java)
custom guards को ओवरराइड करें ताकि वे repacking किए बिना सुरक्षित मान लौटाएँ: repacking के बिना सुरक्षित मान लौटाने के लिए custom guards को override करें:
```js ```js
Java.perform(() => { Java.perform(() => {
const Checks = Java.use('com.example.security.Checks'); const Checks = Java.use('com.example.security.Checks');
@ -102,7 +102,7 @@ const AM = Java.use('android.app.ActivityManager');
AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); }; AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); };
}); });
``` ```
Triaging early crashes? Crash होने से ठीक पहले classes को dump करें ताकि संभावित detection namespaces का पता चल सके: शुरुआती crashes का triage कर रहे हैं? क्रैश होने से ठीक पहले Dump classes करें ताकि संभावित detection namespaces का पता चल सके:
```js ```js
Java.perform(() => { Java.perform(() => {
Java.enumerateLoadedClasses({ Java.enumerateLoadedClasses({
@ -119,7 +119,7 @@ RootChecker.isDeviceRooted.implementation = function () { return false; };
} catch (e) {} } catch (e) {}
}); });
संदिग्ध विधियों को लॉग करें और निष्क्रिय करें ताकि निष्पादन प्रवाह की पुष्टि हो: संदिग्ध methods को Log और neuter करके execution flow की पुष्टि करें:
```js ```js
Java.perform(() => { Java.perform(() => {
const Det = Java.use('com.example.security.DetectionManager'); const Det = Java.use('com.example.security.DetectionManager');
@ -131,9 +131,9 @@ return false;
``` ```
## Bypass emulator/VM detection (Java stubs) ## Bypass emulator/VM detection (Java stubs)
सामान्य संकेत: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE में generic/goldfish/ranchu/sdk का होना; QEMU artifacts जैसे /dev/qemu_pipe, /dev/socket/qemud; डिफ़ॉल्ट MAC 02:00:00:00:00:00; 10.0.2.x NAT; telephony/sensors का अभाव सामान्य संकेत: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE में generic/goldfish/ranchu/sdk शामिल होना; QEMU artifacts जैसे /dev/qemu_pipe, /dev/socket/qemud; default MAC 02:00:00:00:00:00; 10.0.2.x NAT; telephony/sensors की अनुपस्थिति
Quick spoof of Build fields: Build fields का त्वरित spoof:
```js ```js
Java.perform(function(){ Java.perform(function(){
var Build = Java.use('android.os.Build'); var Build = Java.use('android.os.Build');
@ -143,11 +143,11 @@ Build.BRAND.value = 'google';
Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys'; Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys';
}); });
``` ```
फाइल अस्तित्व जांच और पहचानकर्ताओं (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) के लिए स्टब जोड़ें ताकि वे वास्तविक दिखने वाले मान लौटाएँ। ाइल अस्तित्व जांच और identifiers के लिए stubs जोड़ें (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) ताकि वे वास्तविक मान लौटाएँ।
## SSL pinning bypass quick hook (Java) ## SSL pinning bypass quick hook (Java)
कस्टम TrustManagers को निष्क्रिय करें और परमीसिव SSL contexts लागू करें: Custom TrustManagers को निष्क्रिय करें और permissive SSL contexts लागू करें:
```js ```js
Java.perform(function(){ Java.perform(function(){
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager'); var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
@ -165,28 +165,28 @@ return SSLContextInit.call(this, km, TrustManagers, sr);
}; };
}); });
``` ```
नोट्स Notes
- OkHttp के लिए: जरूरत के अनुसार okhttp3.CertificatePinner और HostnameVerifier को hook करें, या CodeShare से एक universal unpinning script का उपयोग करें - OkHttp के लिए विस्तारित करें: आवश्यकतानुसार okhttp3.CertificatePinner और HostnameVerifier को hook करें, या CodeShare से एक universal unpinning script का उपयोग करें
- उदाहरण चलाएँ: `frida -U -f com.target.app -l ssl-bypass.js --no-pause` - उदाहरण चलाएँ: `frida -U -f com.target.app -l ssl-bypass.js --no-pause`
## Step 6 — Java hooks असफल होने पर JNI/native trail का पालन करें ## Step 6 — जब Java hooks विफल हों तो JNI/native trail का अनुसरण करें
JNI entry points को ट्रेस करके native loaders और detection init का पता लगाएँ: JNI entry points को ट्रेस करके native loaders और detection init का पता लगाएँ:
```bash ```bash
frida-trace -n com.example.app -i "JNI_OnLoad" frida-trace -n com.example.app -i "JNI_OnLoad"
``` ```
बंडल किए गए .so फ़ाइलों का त्वरित native triage: बंडल किए गए .so फ़ाइलों का त्वरित नेटिव प्राथमिक मूल्यांकन:
```bash ```bash
# List exported symbols & JNI # List exported symbols & JNI
nm -D libfoo.so | head nm -D libfoo.so | head
objdump -T libfoo.so | grep Java_ objdump -T libfoo.so | grep Java_
strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root' strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root'
``` ```
इंटरैक्टिव/नेटीव reversing: इंटरैक्टिव/नैटिव reversing:
- Ghidra: https://ghidra-sre.org/ - Ghidra: https://ghidra-sre.org/
- r2frida: https://github.com/nowsecure/r2frida - r2frida: https://github.com/nowsecure/r2frida
उदाहरण: libc में सरल antidebug को मात देने के लिए ptrace को निष्क्रिय करें: उदाहरण: ptrace को निष्क्रिय करना ताकि libc में सरल antidebug को विफल किया जा सके:
```js ```js
const ptrace = Module.findExportByName(null, 'ptrace'); const ptrace = Module.findExportByName(null, 'ptrace');
if (ptrace) { if (ptrace) {
@ -195,35 +195,35 @@ return -1; // pretend failure
}, 'int', ['int', 'int', 'pointer', 'pointer'])); }, 'int', ['int', 'int', 'pointer', 'pointer']));
} }
``` ```
न्हें भी देखें: से भी देखें:
{{#ref}} {{#ref}}
reversing-native-libraries.md reversing-native-libraries.md
{{#endref}} {{#endref}}
## चरण 7 — Objection patching (embed gadget / strip basics) ## चरण 7 — Objection patching (embed gadget / strip basics)
जब आप repacking को runtime hooks की बजाय प्राथमिकता देते हैं, तो कोशिश करें: यदि आप runtime hooks के बजाय repacking को प्राथमिकता देते हैं, तो आज़माएँ:
```bash ```bash
objection patchapk --source app.apk objection patchapk --source app.apk
``` ```
Notes: नोट्स:
- Requires apktool; ensure a current version from the official guide to avoid build issues: https://apktool.org/docs/install - apktool की आवश्यकता; बिल्ड समस्याओं से बचने के लिए आधिकारिक गाइड से नवीनतम संस्करण सुनिश्चित करें: https://apktool.org/docs/install
- Gadget injection enables instrumentation without root but can still be caught by stronger inittime checks. - Gadget injection बिना root के instrumentation सक्षम करता है, लेकिन मजबूत inittime checks द्वारा अभी भी पकड़ा जा सकता है।
Optionally, add LSPosed modules and Shamiko for stronger root hiding in Zygisk environments, and curate DenyList to cover child processes. वैकल्पिक रूप से, LSPosed modules और Shamiko जोड़ें ताकि Zygisk environments में root छुपाने में मजबूती आए, और child processes को कवर करने के लिए DenyList को curate करें।
References: संदर्भ:
- Objection: https://github.com/sensepost/objection - Objection: https://github.com/sensepost/objection
## Step 8 — Fallback: Patch TLS pinning for network visibility ## Step 8 — Fallback: नेटवर्क दृश्यता के लिए TLS pinning को पैच करें
If instrumentation is blocked, you can still inspect traffic by removing pinning statically: यदि instrumentation अवरुद्ध है, तो आप pinning को स्थैतिक रूप से हटाकर ट्रैफ़िक का निरीक्षण कर सकते हैं:
```bash ```bash
apk-mitm app.apk apk-mitm app.apk
# Then install the patched APK and proxy via Burp/mitmproxy # Then install the patched APK and proxy via Burp/mitmproxy
``` ```
- टूल: https://github.com/shroudedcode/apk-mitm - टूल: https://github.com/shroudedcode/apk-mitm
- नेटवर्क कॉन्फिग CAtrust ट्रिक्स (और Android 7+ user CA trust) के लिए देखें: - नेटवर्क कॉन्फिग CAtrust ट्रिक्स (और Android 7+ user CA trust) के लिए देखें:
{{#ref}} {{#ref}}
make-apk-accept-ca-certificate.md make-apk-accept-ca-certificate.md
@ -233,7 +233,7 @@ make-apk-accept-ca-certificate.md
install-burp-certificate.md install-burp-certificate.md
{{#endref}} {{#endref}}
## उपयोगी कमांड चीटशीट ## उपयोगी कमांड चीट-शीट
```bash ```bash
# List processes and attach # List processes and attach
frida-ps -Uai frida-ps -Uai
@ -251,12 +251,30 @@ objection --gadget com.example.app explore
# Static TLS pinning removal # Static TLS pinning removal
apk-mitm app.apk apk-mitm app.apk
``` ```
## सुझाव और चेतावनियाँ ## Universal proxy forcing + TLS unpinning (HTTP Toolkit Frida hooks)
- ऐप्स लॉन्च पर क्रैश होने पर spawning करने की बजाय देर से attaching करना बेहतर है आधुनिक apps अक्सर system proxies को ignore कर देते हैं और multiple layers of pinning (Java + native) लागू करते हैं, जिससे user/system CAs इंस्टॉल होने के बावजूद traffic capture कठिन हो जाता है। एक व्यावहारिक तरीका यह है कि universal TLS unpinning को proxy forcing के साथ जोड़ दिया जाए, तैयार Frida hooks का उपयोग करके, और सब कुछ mitmproxy/Burp के माध्यम से route किया जाए।
- कुछ detections महत्वपूर्ण फ्लो (जैसे payment, auth) में पुनः चलते हैं — navigation के दौरान hooks सक्रिय रखें
- Static और dynamic दोनों मिलाएँ: Jadx में string hunt करके क्लासेज़ shortlist करें; फिर runtime पर verify करने के लिए methods को hook करें Workflow
- Hardened apps packers और native TLS pinning का उपयोग कर सकते हैं — native code को reverse करने की उम्मीद रखें - अपने host पर mitmproxy (या Burp) चलाएँ। सुनिश्चित करें कि डिवाइस host IP/port तक पहुँच सके।
- HTTP Toolkits consolidated Frida hooks लोड करें ताकि TLS को unpin किया जा सके और सामान्य stacks (OkHttp/OkHttp3, HttpsURLConnection, Conscrypt, WebView, आदि) में proxy उपयोग को मजबूर किया जा सके। यह CertificatePinner/TrustManager checks को बायपास करता है और proxy selectors को ओवरराइड करता है, इसलिए ट्रैफ़िक हमेशा आपके proxy के जरिए भेजा जाता है भले ही ऐप स्पष्ट रूप से proxies को disable करे।
- Frida और hook script के साथ target app शुरू करें, और mitmproxy में requests कैप्चर करें।
Example
```bash
# Device connected via ADB or over network (-U)
# See the repo for the exact script names & options
frida -U -f com.vendor.app \
-l ./android-unpinning-with-proxy.js \
--no-pause
# mitmproxy listening locally
mitmproxy -p 8080
```
Notes
- संभव होने पर सिस्टम-व्यापी प्रॉक्सी के साथ संयोजन करें via `adb shell settings put global http_proxy <host>:<port>`. The Frida hooks प्रॉक्सी के उपयोग को लागू करेंगे भले ही ऐप्स global settings को बायपास करें।
- यह technique आदर्श है जब आपको MITM mobile-to-IoT onboarding flows की ज़रूरत हो जहाँ pinning/proxy avoidance सामान्य हो।
- Hooks: https://github.com/httptoolkit/frida-interception-and-unpinning
## संदर्भ ## संदर्भ