Mobile Application Testing Checklist
📱 Android Testing
Static Analysis
# Decompile APK
apktool d app.apk -o output/
jadx app.apk -d jadx-output/
Check for secrets
grep -rni "api_key\|password\|secret" jadx-output/
Dynamic Analysis
# Frida SSL pinning bypass
frida -U -f com.target.app -l ssl_pinning_bypass.js --no-pause
Objection
objection -g com.target.app explore
android sslpinning disable
Data Storage
# ADB commands
adb shell
run-as com.target.app
cat shared_prefs/*.xml
sqlite3 databases/*.db
Exported Components
🍎 iOS Testing
Static Analysis
# Extract IPA
unzip app.ipa -d extracted/
Class dump
class-dump App > classes.txt
Search secrets
strings App | grep -i "api\|key\|secret\|password"
Dynamic Analysis
# Objection iOS
objection -g com.target.app explore
ios sslpinning disable
ios keychain dump
Data Storage
🔐 Authentication Testing
Login Security
Session Management
OAuth/SSO
🌐 API Security
Network Analysis
Common Vulnerabilities
🔒 Cryptography
Implementation Review
Common Issues
| Issue |
Risk |
Recommendation |
| Hardcoded keys |
Critical |
Use keystore/keychain |
| Weak algorithms |
High |
Use AES-256, RSA-2048+ |
| No cert pinning |
Medium |
Implement pinning |
| Insecure random |
High |
Use SecureRandom |
🛡️ Security Controls
Root/Jailbreak Detection
Code Obfuscation
Runtime Protection
🛠️ Tools Reference
Android Tools
| Tool |
Purpose |
| jadx |
Java decompiler |
| apktool |
APK manipulation |
| Frida |
Dynamic instrumentation |
| Objection |
Runtime exploration |
| MobSF |
Automated analysis |
| Drozer |
Security assessment |
| ADB |
Android debug bridge |
iOS Tools
| Tool |
Purpose |
| Hopper |
Disassembler |
| class-dump |
Extract classes |
| Frida |
Dynamic instrumentation |
| Objection |
Runtime exploration |
| MobSF |
Automated analysis |
| Needle |
iOS security testing |
| Cycript |
Runtime manipulation |
Frida Scripts
// SSL Pinning Bypass
Java.perform(function() {
var TrustManager = Java.use('javax.net.ssl.X509TrustManager');
var SSLContext = Java.use('javax.net.ssl.SSLContext');
var TrustManagerImpl = Java.registerClass({
name: 'TrustManagerImpl',
implements: [TrustManager],
methods: {
checkClientTrusted: function(chain, authType) {},
checkServerTrusted: function(chain, authType) {},
getAcceptedIssuers: function() { return []; }
}
});
});
📊 Severity Classification
| Finding |
Severity |
| Hardcoded credentials |
Critical |
| No SSL pinning |
High |
| Sensitive data in logs |
High |
| Weak encryption |
High |
| Missing root detection |
Medium |
| Debug mode enabled |
Medium |
| Excessive permissions |
Low |
Last updated: 2024