Output Format
Dexray Insight generates comprehensive analysis results in JSON format with detailed metadata and structured findings. This guide explains the output format, data structures, and how to interpret results.
JSON Output Structure
Standard Output Files
Dexray Insight generates timestamped JSON files in the following format:
# Main analysis results
dexray_{apk_name}_{timestamp}.json
# Security assessment results (when -s flag is used)
dexray_{apk_name}_security_{timestamp}.json
Example Output Files:
dexray_MyApp_2024-01-15_10-30-45.json
dexray_MyApp_security_2024-01-15_10-30-45.json
Root JSON Structure
The main analysis result follows this structure:
{
"analysis_metadata": {
"dexray_version": "1.0.0",
"analysis_timestamp": "2024-01-15T10:30:45Z",
"analysis_duration_seconds": 45.2,
"apk_file_path": "/path/to/MyApp.apk",
"apk_file_size_bytes": 12457600,
"configuration_used": {
"parallel_execution_enabled": true,
"security_assessment_enabled": false,
"modules_executed": ["apk_overview", "string_analysis", "permission_analysis"]
}
},
"apk_overview": { /* APK metadata and components */ },
"string_analysis": { /* Extracted strings and patterns */ },
"permission_analysis": { /* Permission analysis results */ },
"signature_detection": { /* Threat intelligence results */ },
"manifest_analysis": { /* AndroidManifest.xml analysis */ },
"library_detection": { /* Third-party library identification */ },
"tracker_analysis": { /* Tracking library detection */ },
"behaviour_analysis": { /* Behavioral analysis results */ },
"native_analysis": { /* Native binary analysis */ },
"security_assessment": { /* OWASP Top 10 security findings */ }
}
Analysis Metadata
Every analysis result includes comprehensive metadata:
{
"analysis_metadata": {
"dexray_version": "1.0.0",
"analysis_timestamp": "2024-01-15T10:30:45Z",
"analysis_duration_seconds": 45.2,
"apk_file_path": "/path/to/MyApp.apv",
"apk_file_size_bytes": 12457600,
"apk_hash_md5": "d41d8cd98f00b204e9800998ecf8427e",
"apk_hash_sha1": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"apk_hash_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"configuration_used": {
"parallel_execution_enabled": true,
"max_workers": 4,
"security_assessment_enabled": false,
"signature_detection_enabled": false,
"modules_executed": [
"apk_overview",
"string_analysis",
"permission_analysis",
"manifest_analysis",
"library_detection",
"tracker_analysis"
],
"execution_times": {
"apk_overview": 2.1,
"string_analysis": 8.4,
"permission_analysis": 0.8,
"manifest_analysis": 1.2,
"library_detection": 15.6,
"tracker_analysis": 3.2
}
},
"analysis_environment": {
"python_version": "3.9.7",
"platform": "Linux",
"architecture": "x86_64",
"androguard_version": "3.4.0"
}
}
}
APK Overview Results
Basic APK information and components:
{
"apk_overview": {
"module_name": "apk_overview",
"status": "SUCCESS",
"execution_time": 2.1,
"package_name": "com.example.myapp",
"version_name": "1.2.3",
"version_code": 10203,
"min_sdk_version": 21,
"target_sdk_version": 30,
"compile_sdk_version": 30,
"app_name": "My Application",
"permissions": [
"android.permission.INTERNET",
"android.permission.ACCESS_NETWORK_STATE",
"android.permission.CAMERA",
"android.permission.WRITE_EXTERNAL_STORAGE"
],
"activities": [
{
"name": "com.example.myapp.MainActivity",
"exported": true,
"intent_filters": ["android.intent.action.MAIN"]
},
{
"name": "com.example.myapp.SettingsActivity",
"exported": false,
"intent_filters": []
}
],
"services": [
{
"name": "com.example.myapp.BackgroundService",
"exported": false,
"permission": null
}
],
"receivers": [
{
"name": "com.example.myapp.BootReceiver",
"exported": true,
"intent_filters": ["android.intent.action.BOOT_COMPLETED"]
}
],
"providers": [],
"native_libraries": [
"libexample.so",
"libcrypto.so",
"libssl.so"
],
"framework": "Native",
"certificates": [
{
"subject": "CN=Example Developer, O=Example Corp",
"issuer": "CN=Example Developer, O=Example Corp",
"serial_number": "1234567890",
"not_before": "2023-01-01T00:00:00Z",
"not_after": "2033-01-01T00:00:00Z",
"signature_algorithm": "SHA256withRSA",
"fingerprint_md5": "ab:cd:ef:12:34:56:78:90:ab:cd:ef:12:34:56:78:90",
"fingerprint_sha1": "12:34:56:78:90:ab:cd:ef:12:34:56:78:90:ab:cd:ef:12:34:56:78",
"fingerprint_sha256": "ab:cd:ef:12:34:56:78:90:ab:cd:ef:12:34:56:78:90:ab:cd:ef:12:34:56:78:90:ab:cd:ef:12:34:56:78:90:ab:cd:ef"
}
]
}
}
String Analysis Results
Extracted strings categorized by pattern type:
{
"string_analysis": {
"module_name": "string_analysis",
"status": "SUCCESS",
"execution_time": 8.4,
"total_strings_analyzed": 2847,
"urls": [
{
"url": "https://api.example.com/v1",
"scheme": "https",
"domain": "api.example.com",
"path": "/v1",
"confidence": 0.95
},
{
"url": "http://analytics.tracking.com/collect",
"scheme": "http",
"domain": "analytics.tracking.com",
"path": "/collect",
"confidence": 0.98
}
],
"ip_addresses": [
{
"ip": "192.168.1.1",
"version": "IPv4",
"type": "private",
"confidence": 1.0
},
{
"ip": "8.8.8.8",
"version": "IPv4",
"type": "public",
"confidence": 1.0
}
],
"email_addresses": [
{
"email": "contact@example.com",
"domain": "example.com",
"confidence": 0.92
}
],
"domains": [
{
"domain": "api.example.com",
"tld": "com",
"subdomain": "api",
"confidence": 0.98
}
],
"base64_strings": [
{
"encoded": "dGVzdCBzdHJpbmc=",
"decoded": "test string",
"entropy": 3.2,
"confidence": 0.89
}
],
"patterns_summary": {
"urls_count": 15,
"ip_addresses_count": 8,
"email_addresses_count": 3,
"domains_count": 12,
"base64_strings_count": 5
}
}
}
Permission Analysis Results
Android permission analysis with categorization:
{
"permission_analysis": {
"module_name": "permission_analysis",
"status": "SUCCESS",
"execution_time": 0.8,
"total_permissions": 12,
"permissions_by_category": {
"dangerous": [
{
"permission": "android.permission.CAMERA",
"protection_level": "dangerous",
"permission_group": "android.permission-group.CAMERA",
"description": "Required to access camera hardware",
"risk_level": "HIGH"
},
{
"permission": "android.permission.ACCESS_FINE_LOCATION",
"protection_level": "dangerous",
"permission_group": "android.permission-group.LOCATION",
"description": "Allows precise location access",
"risk_level": "HIGH"
}
],
"normal": [
{
"permission": "android.permission.INTERNET",
"protection_level": "normal",
"description": "Allows network communication"
}
],
"signature": [],
"system": [],
"custom": [
{
"permission": "com.example.myapp.CUSTOM_PERMISSION",
"protection_level": "unknown",
"description": "Custom application permission"
}
]
},
"risk_assessment": {
"overall_risk": "MEDIUM",
"high_risk_permissions": 2,
"privacy_sensitive_permissions": 3,
"recommendations": [
"Review necessity of camera permission",
"Consider using coarse location instead of fine location",
"Document custom permission usage"
]
}
}
}
Security Assessment Results
OWASP Top 10 security analysis (when enabled with -s
flag):
{
"security_assessment": {
"module_name": "security_assessment",
"status": "SUCCESS",
"execution_time": 18.7,
"overall_risk_level": "HIGH",
"total_vulnerabilities": 8,
"vulnerability_breakdown": {
"CRITICAL": 1,
"HIGH": 3,
"MEDIUM": 3,
"LOW": 1
},
"owasp_top_10_findings": [
{
"category": "M2-Insecure-Data-Storage",
"title": "Hardcoded API Keys Detected",
"severity": "HIGH",
"description": "Multiple API keys found hardcoded in application strings",
"evidence": [
{
"type": "Google API Key",
"value": "AIzaSyDexampleGoogleAPIkey***",
"location": "strings.xml:line 42",
"confidence": 0.98
},
{
"type": "AWS Access Key",
"value": "AKIAIOSFODNN7EXAMPLE***",
"location": "ConfigManager.java:line 156",
"confidence": 0.95
}
],
"recommendations": [
"Remove hardcoded API keys from source code",
"Use secure configuration management",
"Implement runtime key retrieval"
]
}
],
"hardcoded_secrets": [
{
"secret_type": "Google API Key",
"pattern_matched": "google_api_key",
"value": "AIzaSyDexampleGoogleAPIkey123456789",
"severity": "HIGH",
"entropy": 4.8,
"location": {
"file": "strings.xml",
"line": 42,
"context": "<string name=\"api_key\">AIzaSyD...</string>"
},
"remediation": "Store API keys securely using Android Keystore or remote configuration"
},
{
"secret_type": "Hardcoded Password",
"pattern_matched": "password",
"value": "admin_password123",
"severity": "CRITICAL",
"entropy": 3.2,
"location": {
"file": "AuthManager.java",
"line": 156,
"context": "String defaultPass = \"admin_password123\";"
},
"remediation": "Remove hardcoded passwords and implement proper authentication"
}
],
"secret_detection_summary": {
"total_secrets_found": 12,
"by_severity": {
"CRITICAL": 1,
"HIGH": 4,
"MEDIUM": 5,
"LOW": 2
},
"by_type": {
"API Keys": 6,
"Passwords": 3,
"Certificates": 2,
"Tokens": 1
}
}
}
}
Signature Detection Results
Threat intelligence integration results (when enabled with -sig
flag):
{
"signature_detection": {
"module_name": "signature_detection",
"status": "SUCCESS",
"execution_time": 12.3,
"file_hashes": {
"md5": "d41d8cd98f00b204e9800998ecf8427e",
"sha1": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
"virustotal": {
"scan_performed": true,
"scan_date": "2024-01-15T10:35:00Z",
"total_engines": 70,
"positive_detections": 3,
"detection_ratio": "3/70",
"permalink": "https://virustotal.com/analysis/abcd1234",
"detected_threats": [
{
"engine": "Avira",
"result": "Android.Trojan.Banker",
"version": "8.3.3.14",
"update": "20240115"
},
{
"engine": "Kaspersky",
"result": "Trojan.AndroidOS.Boogr.gsh",
"version": "21.0.1.45",
"update": "20240115"
}
],
"clean_engines": 67
},
"koodous": {
"scan_performed": true,
"detected": false,
"rating": 2,
"analysis_url": "https://koodous.com/analysis/example123",
"community_votes": {
"positive": 1,
"negative": 8
}
},
"overall_threat_assessment": {
"risk_level": "MEDIUM",
"is_likely_malware": false,
"confidence": 0.15,
"recommendations": [
"Low detection rate suggests possible false positives",
"Manual analysis recommended for suspicious behaviors",
"Monitor for behavioral indicators"
]
}
}
}
Library Detection Results
Third-party library identification:
{
"library_detection": {
"module_name": "library_detection",
"status": "SUCCESS",
"execution_time": 15.6,
"total_libraries_detected": 8,
"detection_methods_used": ["heuristic", "similarity"],
"libraries": [
{
"name": "OkHttp",
"category": "networking",
"version": "4.9.3",
"confidence": 0.96,
"detection_method": "heuristic_package_analysis",
"evidence": {
"packages": ["okhttp3", "okio"],
"classes": ["OkHttpClient", "Request", "Response"],
"methods": ["newCall", "execute", "enqueue"]
},
"description": "HTTP client library for Android and Java",
"website": "https://square.github.io/okhttp/",
"license": "Apache-2.0"
},
{
"name": "Gson",
"category": "serialization",
"version": "2.8.9",
"confidence": 0.92,
"detection_method": "heuristic_class_analysis",
"evidence": {
"packages": ["com.google.gson"],
"classes": ["Gson", "JsonElement", "JsonParser"]
},
"description": "JSON serialization library for Java",
"website": "https://github.com/google/gson"
}
],
"categories_summary": {
"networking": 2,
"serialization": 1,
"image_processing": 1,
"analytics": 3,
"ui": 1
},
"confidence_distribution": {
"high_confidence": 5,
"medium_confidence": 2,
"low_confidence": 1
}
}
}
Native Analysis Results
Native binary analysis results (when enabled and available):
{
"native_analysis": {
"module_name": "native_analysis",
"status": "SUCCESS",
"execution_time": 8.9,
"radare2_available": true,
"analyzed_binaries": [
{
"file_path": "lib/arm64-v8a/libexample.so",
"relative_path": "lib/arm64-v8a/libexample.so",
"architecture": "arm64-v8a",
"file_size": 245760,
"file_name": "libexample.so"
},
{
"file_path": "lib/arm64-v8a/libcrypto.so",
"relative_path": "lib/arm64-v8a/libcrypto.so",
"architecture": "arm64-v8a",
"file_size": 1843200,
"file_name": "libcrypto.so"
}
],
"total_strings_extracted": 127,
"strings_by_source": {
"lib/arm64-v8a/libexample.so": [
{
"content": "https://api.native-service.com",
"source_type": "native_binary",
"extraction_method": "r2_iz_data_sections",
"offset": 8192,
"confidence": 0.9
},
{
"content": "debug_mode_enabled",
"source_type": "native_binary",
"extraction_method": "r2_izz_all_sections",
"offset": 12288,
"confidence": 0.8
}
]
},
"architectures_analyzed": ["arm64-v8a"],
"binary_analysis_summary": {
"total_binaries": 2,
"successful_analyses": 2,
"failed_analyses": 0,
"strings_per_binary": {
"libexample.so": 45,
"libcrypto.so": 82
}
}
}
}
Output Formatting Options
Console Output Modes
Default Mode (Analyst Summary):
📱 APK Analysis Report
Package: com.example.myapp
Version: 1.2.3 (10203)
Framework: Native
🛡️ Security Assessment: MEDIUM RISK
Vulnerabilities Found: 3
🔑 Hardcoded Secrets: 2
📊 Analysis Summary:
• Permissions: 12 (3 dangerous)
• Components: 15 activities, 2 services
• Libraries: 8 detected
• Native Libraries: 3
⏱️ Analysis completed in 45.2 seconds
Results saved to: dexray_MyApp_2024-01-15_10-30-45.json
Verbose Mode (-v
flag):
Shows complete JSON output to terminal in addition to file output.
Debug Mode (-d DEBUG
flag):
Includes detailed execution logs and timing information for each module.
File Output Configuration
Configure output location and format in dexray.yaml
:
output:
format: "json" # Output format
pretty_print: true # Human-readable JSON
include_timestamps: true # Include analysis timestamps
output_directory: "./results" # Output directory
filename_template: "dexray_{apk_name}_{timestamp}.json"
Template Variables:
{apk_name}
- APK filename without extension{timestamp}
- Analysis timestamp (YYYY-MM-DD_HH-MM-SS){package_name}
- Application package name (if available){version}
- Application version (if available)
Error Handling in Output
Failed Module Results
When modules fail, their results include error information:
{
"module_name": "signature_detection",
"status": "FAILURE",
"execution_time": 2.3,
"error_message": "API key not configured",
"error_details": {
"error_type": "ConfigurationError",
"provider": "virustotal",
"suggested_action": "Configure API key in dexray.yaml"
}
}
Timeout Results
Modules that exceed timeout limits:
{
"module_name": "library_detection",
"status": "TIMEOUT",
"execution_time": 300.0,
"error_message": "Module execution timed out after 300 seconds",
"partial_results": {
"libraries_detected_before_timeout": 3,
"analysis_completed_percentage": 65
}
}
Skipped Module Results
Modules that were skipped due to missing dependencies or configuration:
{
"module_name": "native_analysis",
"status": "SKIPPED",
"execution_time": 0.0,
"error_message": "radare2 not available",
"skip_reason": "missing_dependency",
"requirements_not_met": ["radare2", "r2pipe"]
}
Working with Output Data
Python Integration
import json
from pathlib import Path
# Load analysis results
def load_analysis_results(result_file):
with open(result_file) as f:
return json.load(f)
# Extract specific information
results = load_analysis_results("dexray_MyApp_2024-01-15_10-30-45.json")
# Get basic APK info
package_name = results["apk_overview"]["package_name"]
permissions = results["apk_overview"]["permissions"]
# Get security findings
if results.get("security_assessment"):
risk_level = results["security_assessment"]["overall_risk_level"]
secrets = results["security_assessment"]["hardcoded_secrets"]
# Get string analysis
if results.get("string_analysis"):
urls = results["string_analysis"]["urls"]
ip_addresses = results["string_analysis"]["ip_addresses"]
Shell Scripting
#!/bin/bash
# Extract key information using jq
RESULT_FILE="dexray_MyApp_2024-01-15_10-30-45.json"
# Get package name
PACKAGE=$(jq -r '.apk_overview.package_name' "$RESULT_FILE")
# Count dangerous permissions
DANGEROUS_PERMS=$(jq '[.permission_analysis.permissions_by_category.dangerous[]] | length' "$RESULT_FILE")
# Check for hardcoded secrets
SECRET_COUNT=$(jq '[.security_assessment.hardcoded_secrets[]?] | length' "$RESULT_FILE")
echo "Package: $PACKAGE"
echo "Dangerous Permissions: $DANGEROUS_PERMS"
echo "Hardcoded Secrets: $SECRET_COUNT"
Database Integration
import json
import sqlite3
from datetime import datetime
def store_analysis_results(db_path, result_file):
"""Store analysis results in SQLite database"""
with open(result_file) as f:
results = json.load(f)
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Create table if not exists
cursor.execute('''
CREATE TABLE IF NOT EXISTS analysis_results (
id INTEGER PRIMARY KEY,
package_name TEXT,
version_name TEXT,
analysis_date TEXT,
risk_level TEXT,
vulnerability_count INTEGER,
permissions_count INTEGER,
libraries_count INTEGER,
results_json TEXT
)
''')
# Insert results
apk_overview = results.get('apk_overview', {})
security = results.get('security_assessment', {})
cursor.execute('''
INSERT INTO analysis_results (
package_name, version_name, analysis_date,
risk_level, vulnerability_count, permissions_count,
libraries_count, results_json
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
''', (
apk_overview.get('package_name'),
apk_overview.get('version_name'),
results['analysis_metadata']['analysis_timestamp'],
security.get('overall_risk_level'),
security.get('total_vulnerabilities', 0),
len(apk_overview.get('permissions', [])),
results.get('library_detection', {}).get('total_libraries_detected', 0),
json.dumps(results)
))
conn.commit()
conn.close()
The JSON output format provides comprehensive, structured data that enables automated processing, integration with security tools, and detailed analysis reporting.