Performs runtime dynamic analysis of Android applications using Frida, Objection, and Android Debug Bridge to observe application behavior during execution, intercept function calls, modify
Scanned 9/8/2026
Install to Claude Code
npx -y skills add MustafaKemal0146/fetih --skill performing-dynamic-analysis-of-android-app --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Performing Dynamic Analysis Of Android App?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/mustafakemal0146-performing-dynamic-analysis-of-android-app)More formats (shields.io, HTML) on the badges page.
---
name: performing-dynamic-analysis-of-android-app
description: Performs runtime dynamic analysis of Android applications using Frida, Objection, and Android Debug Bridge to observe application behavior during execution, intercept function calls, modify
runtime values, and identify vulnerabilities that static analysis misses. Use testing yaparken Android apps for runtime security flaws, hooking sensitive methods, bypassing client-side protections, or analyzing
obfuscated applications. Activates for requests involving Android dynamic analysis, runtime hooking,...
tags:
- frida
- fetih
- mobile-security
- owasp-mobile
- cybersecurity
- penetration-testing
- dynamic-analysis
- siber-güvenlik
- android
triggers:
- alert
- analysis
- android
- api
- crypto
- dynamic
- encryption
- http
- log
- network
- password
- performing
category: mobile-security
source_subdomain: mobile-security
nist_csf:
- PR.PS-01
- PR.AA-05
- ID.RA-01
- DE.CM-09
adapted_for: fetih
---
# Performing Dynamic Analysis of Android App
## Ne Zaman Kullanılır
Use bu skill when:
- Static analysis results need runtime validation on an actual Android device
- The target app uses obfuscation (DexGuard, custom packers) that prevents effective static analysis
- Testing requires observing actual API calls, decrypted data, or runtime-generated values
- Assessing root Tespit, tamper Tespit, or anti-debugging implementations
**Kullanma:** bu skill on production environments without authorization -- dynamic instrumentation can alter app behavior and trigger security alerts.
## Ön Gereksinimler
- Rooted Android device or emulator (Genymotion, Android Studio AVD with writable system)
- Frida server kurulu: device matching the architecture (arm64, x86_64)
- Python 3.10+ with `frida-tools` and `objection` packages
- ADB configured and device connected
- Target APK kurulu: device
## İş Akışı
### Adım 1: Setup Frida Server on Android Device
```bash
adb shell getprop ro.product.cpu.abi
adb push frida-server-16.x.x-android-arm64 /data/local/tmp/frida-server
adb shell chmod 755 /data/local/tmp/frida-server
adb shell /data/local/tmp/frida-server &
frida-ps -U
```
### Adım 2: Enumerate Application Attack Surface
```bash
frida-ps -U -a
objection --gadget com.target.app explore
android hooking list activities
android hooking list services
android hooking list receivers
android hooking list classes
android hooking search classes com.target.app
```
### Adım 3: Hook Sensitive Methods
```bash
android hooking watch class com.target.app.auth.LoginManager
android hooking watch class_method com.target.app.auth.LoginManager.authenticate --dump-args --dump-return
android hooking watch class javax.crypto.Cipher --dump-args
android hooking watch class java.security.MessageDigest --dump-args
android hooking watch class okhttp3.OkHttpClient --dump-args
android hooking watch class java.net.URL --dump-args
```
### Adım 4: Write Custom Frida Scripts for Deep Analysis
```javascript
// hook_crypto.js - Intercept encryption/decryption operations
Java.perform(function() {
var Cipher = Java.use("javax.crypto.Cipher");
Cipher.doFinal.overload("[B").implementation = function(input) {
var mode = this.getAlgorithm();
console.log("[Cipher] Algorithm: " + mode);
console.log("[Cipher] Input: " + bytesToHex(input));
var result = this.doFinal(input);
console.log("[Cipher] Output: " + bytesToHex(result));
return result;
};
function bytesToHex(bytes) {
var hex = [];
for (var i = 0; i < bytes.length; i++) {
hex.push(("0" + (bytes[i] & 0xFF).toString(16)).slice(-2));
}
return hex.join("");
}
});
```
```bash
frida -U -f com.target.app -l hook_crypto.js --no-pause
```
### Adım 5: Bypass Root Tespit
```javascript
// root_bypass.js - Common root Tespit bypass
Java.perform(function() {
// Bypass RootBeer library
var RootBeer = Java.use("com.scottyab.rootbeer.RootBeer");
RootBeer.isRooted.implementation = function() {
console.log("[RootBeer] isRooted() bypassed");
return false;
};
// Bypass generic file-based root checks
var File = Java.use("java.io.File");
var originalExists = File.exists;
File.exists.implementation = function() {
var path = this.getAbsolutePath();
var rootPaths = ["/system/app/Superuser.apk", "/system/xbin/su",
"/sbin/su", "/system/bin/su", "/data/local/bin/su"];
if (rootPaths.indexOf(path) >= 0) {
console.log("[Root] Blocked check for: " + path);
return false;
}
return originalExists.call(this);
};
// Bypass SafetyNet/Play Integrity
try {
var SafetyNet = Java.use("com.google.android.gms.safetynet.SafetyNetApi");
console.log("[SafetyNet] Class found - may need additional bypass");
} catch(e) {}
});
```
### Adım 6: Analyze Network Communication at Runtime
```javascript
// network_monitor.js - Monitor all HTTP requests
Java.perform(function() {
// Hook OkHttp3
try {
var OkHttpClient = Java.use("okhttp3.OkHttpClient");
var Interceptor = Java.use("okhttp3.Interceptor");
var Chain = Java.use("okhttp3.Interceptor$Chain");
console.log("[OkHttp] Monitoring network requests...");
var Request = Java.use("okhttp3.Request");
Request.url.implementation = function() {
var url = this.url();
console.log("[OkHttp] URL: " + url.toString());
return url;
};
} catch(e) {
console.log("[OkHttp] Not found, trying HttpURLConnection");
}
// Hook HttpURLConnection
var URL = Java.use("java.net.URL");
URL.openConnection.overload().implementation = function() {
console.log("[URL] Opening: " + this.toString());
return this.openConnection();
};
});
```
### Adım 7: Extract Decrypted Data and Secrets
```bash
objection --gadget com.target.app explore
android keystore list
android keystore dump
android heap search instances com.target.app.model.User
android heap evaluate <handle> "JSON.stringify(clazz)"
memory search "password" --string
memory search "api_key" --string
```
## Key Concepts
| Term | Definition |
|------|-----------|
| **Dynamic Instrumentation** | Modifying application behavior at runtime by injecting code into the running process |
| **Method Hooking** | Replacing or wrapping function implementations to intercept arguments and return values |
| **Frida Server** | Daemon running on the target device that receives instrumentation commands from the host |
| **Dalvik/ART Runtime** | Android runtime environments; Frida hooks at the ART level for Java/Kotlin methods |
| **Heap Denetle:ion** | Examining live objects in the application's memory heap to extract runtime data |
## Tools & Systems
- **Frida**: Dynamic instrumentation toolkit for injecting JavaScript into native Android processes
- **Objection**: Higher-level Frida wrapper with pre-built Android and iOS security testing commands
- **frida-trace**: Automated method tracing utility for quick reconnaissance of app behavior
- **Drozer**: Android security assessment framework for testing IPC and exported components
- **Android Studio Profiler**: Runtime monitoring for CPU, memory, and network activity
## Common Pitfalls
- **Frida version mismatch**: The Frida server on the device must match the frida-tools version on the host. Version mismatches cause connection failures.
- **Anti-Frida Tespit**: Some apps tespit etmeFrida by checking for the Frida server process, scanning memory for Frida signatures, or monitoring `/proc/self/maps`. Use Frida Gadget injection or custom server builds.
- **Obfuscated class names**: When ProGuard/R8 is applied, class and method names are shortened (e.g., `a.b.c.d()`). Use `android hooking search classes` to discover actual runtime names.
- **Multi-DEX apps**: Large apps split across multiple DEX files may not have all classes loaded at startup. Hook class loaders or use `Java.enumerateLoadedClasses()` after app is fully initialized.
<!--
⚔ Bu skill FETIH AI Agent icin gelistirilmistir — https://github.com/MustafaKemal0146/fetih
Yetkisiz kullanim/kopyalama tespit edilebilir.
hash: faef86fd05c10336
-->
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!