Full Code of Andy10101/ApkDetecter for AI

master 70db31d5ccf6 cached
258 files
8.6 MB
2.3M tokens
4750 symbols
1 requests
Download .txt
Showing preview only (9,095K chars total). Download the full file or copy to clipboard to get everything.
Repository: Andy10101/ApkDetecter
Branch: master
Commit: 70db31d5ccf6
Files: 258
Total size: 8.6 MB

Directory structure:
gitextract_u287gwvh/

├── .gitignore
├── AnalysisCSN/
│   ├── CSN.py
│   └── __init__.py
├── AnalysisDEX/
│   ├── InitDEX.py
│   └── __init__.py
├── AnalysisXML/
│   ├── AXML.py
│   └── __init__.py
├── ApkDetecter.py
├── ApkDetecter.pyw
├── ApkDetecter.spec
├── CheckProtect.py
├── GUI/
│   ├── AppInfoWidget.py
│   ├── MainForm.py
│   ├── StyleSheet.py
│   ├── __init__.py
│   ├── apkdetecter_ui.ui
│   ├── apkinfo_ui.ui
│   └── dexinfor_ui.ui
├── LICENSE.txt
├── README.md
├── Resources/
│   ├── AppIcon.icns
│   └── signatures.json
├── __init__.py
├── build_mac.sh
├── build_windows.bat
├── core/
│   ├── ApkAnalyzer.py
│   ├── DeepScanner.py
│   ├── IpaAnalyzer.py
│   └── __init__.py
├── libs/
│   ├── androguard/
│   │   ├── __init__.py
│   │   ├── cli/
│   │   │   ├── __init__.py
│   │   │   ├── cli.py
│   │   │   └── main.py
│   │   ├── core/
│   │   │   ├── __init__.py
│   │   │   ├── analysis/
│   │   │   │   ├── __init__.py
│   │   │   │   └── analysis.py
│   │   │   ├── androconf.py
│   │   │   ├── api_specific_resources/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── aosp_permissions/
│   │   │   │   │   ├── permissions_10.json
│   │   │   │   │   ├── permissions_13.json
│   │   │   │   │   ├── permissions_14.json
│   │   │   │   │   ├── permissions_15.json
│   │   │   │   │   ├── permissions_16.json
│   │   │   │   │   ├── permissions_17.json
│   │   │   │   │   ├── permissions_18.json
│   │   │   │   │   ├── permissions_19.json
│   │   │   │   │   ├── permissions_21.json
│   │   │   │   │   ├── permissions_22.json
│   │   │   │   │   ├── permissions_23.json
│   │   │   │   │   ├── permissions_24.json
│   │   │   │   │   ├── permissions_25.json
│   │   │   │   │   ├── permissions_26.json
│   │   │   │   │   ├── permissions_27.json
│   │   │   │   │   ├── permissions_28.json
│   │   │   │   │   ├── permissions_29.json
│   │   │   │   │   ├── permissions_30.json
│   │   │   │   │   ├── permissions_31.json
│   │   │   │   │   ├── permissions_32.json
│   │   │   │   │   ├── permissions_33.json
│   │   │   │   │   ├── permissions_34.json
│   │   │   │   │   ├── permissions_4.json
│   │   │   │   │   ├── permissions_5.json
│   │   │   │   │   ├── permissions_6.json
│   │   │   │   │   ├── permissions_7.json
│   │   │   │   │   ├── permissions_8.json
│   │   │   │   │   └── permissions_9.json
│   │   │   │   └── api_permission_mappings/
│   │   │   │       ├── permissions_16.json
│   │   │   │       ├── permissions_17.json
│   │   │   │       ├── permissions_18.json
│   │   │   │       ├── permissions_19.json
│   │   │   │       ├── permissions_21.json
│   │   │   │       ├── permissions_22.json
│   │   │   │       ├── permissions_23.json
│   │   │   │       ├── permissions_24.json
│   │   │   │       └── permissions_25.json
│   │   │   ├── apk/
│   │   │   │   └── __init__.py
│   │   │   ├── axml/
│   │   │   │   ├── __init__.py
│   │   │   │   └── types.py
│   │   │   ├── bytecode.py
│   │   │   ├── dex/
│   │   │   │   ├── __init__.py
│   │   │   │   └── dex_types.py
│   │   │   ├── mutf8/
│   │   │   │   └── __init__.py
│   │   │   └── resources/
│   │   │       ├── __init__.py
│   │   │       ├── public.json
│   │   │       ├── public.py
│   │   │       └── public.xml
│   │   ├── decompiler/
│   │   │   ├── __init__.py
│   │   │   ├── basic_blocks.py
│   │   │   ├── control_flow.py
│   │   │   ├── dast.py
│   │   │   ├── dataflow.py
│   │   │   ├── decompile.py
│   │   │   ├── decompiler.py
│   │   │   ├── graph.py
│   │   │   ├── instruction.py
│   │   │   ├── node.py
│   │   │   ├── opcode_ins.py
│   │   │   ├── util.py
│   │   │   └── writer.py
│   │   ├── misc.py
│   │   ├── pentest/
│   │   │   ├── __init__.py
│   │   │   ├── adb.py
│   │   │   ├── internal/
│   │   │   │   └── utils.js
│   │   │   └── modules/
│   │   │       ├── binder/
│   │   │       │   └── intercept_binder.js
│   │   │       ├── code_loading/
│   │   │       │   ├── dex.js
│   │   │       │   ├── dyndex.js
│   │   │       │   ├── load_class.js
│   │   │       │   └── native.js
│   │   │       ├── compression/
│   │   │       │   └── gzip.js
│   │   │       ├── encoding/
│   │   │       │   └── base64.js
│   │   │       ├── encryption/
│   │   │       │   ├── cipher.js
│   │   │       │   └── keystore.js
│   │   │       ├── file_system/
│   │   │       │   └── shared_preferences.js
│   │   │       ├── framework/
│   │   │       │   ├── cordova.js
│   │   │       │   └── flutter/
│   │   │       │       ├── disable_cert_chain_bypass_v7a.js
│   │   │       │       ├── disable_cert_chain_bypass_v8a.js
│   │   │       │       └── disable_cert_chain_bypass_x86_64.js
│   │   │       ├── helpers/
│   │   │       │   ├── antidebug/
│   │   │       │   │   ├── binaries.js
│   │   │       │   │   ├── debug.js
│   │   │       │   │   ├── environment.js
│   │   │       │   │   ├── package.js
│   │   │       │   │   └── process.js
│   │   │       │   ├── dump/
│   │   │       │   │   └── dexdump.js
│   │   │       │   └── pinning/
│   │   │       │       └── ssl.js
│   │   │       ├── http_communications/
│   │   │       │   └── uri.js
│   │   │       ├── intents/
│   │   │       │   ├── intents.js
│   │   │       │   ├── intents_creation.js
│   │   │       │   └── pending_intents.js
│   │   │       ├── ipc/
│   │   │       │   └── ipc.js
│   │   │       ├── preferences/
│   │   │       │   └── preferences.js
│   │   │       ├── sockets/
│   │   │       │   └── sockets.js
│   │   │       └── webviews/
│   │   │           └── webviews.js
│   │   ├── session.py
│   │   ├── ui/
│   │   │   ├── __init__.py
│   │   │   ├── data_types.py
│   │   │   ├── filter.py
│   │   │   ├── selection.py
│   │   │   ├── table.py
│   │   │   ├── util.py
│   │   │   └── widget/
│   │   │       ├── __init__.py
│   │   │       ├── details.py
│   │   │       ├── filters.py
│   │   │       ├── frame.py
│   │   │       ├── help.py
│   │   │       ├── toolbar.py
│   │   │       └── transactions.py
│   │   └── util.py
│   ├── apkInspector/
│   │   ├── __init__.py
│   │   ├── axml.py
│   │   ├── extract.py
│   │   ├── headers.py
│   │   ├── helpers.py
│   │   └── indicators.py
│   ├── apkInspectorCLI/
│   │   ├── __init__.py
│   │   └── main.py
│   ├── apkinspector-1.3.6.dist-info/
│   │   ├── METADATA
│   │   ├── RECORD
│   │   ├── WHEEL
│   │   ├── entry_points.txt
│   │   └── licenses/
│   │       └── LICENSE
│   ├── asn1crypto/
│   │   ├── __init__.py
│   │   ├── _errors.py
│   │   ├── _inet.py
│   │   ├── _int.py
│   │   ├── _iri.py
│   │   ├── _ordereddict.py
│   │   ├── _teletex_codec.py
│   │   ├── _types.py
│   │   ├── algos.py
│   │   ├── cms.py
│   │   ├── core.py
│   │   ├── crl.py
│   │   ├── csr.py
│   │   ├── keys.py
│   │   ├── ocsp.py
│   │   ├── parser.py
│   │   ├── pdf.py
│   │   ├── pem.py
│   │   ├── pkcs12.py
│   │   ├── tsp.py
│   │   ├── util.py
│   │   ├── version.py
│   │   └── x509.py
│   ├── asn1crypto-1.5.1.dist-info/
│   │   ├── LICENSE
│   │   ├── METADATA
│   │   ├── RECORD
│   │   ├── WHEEL
│   │   └── top_level.txt
│   ├── click/
│   │   ├── __init__.py
│   │   ├── _compat.py
│   │   ├── _termui_impl.py
│   │   ├── _textwrap.py
│   │   ├── _winconsole.py
│   │   ├── core.py
│   │   ├── decorators.py
│   │   ├── exceptions.py
│   │   ├── formatting.py
│   │   ├── globals.py
│   │   ├── parser.py
│   │   ├── py.typed
│   │   ├── shell_completion.py
│   │   ├── termui.py
│   │   ├── testing.py
│   │   ├── types.py
│   │   └── utils.py
│   ├── click-8.1.8.dist-info/
│   │   ├── LICENSE.txt
│   │   ├── METADATA
│   │   ├── RECORD
│   │   └── WHEEL
│   ├── colorama/
│   │   ├── __init__.py
│   │   ├── ansi.py
│   │   ├── ansitowin32.py
│   │   ├── initialise.py
│   │   ├── tests/
│   │   │   ├── __init__.py
│   │   │   ├── ansi_test.py
│   │   │   ├── ansitowin32_test.py
│   │   │   ├── initialise_test.py
│   │   │   ├── isatty_test.py
│   │   │   ├── utils.py
│   │   │   └── winterm_test.py
│   │   ├── win32.py
│   │   └── winterm.py
│   ├── colorama-0.4.6.dist-info/
│   │   ├── METADATA
│   │   ├── RECORD
│   │   ├── WHEEL
│   │   └── licenses/
│   │       └── LICENSE.txt
│   ├── loguru/
│   │   ├── __init__.py
│   │   ├── __init__.pyi
│   │   ├── _asyncio_loop.py
│   │   ├── _better_exceptions.py
│   │   ├── _colorama.py
│   │   ├── _colorizer.py
│   │   ├── _contextvars.py
│   │   ├── _ctime_functions.py
│   │   ├── _datetime.py
│   │   ├── _defaults.py
│   │   ├── _error_interceptor.py
│   │   ├── _file_sink.py
│   │   ├── _filters.py
│   │   ├── _get_frame.py
│   │   ├── _handler.py
│   │   ├── _locks_machinery.py
│   │   ├── _logger.py
│   │   ├── _recattrs.py
│   │   ├── _simple_sinks.py
│   │   ├── _string_parsers.py
│   │   └── py.typed
│   ├── loguru-0.7.3.dist-info/
│   │   ├── METADATA
│   │   ├── RECORD
│   │   └── WHEEL
│   ├── mutf8/
│   │   ├── __init__.py
│   │   └── mutf8.py
│   └── mutf8-1.0.6.dist-info/
│       ├── LICENCE
│       ├── METADATA
│       ├── RECORD
│       ├── WHEEL
│       └── top_level.txt
└── requirements.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Python
__pycache__/
*.py[cod]
*$py.class

# Distribution / Packaging
build/
dist/
*.egg-info/
.eggs/

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/

# macOS
.DS_Store

# IDEs
.idea/
.vscode/
*.swp


================================================
FILE: AnalysisCSN/CSN.py
================================================
# -*- coding: utf-8 -*-
__author__ = 'Andy'

class CSN:
    def __init__(self, apk_obj):
        self.apk = apk_obj
        self.certs = []
        try:
            # androguard 3.3.5+ returns x509 objects
            self.certs = list(self.apk.get_certificates())
        except Exception as e:
            print(f"Error getting certificates: {e}")
        
        self.cert = self.certs[0] if self.certs else None

    def get_size(self):
        try:
            for f in self.apk.get_files():
                if f.endswith('.RSA') or f.endswith('.DSA') or f.endswith('.EC'):
                     # get_file returns bytes
                     return str(len(self.apk.get_file(f)))
        except:
            pass
        return "0"

    def getCertificateSN(self):
        if not self.cert: return ""
        try:
            return format(self.cert.serial_number, 'x').lower()
        except:
            return ""

    def getCertificateIDN(self):
        if not self.cert: return ""
        try:
            # Use rfc4514_string for standard string representation
            # It returns comma separated values like CN=Name,C=US
            return self.cert.issuer.rfc4514_string()
        except:
            return str(self.cert.issuer)

    def getCertificateSDN(self):
        if not self.cert: return ""
        try:
            return self.cert.subject.rfc4514_string()
        except:
            return str(self.cert.subject)


================================================
FILE: AnalysisCSN/__init__.py
================================================
__author__ = 'Andy'


================================================
FILE: AnalysisDEX/InitDEX.py
================================================
# -*- coding: utf-8 -*-
__author__ = 'Andy'

from androguard.core.dex import DEX

class InitDEX:
    def __init__(self, apk_obj):
        self.apk = apk_obj
        self.dexheader = {}

    def getDexInfo(self):
        self.dexheader = {}
        try:
            # Get the first dex file
            # androguard returns bytes, so we need to wrap it in DEX object
            dex_files = list(self.apk.get_all_dex())
            if not dex_files:
                return {}
            
            d = DEX(dex_files[0])
            
            # Helper to format values
            def fmt(val):
                if val is None:
                    return ""
                if isinstance(val, int):
                    return "%X" % val
                if isinstance(val, bytes):
                    return val.hex().upper()
                return str(val)

            h = d.header
            
            # Use getattr to be safe with different androguard versions, or assume standard fields
            self.dexheader["header_magic"] = fmt(getattr(h, "magic", b""))
            self.dexheader["header_checksum"] = fmt(getattr(h, "checksum", 0))
            self.dexheader["header_signature"] = fmt(getattr(h, "signature", b""))
            self.dexheader["header_fileSize"] = fmt(getattr(h, "file_size", 0))
            self.dexheader["header_headerSize"] = fmt(getattr(h, "header_size", 0))
            self.dexheader["header_endianTag"] = fmt(getattr(h, "endian_tag", 0))
            self.dexheader["header_linkSize"] = fmt(getattr(h, "link_size", 0))
            self.dexheader["header_linkOff"] = fmt(getattr(h, "link_off", 0))
            self.dexheader["header_mapOff"] = fmt(getattr(h, "map_off", 0))
            self.dexheader["header_stringIdsSize"] = fmt(getattr(h, "string_ids_size", 0))
            self.dexheader["header_stringIdsOff"] = fmt(getattr(h, "string_ids_off", 0))
            self.dexheader["header_typeIdsSize"] = fmt(getattr(h, "type_ids_size", 0))
            self.dexheader["header_typeIdsOff"] = fmt(getattr(h, "type_ids_off", 0))
            self.dexheader["header_protoIdsSize"] = fmt(getattr(h, "proto_ids_size", 0))
            self.dexheader["header_protoIdsOff"] = fmt(getattr(h, "proto_ids_off", 0))
            self.dexheader["header_fieldIdsSize"] = fmt(getattr(h, "field_ids_size", 0))
            self.dexheader["header_fieldIdsOff"] = fmt(getattr(h, "field_ids_off", 0))
            self.dexheader["header_methodIdsSize"] = fmt(getattr(h, "method_ids_size", 0))
            self.dexheader["header_methodIdsOff"] = fmt(getattr(h, "method_ids_off", 0))
            self.dexheader["header_classDefsSize"] = fmt(getattr(h, "class_defs_size", 0))
            self.dexheader["header_classDefsOff"] = fmt(getattr(h, "class_defs_off", 0))
            self.dexheader["header_dataSize"] = fmt(getattr(h, "data_size", 0))
            self.dexheader["header_dataOff"] = fmt(getattr(h, "data_off", 0))

        except Exception as e:
            print(f"Error getting DEX info: {e}")
            import traceback
            traceback.print_exc()

        return self.dexheader


================================================
FILE: AnalysisDEX/__init__.py
================================================
__author__ = 'Andy'


================================================
FILE: AnalysisXML/AXML.py
================================================
# -*- coding: utf-8 -*-
__author__ = 'Andy'

MIN_SDK_VERSION = {
    "1": "Android 1.0",
    "2": "Android 1.1",
    "3": "Android 1.5",
    "4": "Android 1.6",
    "5": "Android 2.0",
    "6": "Android 2.0.1",
    "7": "Android 2.1-update1",
    "8": "Android 2.2",
    "9": "Android 2.3 - 2.3.2",
    "10": "Android 2.3.3 - 2.3.4",
    "11": "Android 3.0",
    "12": "Android 3.1",
    "13": "Android 3.2",
    "14": "Android 4.0.0 - 4.0.2",
    "15": "Android 4.0.3 - 4.0.4",
    "16": "Android 4.1 - 4.1.1",
    "17": "Android 4.2 - 4.2.2",
    "18": "Android 4.3",
    "19": "Android 4.4",
    "20": "Android 4.4W",
    "21": "Android 5.0",
    "22": "Android 5.1",
    "23": "Android 6.0",
    "24": "Android 7.0",
    "25": "Android 7.1",
    "26": "Android 8.0",
    "27": "Android 8.1",
    "28": "Android 9",
    "29": "Android 10",
    "30": "Android 11",
    "31": "Android 12",
    "32": "Android 12L",
    "33": "Android 13",
    "34": "Android 14",
}

RISK_PERMISSION = {
    "android.permission.SEND_SMS": "可无提示直接发送短信",
    "android.permission.RECEIVE_SMS": "可监控短信接收",
    "android.permission.CALL_PRIVILEGED": "可无提示直接拨打电话",
    "android.permission.INTERNET": "具有完全的互联网访问权限",
    "android.permission.READ_CONTACTS": "可读取联系人信息",
    "android.permission.WRITE_CONTACTS": "可修改联系人信息",
    "android.permission.CHANGE_WIFI_STATE": "可修改手机当前WIFI设置",
    "android.permission.WRITE_EXTERNAL_STORAGE": "可对存储卡进行读写操作",
    "com.android.launcher.permission.INSTALL_SHORTCUT": "可创建程序快捷方式",
    "android.permission.READ_PHONE_STATE": "可读取手机状态和身份",
    "android.permission.INSTALL_PACKAGES": "可安装其它程序",
    "android.permission.READ_SMS": "读取短信或彩信",
    "android.permission.WRITE_SMS": "编辑短信或彩信",
    "android.permission.RESTART_PACKAGES": "重启应用程序",
    "android.permission.CALL_PHONE": "直接拨打电话",
    "android.permission.ACCESS_COARSE_LOCATION": "可获取当前粗略位置信息",
    "android.permission.ACCESS_FINE_LOCATION": "可获取当前精确位置信息",
}

class AXML:
    def __init__(self, apk_obj):
        self.apk = apk_obj

    def get_package(self):
        return self.apk.get_package()

    def get_androidversion_name(self):
        return self.apk.get_androidversion_name()

    def get_androidversion_code(self):
        return self.apk.get_androidversion_code()

    def getMinSdkVersion(self):
        min_sdk = self.apk.get_min_sdk_version()
        if min_sdk:
            return MIN_SDK_VERSION.get(str(min_sdk), str(min_sdk))
        return "None"

    def getRiskPermission(self):
        permissions = self.apk.get_permissions()
        risk_perms = []
        if not permissions:
            return ["该程序未发现含有权限"]
        
        for p in permissions:
            if p in RISK_PERMISSION:
                desc = RISK_PERMISSION[p]
                if desc not in risk_perms:
                    risk_perms.append(desc)
        
        if risk_perms:
            return risk_perms
        else:
            return ["该程序未发现含有风险权限"]


================================================
FILE: AnalysisXML/__init__.py
================================================
__author__ = 'Andy'


================================================
FILE: ApkDetecter.py
================================================
# -*- coding: utf-8 -*-
__author__ = 'Andy'

import sys
import os
import platform
import ctypes

# === FIX FOR PYINSTALLER NOCONSOLE ===
# Some libraries (like androguard) try to write to stdout/stderr even if it's None.
# We redirect them to a dummy writer if they are None.
class NullWriter:
    def write(self, text):
        pass
    def flush(self):
        pass
    def isatty(self):
        return False

if sys.stdout is None:
    sys.stdout = NullWriter()
if sys.stderr is None:
    sys.stderr = NullWriter()
# =====================================

# Add libs to path
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'libs'))

from PyQt5 import QtWidgets, QtGui, QtCore
# from GUI import StyleSheet  <-- REMOVED
from GUI.MainForm import MainForm

# === INLINED STYLESHEET TO AVOID IMPORT ERRORS ===
QSS_COMMON = """
/* General Window */
QMainWindow, QDialog, QWidget {
    background-color: #2b2b2b;
    color: #e0e0e0;
    font-family: "Segoe UI", "Arial", sans-serif;
}

/* GroupBox */
QGroupBox {
    border: 1px solid #3d3d3d;
    border-radius: 6px;
    margin-top: 24px;
    font-weight: bold;
    color: #e0e0e0;
}

QGroupBox::title {
    subcontrol-origin: margin;
    subcontrol-position: top left;
    left: 10px;
    padding: 0 5px;
    color: #4da6ff; /* Blue accent */
}

/* Labels */
QLabel {
    color: #cccccc;
}

/* TextBrowser / TextEdit / LineEdit */
QTextBrowser, QTextEdit, QLineEdit {
    background-color: #363636;
    border: 1px solid #3d3d3d;
    border-radius: 4px;
    color: #ffffff;
    selection-background-color: #4da6ff;
}

QTextBrowser:disabled, QTextEdit:disabled {
    background-color: #2f2f2f;
    color: #909090;
    border: 1px solid #333333;
}

/* Push Buttons */
QPushButton {
    background-color: #3a3a3a;
    border: 1px solid #4a4a4a;
    border-radius: 4px;
    color: #e0e0e0;
    padding: 4px 12px;
    min-height: 20px;
}

QPushButton:hover {
    background-color: #4a4a4a;
    border: 1px solid #5a5a5a;
}

QPushButton:pressed {
    background-color: #2a2a2a;
}

QPushButton#file_open {
    background-color: #007acc;
    color: white;
    border: 1px solid #005c99;
}

QPushButton#file_open:hover {
    background-color: #008ae6;
}

QPushButton#file_open:pressed {
    background-color: #005c99;
}

/* Progress Bar */
QProgressBar {
    border: 1px solid #3d3d3d;
    border-radius: 4px;
    background-color: #363636;
    text-align: center;
    color: #e0e0e0;
}

QProgressBar::chunk {
    background-color: #007acc;
    border-radius: 3px;
}

/* ScrollBars */
QScrollBar:vertical {
    border: none;
    background: #2b2b2b;
    width: 10px;
    margin: 0px 0px 0px 0px;
}

QScrollBar::handle:vertical {
    background: #505050;
    min-height: 20px;
    border-radius: 5px;
}

QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {
    height: 0px;
}

QScrollBar:horizontal {
    border: none;
    background: #2b2b2b;
    height: 10px;
    margin: 0px 0px 0px 0px;
}

QScrollBar::handle:horizontal {
    background: #505050;
    min-width: 20px;
    border-radius: 5px;
}

QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal {
    width: 0px;
}
"""

QSS_WIN_OVERRIDES = """
/* Windows Specific Overrides for High DPI / Readability */
QMainWindow, QDialog, QWidget {
    font-size: 24px;
}

QGroupBox {
    font-size: 26px;
    margin-top: 36px;
}

QGroupBox::title {
    top: -24px;
    left: 10px;
}

QLabel {
    font-size: 24px;
}

QTextBrowser, QTextEdit, QLineEdit {
    font-size: 24px;
    padding: 10px;
}

QPushButton {
    padding: 8px 20px;
    min-height: 32px;
}

QScrollBar:vertical {
    width: 20px;
}

QScrollBar:horizontal {
    height: 20px;
}
"""

QSS_MAC_OVERRIDES = """
/* macOS Specific Overrides */
QLabel {
    font-size: 12px;
}
/* Other defaults are usually fine on Mac */
"""

if platform.system() == "Windows":
    GLOBAL_QSS = QSS_COMMON + QSS_WIN_OVERRIDES
else:
    # Default to Mac/Linux style
    GLOBAL_QSS = QSS_COMMON + QSS_MAC_OVERRIDES
# ===============================================

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

if __name__ == "__main__":
    # Fix for Windows Taskbar Icon
    if platform.system() == 'Windows':
        try:
            # Set AppUserModelID to ensure the taskbar icon is displayed correctly
            myappid = 'mycompany.myproduct.subproduct.version' # Arbitrary string
            ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
        except Exception as e:
            pass

    app = QtWidgets.QApplication(sys.argv)
    
    # Set Style
    app.setStyle("Fusion")
    app.setStyleSheet(GLOBAL_QSS)

    # Set Application Icon (Global)
    logo_path = resource_path(os.path.join('Resources', 'logo.png'))
    if os.path.exists(logo_path):
        # Windows: Load icon directly (Best for Taskbar/Titlebar)
        if platform.system() == 'Windows':
            # Windows: Load the large icon directly. 
            # We avoid adding small sizes manually to prevent Windows from picking a low-res version.
            app.setWindowIcon(QtGui.QIcon(logo_path))
        else:
            # macOS/Linux: Use padding/scaling logic (Original logic)
            original_pixmap = QtGui.QPixmap(logo_path)
            
            if not original_pixmap.isNull():
                # Create a square canvas (transparent)
                size = 1024
                padded_pixmap = QtGui.QPixmap(size, size)
                padded_pixmap.fill(QtCore.Qt.transparent)
                
                # Calculate padding (scale to 80% of the canvas)
                scale_factor = 0.8
                new_w = int(size * scale_factor)
                new_h = int(size * scale_factor)
                x = (size - new_w) // 2
                y = (size - new_h) // 2
                
                painter = QtGui.QPainter(padded_pixmap)
                painter.setRenderHint(QtGui.QPainter.SmoothPixmapTransform)
                painter.setRenderHint(QtGui.QPainter.Antialiasing)
                
                painter.drawPixmap(x, y, new_w, new_h, original_pixmap)
                painter.end()
                
                app.setWindowIcon(QtGui.QIcon(padded_pixmap))
        
        # For macOS Dock icon (sometimes requires this specific call or packaging)
        try:
            # This is a workaround for Python not being a bundled app on macOS
            pass 
        except:
            pass
    
    # Main Window
    myapp = MainForm()
    myapp.show()
    
    sys.exit(app.exec_())


================================================
FILE: ApkDetecter.pyw
================================================
# -*- coding: utf-8 -*-
__author__ = 'Andy'

import sys
import os

# Add libs to path
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'libs'))

from PyQt5 import QtWidgets
import StyleSheet
from GUI.MainForm import MainForm

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    
    # Set Style
    app.setStyle("Fusion")
    app.setStyleSheet(StyleSheet.QSS)
    
    # Main Window
    myapp = MainForm()
    myapp.show()
    
    sys.exit(app.exec_())


================================================
FILE: ApkDetecter.spec
================================================
# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

import os
import sys

# Ensure libs path is included
sys.path.insert(0, os.path.abspath('libs'))

a = Analysis(
    ['ApkDetecter.py'],
    pathex=['.'],
    binaries=[],
    datas=[
        ('Resources', 'Resources'),
        ('libs', 'libs'),
        ('Core', 'Core'),
        ('GUI', 'GUI'),
        ('AnalysisCSN', 'AnalysisCSN'),
        ('AnalysisDEX', 'AnalysisDEX'),
        ('AnalysisXML', 'AnalysisXML'),
    ],
    hiddenimports=[
        'PyQt5', 
        'cryptography', 
        'asn1crypto', 
        'androguard', 
        'click', 
        'colorama', 
        'loguru',
        'xml.etree.ElementTree',
        'zipfile'
    ],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    cipher=block_cipher,
    noarchive=False,
)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='ApkDetecter',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=False, 
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon='Resources/logo.png'
)

coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='ApkDetecter',
)

app = BUNDLE(
    coll,
    name='ApkDetecter.app',
    icon='Resources/AppIcon.icns',
    bundle_identifier='com.apkdetecter.app',
    info_plist={
        'NSHighResolutionCapable': 'True',
        'CFBundleShortVersionString': '1.0.0',
        'CFBundleVersion': '1.0.0',
    },
)


================================================
FILE: CheckProtect.py
================================================
# -*- coding: utf-8 -*-
__author__ = 'Andy'

import json
import os
from androguard.core.apk import APK

class CheckProtect:
    def __init__(self, apk_obj):
        """
        :param apk_obj: androguard.core.apk.APK object
        """
        self.apk = apk_obj
        self.signatures = []
        self._load_signatures()

    def _load_signatures(self):
        """
        Load signatures from Resources/signatures.json
        """
        try:
            base_dir = os.path.dirname(os.path.abspath(__file__))
            json_path = os.path.join(base_dir, 'Resources', 'signatures.json')
            
            if os.path.exists(json_path):
                with open(json_path, 'r', encoding='utf-8') as f:
                    data = json.load(f)
                    self.signatures = data.get('signatures', [])
            else:
                # Fallback if file not found (though it should be there)
                print(f"Warning: Signature file not found at {json_path}")
        except Exception as e:
            print(f"Error loading signatures: {e}")

    def check_protectflag(self):
        detected_protectors = set()
        files = self.apk.get_files()
        
        # Pre-process files for faster matching
        # file_set: just filenames (e.g., "libjiagu.so")
        file_set = set()
        # path_set: full paths (e.g., "assets/libjiagu.so")
        path_set = set(files)
        
        for f in files:
            # Extract basename
            if '/' in f:
                basename = f.split('/')[-1]
            else:
                basename = f
            file_set.add(basename)

        for signature in self.signatures:
            name = signature['name']
            rules = signature.get('rules', [])
            
            match_found = False
            for rule in rules:
                rule_type = rule.get('type', 'file')
                
                if rule_type == 'combined':
                    # All conditions must be met
                    conditions = rule.get('conditions', [])
                    all_conditions_met = True
                    for cond in conditions:
                        if not self._check_rule(cond, file_set, path_set):
                            all_conditions_met = False
                            break
                    if all_conditions_met:
                        match_found = True
                        break
                else:
                    # Single rule
                    if self._check_rule(rule, file_set, path_set):
                        match_found = True
                        break
            
            if match_found:
                detected_protectors.add(name)

        if detected_protectors:
            # Format: "该APK已加固=>360加固 腾讯加固"
            return "该APK已加固=>" + " ".join(sorted(detected_protectors))
        
        return "该APK未加密"

    def _check_rule(self, rule, file_set, path_set):
        rule_type = rule.get('type', 'file')
        pattern = rule.get('pattern', '')
        match_mode = rule.get('match', 'exact') # exact, startswith, endswith, contains

        target_set = file_set if rule_type == 'file' else path_set

        # Optimization for exact match on file set
        if rule_type == 'file' and match_mode == 'exact':
            return pattern in target_set

        # For other cases, iterate
        for item in target_set:
            if match_mode == 'exact':
                if item == pattern: return True
            elif match_mode == 'startswith':
                if item.startswith(pattern): return True
            elif match_mode == 'endswith':
                if item.endswith(pattern): return True
            elif match_mode == 'contains':
                if pattern in item: return True
        
        return False


================================================
FILE: GUI/AppInfoWidget.py
================================================

from PyQt5 import QtWidgets, QtCore, QtGui
import os
import platform

class AppInfoWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(AppInfoWidget, self).__init__(parent)
        self.init_ui()

    def init_ui(self):
        self.layout = QtWidgets.QVBoxLayout(self)
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.layout.setSpacing(10)

        # Header Section
        self.header_frame = QtWidgets.QFrame()
        self.header_frame.setObjectName("HeaderFrame")
        self.header_layout = QtWidgets.QHBoxLayout(self.header_frame)
        self.header_layout.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) # Align Top
        self.header_layout.setSpacing(20)
        
        # Icon
        self.icon_label = QtWidgets.QLabel()
        self.icon_label.setFixedSize(125, 125)
        self.icon_label.setAlignment(QtCore.Qt.AlignCenter)
        self.icon_label.setStyleSheet("background-color: #333; border-radius: 10px;")
        
        # Info Block
        self.title_info_layout = QtWidgets.QVBoxLayout()
        self.title_info_layout.setAlignment(QtCore.Qt.AlignTop) # Also Align Top
        self.title_info_layout.setSpacing(5)
        self.title_info_layout.setContentsMargins(0, 5, 0, 0) 
        
        # Platform specific font sizes
        if platform.system() == 'Windows':
            name_size = "30px"
            pkg_size = "29px"
        else:
            name_size = "18px"
            pkg_size = "14px"

        self.app_name_label = QtWidgets.QLabel("App Name")
        self.app_name_label.setStyleSheet(f"font-size: {name_size}; font-weight: bold; color: #fff;")
        self.package_label = QtWidgets.QLabel("com.example.app")
        self.package_label.setStyleSheet(f"color: #aaa; font-size: {pkg_size};")
        self.version_label = QtWidgets.QLabel("v1.0.0")
        self.version_label.setStyleSheet("color: #4da6ff; font-weight: bold;")
        
        self.title_info_layout.addWidget(self.app_name_label)
        self.title_info_layout.addWidget(self.package_label)
        self.title_info_layout.addWidget(self.version_label)
        
        self.header_layout.addWidget(self.icon_label)
        self.header_layout.addLayout(self.title_info_layout)
        self.header_layout.addStretch()

        self.layout.addWidget(self.header_frame)

        # Tabs
        self.tabs = QtWidgets.QTabWidget()
        self.layout.addWidget(self.tabs)

        # Tab 1: Basic Info
        self.tab_basic = QtWidgets.QWidget()
        self.tabs.addTab(self.tab_basic, "Basic Info")
        self.init_basic_tab()

        # Tab 2: Permissions (Was Advanced Info)
        self.tab_perms = QtWidgets.QWidget()
        self.tabs.addTab(self.tab_perms, "Permissions & Entitlements")
        self.init_perms_tab()
        
        # Tab 3: Components (Dynamic)
        self.tab_components = QtWidgets.QTextEdit()
        self.tab_components.setReadOnly(True)
        self.tabs.addTab(self.tab_components, "Components")

    def init_basic_tab(self):
        # Using a ScrollArea because Cert info can be long
        self.basic_scroll = QtWidgets.QScrollArea(self.tab_basic)
        self.basic_scroll.setWidgetResizable(True)
        self.basic_scroll.setFrameShape(QtWidgets.QFrame.NoFrame)
        
        # Main Layout for Tab (holds ScrollArea)
        tab_layout = QtWidgets.QVBoxLayout(self.tab_basic)
        tab_layout.setContentsMargins(0,0,0,0)
        tab_layout.addWidget(self.basic_scroll)
        
        # Content Widget inside ScrollArea
        self.basic_content = QtWidgets.QWidget()
        self.basic_scroll.setWidget(self.basic_content)
        
        layout = QtWidgets.QVBoxLayout(self.basic_content)
        layout.setAlignment(QtCore.Qt.AlignTop)
        layout.setSpacing(15)

        # --- Grid for key-value pairs ---
        self.grid_widget = QtWidgets.QWidget()
        grid_layout = QtWidgets.QGridLayout(self.grid_widget)
        grid_layout.setContentsMargins(0,0,0,0)
        
        self.basic_labels = {}
        keys = [
            ("Size", "size"),
            ("MD5", "md5"),
            ("Min SDK / OS", "min_sdk"),
            ("Target SDK", "target_sdk"),
            ("Protection", "protect")
        ]

        row = 0
        for label_text, key in keys:
            lbl = QtWidgets.QLabel(label_text + ":")
            lbl.setStyleSheet("color: #ccc; font-weight: bold;")
            val = QtWidgets.QLineEdit()
            val.setReadOnly(True)
            val.setObjectName(f"val_{key}")
            
            grid_layout.addWidget(lbl, row, 0)
            grid_layout.addWidget(val, row, 1)
            self.basic_labels[key] = val
            row += 1
            
        layout.addWidget(self.grid_widget)
        
        # --- Certificate / Provisioning Info Section ---
        self.cert_label = QtWidgets.QLabel("Certificate / Signature Info")
        
        if platform.system() == 'Windows':
            cert_size = "26px"
        else:
            cert_size = "16px"
            
        self.cert_label.setStyleSheet(f"font-size: {cert_size}; font-weight: bold; color: #4da6ff; margin-top: 20px; margin-bottom: 5px;")
        layout.addWidget(self.cert_label)
        
        self.cert_text = QtWidgets.QTextEdit()
        self.cert_text.setReadOnly(True)
        # Allow it to expand
        self.cert_text.setMinimumHeight(200)
        layout.addWidget(self.cert_text)


    def init_perms_tab(self):
        layout = QtWidgets.QVBoxLayout(self.tab_perms)
        self.perms_text = QtWidgets.QTextEdit()
        self.perms_text.setReadOnly(True)
        layout.addWidget(self.perms_text)

    def update_data(self, analyzer_type, analyzer):
        # Update Header
        info = analyzer.get_basic_info()
        self.app_name_label.setText(str(info.get('name', 'Unknown')))
        self.package_label.setText(str(info.get('package', 'Unknown')))
        self.version_label.setText(str(info.get('version', 'Unknown')))

        # Update Icon
        if analyzer.icon_data:
            pixmap = QtGui.QPixmap()
            if not pixmap.loadFromData(analyzer.icon_data):
                self.icon_label.setText("Bad Icon")
            else:
                self.icon_label.setPixmap(pixmap.scaled(100, 100, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation))
        else:
            self.icon_label.setText("No Icon")

        # Update Basic Info (Grid)
        for key, widget in self.basic_labels.items():
            val = info.get(key, 'N/A')
            widget.setText(str(val))

        # Update Cert/Prov Info & Permissions based on type
        if analyzer_type == 'apk':
            self._update_apk_details(analyzer)
        else:
            self._update_ipa_details(analyzer)

    def _update_apk_details(self, analyzer):
        # 1. Certificate Info (Now in Basic Tab)
        content = ""
        cert = analyzer.cert_info
        if cert:
            content += f"<b>Issuer:</b> {cert.get('issuer')}<br>"
            content += f"<b>Subject:</b> {cert.get('subject')}<br>"
            content += f"<b>Serial:</b> {cert.get('serial')}<br>"
            content += f"<b>SHA1:</b> {cert.get('sha1')}<br>"
            content += f"<b>SHA256:</b> {cert.get('sha256')}<br>"
        else:
            content += "No certificate info found.<br>"
        
        self.cert_text.setHtml(content)

        # 2. Permissions (Now in Permissions Tab)
        perm_content = "<h2>Permissions</h2>"
        perms = analyzer.info.get('permissions', [])
        if perms:
            perm_content += "<ul>"
            for p in perms:
                perm_content += f"<li>{p}</li>"
            perm_content += "</ul>"
        else:
            perm_content += "<p>No permissions requested.</p>"

        self.perms_text.setHtml(perm_content)

        # 3. Components
        comp_text = "Activities:\n" + "\n".join(analyzer.info.get('activities', []))
        comp_text += "\n\nServices:\n" + "\n".join(analyzer.info.get('services', []))
        comp_text += "\n\nReceivers:\n" + "\n".join(analyzer.info.get('receivers', []))
        comp_text += "\n\nProviders:\n" + "\n".join(analyzer.info.get('providers', []))
        self.tab_components.setText(comp_text)

    def _update_ipa_details(self, analyzer):
        details = analyzer.get_details()
        prov = details.get('provision', {})

        # 1. Provisioning Info (Now in Basic Tab)
        content = ""
        if prov:
            content += f"<b>App ID Name:</b> {prov.get('app_id_name')}<br>"
            content += f"<b>Team Name:</b> {prov.get('team_name')} ({prov.get('team_id')})<br>"
            content += f"<b>UUID:</b> {prov.get('uuid')}<br>"
            content += f"<b>Created:</b> {prov.get('creation_date')}<br>"
            content += f"<b>Expires:</b> {prov.get('expiration_date')}<br>"
            content += "<h3>Provisioned Devices</h3><ul>"
            for dev in prov.get('provisioned_devices', []):
                content += f"<li>{dev}</li>"
            content += "</ul>"
        else:
            content += "<p>No embedded.mobileprovision found.</p>"
            
        self.cert_text.setHtml(content)

        # 2. Entitlements (Now in Permissions Tab)
        perm_content = "<h2>Entitlements</h2>"
        if prov:
            perm_content += "<ul>"
            for k, v in prov.get('entitlements', {}).items():
                perm_content += f"<li><b>{k}:</b> {v}</li>"
            perm_content += "</ul>"
        else:
             perm_content += "<p>No entitlements found.</p>"
        
        self.perms_text.setHtml(perm_content)

        # 3. Components
        comp_text = "URL Schemes:\n"
        for scheme in details.get('url_schemes', []):
            comp_text += f"- {scheme}\n"
        
        comp_text += f"\nSupported Platforms: {details.get('supported_platforms')}"
        comp_text += f"\nDTPlatformName: {details.get('platform')}"
        
        self.tab_components.setText(comp_text)


================================================
FILE: GUI/MainForm.py
================================================

from PyQt5 import QtWidgets, QtCore, QtGui
import sys
import os
import platform

from GUI.AppInfoWidget import AppInfoWidget
from Core.ApkAnalyzer import ApkAnalyzer
from Core.IpaAnalyzer import IpaAnalyzer
from Core.DeepScanner import DeepScanner

class DeepScanThread(QtCore.QThread):
    progress_signal = QtCore.pyqtSignal(int, str)
    finished_signal = QtCore.pyqtSignal(object)

    def __init__(self, apk_obj=None, ipa_path=None, analyzer=None):
        super(DeepScanThread, self).__init__()
        self.apk = apk_obj
        self.ipa_path = ipa_path
        self.analyzer = analyzer

    def run(self):
        binary_path_in_zip = None
        if self.analyzer and hasattr(self.analyzer, 'binary_path'):
            binary_path_in_zip = self.analyzer.binary_path
            
        scanner = DeepScanner(self.apk, self.ipa_path, binary_path_in_zip)
        results = scanner.scan(self.emit_progress)
        self.finished_signal.emit(results)

    def emit_progress(self, value, message):
        self.progress_signal.emit(value, message)

class AnalysisThread(QtCore.QThread):
    progress_signal = QtCore.pyqtSignal(int, str)
    finished_signal = QtCore.pyqtSignal(bool, object, str)

    def __init__(self, file_path):
        super(AnalysisThread, self).__init__()
        self.file_path = file_path
        self.analyzer = None
        self.analyzer_type = None

    def run(self):
        try:
            if self.file_path.lower().endswith('.apk'):
                self.analyzer = ApkAnalyzer(self.file_path)
                self.analyzer_type = 'apk'
            elif self.file_path.lower().endswith('.ipa'):
                self.analyzer = IpaAnalyzer(self.file_path)
                self.analyzer_type = 'ipa'
            else:
                self.finished_signal.emit(False, None, "Unsupported file type")
                return

            self.analyzer.set_progress_callback(self.emit_progress)
            success = self.analyzer.analyze()
            
            if success:
                self.finished_signal.emit(True, self.analyzer, self.analyzer_type)
            else:
                self.finished_signal.emit(False, None, self.analyzer.error)
        except Exception as e:
            self.finished_signal.emit(False, None, str(e))
            import traceback
            traceback.print_exc()

    def emit_progress(self, value, message):
        self.progress_signal.emit(value, message)

class OverlayWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(OverlayWidget, self).__init__(parent)
        self.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents, False)
        self.setAttribute(QtCore.Qt.WA_NoSystemBackground, False)
        
        # Auto-progress timer to prevent "stuck" feeling
        self.creep_timer = QtCore.QTimer(self)
        self.creep_timer.timeout.connect(self._on_creep_timer)
        self.creep_mode = False
        
        # Layer 1: Log (Bottom)
        self.log_widget = QtWidgets.QTextEdit(self)
        self.log_widget.setReadOnly(True)
        
        if platform.system() == 'Windows':
            log_font_size = "20px"
            card_width = 800
            loading_font = "36px"
            action_font = "20px"
        else:
            log_font_size = "13px"
            card_width = 500
            loading_font = "24px"
            action_font = "14px"
            
        self.log_widget.setStyleSheet(f"""
            QTextEdit {{
                background-color: #1a1a1a;
                color: #00ff00;
                border: none;
                font-family: "Courier New", monospace;
                font-size: {log_font_size};
                padding: 10px;
            }}
        """)
        
        # Layer 2: Dim/Blur (Middle)
        self.dim_widget = QtWidgets.QWidget(self)
        self.dim_widget.setStyleSheet("background-color: rgba(0, 0, 0, 150);")
        self.dim_widget.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
        
        # Layer 3: Progress (Top)
        self.progress_container = QtWidgets.QWidget(self)
        self.progress_container.setAttribute(QtCore.Qt.WA_TranslucentBackground)
        
        # Setup Progress Layout
        self.progress_layout = QtWidgets.QVBoxLayout(self.progress_container)
        self.progress_layout.setAlignment(QtCore.Qt.AlignCenter)
        
        self.progress_card = QtWidgets.QWidget()
        self.progress_card.setFixedWidth(card_width)
        self.progress_card.setStyleSheet("""
            QWidget {
                background-color: rgba(40, 40, 40, 240);
                border: 1px solid #555;
                border-radius: 10px;
            }
            QLabel {
                background-color: transparent;
                color: white;
                border: none;
            }
        """)
        
        card_layout = QtWidgets.QVBoxLayout(self.progress_card)
        card_layout.setContentsMargins(30, 30, 30, 30)
        
        self.loading_label = QtWidgets.QLabel("Analyzing...")
        self.loading_label.setStyleSheet(f"font-size: {loading_font}; font-weight: bold; margin-bottom: 10px;")
        self.loading_label.setAlignment(QtCore.Qt.AlignCenter)
        
        self.progress_bar = QtWidgets.QProgressBar()
        
        if platform.system() == 'Windows':
            self.progress_bar.setFixedHeight(30)
            pb_font_size = "18px"
        else:
            self.progress_bar.setFixedHeight(8)
            pb_font_size = "10px"
            
        self.progress_bar.setStyleSheet(f"""
            QProgressBar {{
                border: none;
                background-color: #444;
                border-radius: 4px;
                text-align: center;
                color: white;
                font-weight: bold;
                font-size: {pb_font_size};
            }}
            QProgressBar::chunk {{
                background-color: #007acc;
                border-radius: 4px;
            }}
        """)
        
        self.current_action_label = QtWidgets.QLabel("Initializing...")
        self.current_action_label.setStyleSheet(f"font-size: {action_font}; color: #aaa; margin-top: 5px;")
        self.current_action_label.setAlignment(QtCore.Qt.AlignCenter)
        
        card_layout.addWidget(self.loading_label)
        card_layout.addWidget(self.progress_bar)
        card_layout.addWidget(self.current_action_label)
        
        self.progress_layout.addWidget(self.progress_card)

    def resizeEvent(self, event):
        s = event.size()
        # Ensure full coverage
        self.log_widget.setGeometry(0, 0, s.width(), s.height())
        self.dim_widget.setGeometry(0, 0, s.width(), s.height())
        self.progress_container.setGeometry(0, 0, s.width(), s.height())
        
        # Ensure Z-Order (Lower is bottom)
        self.log_widget.lower()
        self.dim_widget.stackUnder(self.progress_container)
        self.progress_container.raise_()
        
        super(OverlayWidget, self).resizeEvent(event)

    def set_progress(self, value, message):
        # Always update message
        self.current_action_label.setText(message)
        self.log_text_append(f"> {message}")

        # Logic for progress bar
        current_val = self.progress_bar.value()
        
        # Reset if value is 0 (new analysis)
        if value == 0:
            self.progress_bar.setValue(0)
            self.creep_timer.stop() # Stop previous timer if any
            return

        # If new value is higher, jump to it
        if value > current_val:
            self.progress_bar.setValue(value)
        
        # If value is 100, stop creep
        if value >= 100:
            self.creep_timer.stop()
            self.progress_bar.setValue(100)
        elif value > 0 and not self.creep_timer.isActive():
            # Start creeping if not started
            self._start_creep()

    def _start_creep(self):
        # Start a slow timer to increment progress artificially
        # This prevents the "stuck" feeling
        self.creep_timer.start(500) # Check every 500ms

    def _on_creep_timer(self):
        val = self.progress_bar.value()
        if val < 95:
            # Slow down as we get higher
            # 0-50: fast
            # 50-80: medium
            # 80-95: slow
            
            should_increment = False
            import random
            
            if val < 50:
                should_increment = True # Always increment
            elif val < 80:
                should_increment = (random.random() > 0.3) # 70% chance
            else:
                should_increment = (random.random() > 0.7) # 30% chance
                
            if should_increment:
                self.progress_bar.setValue(val + 1)

    def log_text_append(self, text):
        self.log_widget.append(text)
        cursor = self.log_widget.textCursor()
        cursor.movePosition(QtGui.QTextCursor.End)
        self.log_widget.setTextCursor(cursor)
        
    def clear_log(self):
        self.log_widget.clear()


class MainForm(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainForm, self).__init__()
        self.setWindowTitle("AppDetecter - Modern APK/IPA Analyzer")
        
        if platform.system() == 'Windows':
            self.resize(1600, 1100) # Windows specific large size
        else:
            self.resize(900, 600) # Mac default
            
        self.setAcceptDrops(True)
        
        self.init_ui()

    def load_icon(self, name):
        """Helper to load icons from Resources/icons/"""
        if getattr(sys, 'frozen', False):
            base_dir = sys._MEIPASS
        else:
            base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
            
        icon_path = os.path.join(base_dir, 'Resources', 'icons', f'{name}.svg')
        if os.path.exists(icon_path):
            return QtGui.QIcon(icon_path)
        return QtGui.QIcon() # Return empty icon if not found

    def init_ui(self):
        # Central Widget
        self.central_widget = QtWidgets.QWidget()
        self.setCentralWidget(self.central_widget)
        self.main_layout = QtWidgets.QVBoxLayout(self.central_widget)
        self.main_layout.setContentsMargins(0, 0, 0, 0) # Full bleed

        # Stacked Layout to hold Drop Area and App Info
        self.stacked_widget = QtWidgets.QStackedWidget()
        self.main_layout.addWidget(self.stacked_widget)

        # 1. Drop Area Page
        self.drop_page = QtWidgets.QWidget()
        drop_layout = QtWidgets.QVBoxLayout(self.drop_page)
        drop_layout.setAlignment(QtCore.Qt.AlignCenter)
        
        self.drop_label = QtWidgets.QLabel("Drop APK / IPA File Here")
        self.drop_label.setAlignment(QtCore.Qt.AlignCenter)
        self.drop_label.setStyleSheet("""
            QLabel {
                font-size: 36px;
                color: #888;
                font-weight: bold;
            }
        """)
        
        self.sub_drop_label = QtWidgets.QLabel("or select File > Open from menu")
        self.sub_drop_label.setAlignment(QtCore.Qt.AlignCenter)
        self.sub_drop_label.setStyleSheet("font-size: 18px; color: #666;")
        
        # Try to load logo
        # For Window Icon: Handled in ApkDetecter.py globally
        # logo_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'Resources', 'logo.png')
        # if os.path.exists(logo_path):
        #    self.setWindowIcon(QtGui.QIcon(logo_path))

        drop_layout.addStretch()
        # Removed icon_graphic from display
        drop_layout.addWidget(self.drop_label)
        drop_layout.addWidget(self.sub_drop_label)
        drop_layout.addStretch()
        
        self.stacked_widget.addWidget(self.drop_page)

        # 2. App Info Page
        self.app_info_widget = AppInfoWidget()
        self.stacked_widget.addWidget(self.app_info_widget)

        # Overlay for Loading (Hidden by default)
        # Note: Parent is central_widget to cover everything inside it
        self.overlay = OverlayWidget(self.central_widget)
        self.overlay.hide()

        # Menu Bar
        # On macOS, we want the native global menu bar.
        # On Windows, user requested to remove it to match Mac's "clean window" look (since Mac has it in system bar).
        if platform.system() == 'Darwin':
            menubar = self.menuBar()
            file_menu = menubar.addMenu("File")
            
            open_action = QtWidgets.QAction("Open", self)
            open_action.setShortcut("Ctrl+O")
            open_action.setIcon(self.load_icon('open'))
            open_action.triggered.connect(self.open_file_dialog)
            file_menu.addAction(open_action)

            exit_action = QtWidgets.QAction("Exit", self)
            exit_action.setShortcut("Ctrl+Q")
            exit_action.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_DialogCloseButton))
            exit_action.triggered.connect(self.close)
            file_menu.addAction(exit_action)
            
            help_menu = menubar.addMenu("Help")
            about_action = QtWidgets.QAction("About", self)
            about_action.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_MessageBoxInformation))
            about_action.triggered.connect(self.show_about)
            help_menu.addAction(about_action)
        else:
            # For Windows (and others), we define actions but don't add them to a MenuBar
            # ensuring they can still be triggered via shortcuts or Toolbar if needed.
            open_action = QtWidgets.QAction("Open", self)
            open_action.setShortcut("Ctrl+O")
            open_action.setIcon(self.load_icon('open'))
            open_action.triggered.connect(self.open_file_dialog)

            exit_action = QtWidgets.QAction("Exit", self)
            exit_action.setShortcut("Ctrl+Q")
            exit_action.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_DialogCloseButton))
            exit_action.triggered.connect(self.close)
            
            about_action = QtWidgets.QAction("About", self)
            about_action.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_MessageBoxInformation))
            about_action.triggered.connect(self.show_about)

        # Toolbar
        toolbar = QtWidgets.QToolBar("Main Toolbar")
        toolbar.setMovable(False)
        toolbar.setFloatable(False)
        if platform.system() == 'Windows':
            toolbar.setIconSize(QtCore.QSize(48, 48))
        else:
            toolbar.setIconSize(QtCore.QSize(32, 32)) # Default mac size
        self.addToolBar(toolbar)

        toolbar.addAction(open_action)

        # Clear Action
        clear_action = QtWidgets.QAction("Clear", self)
        clear_action.setIcon(self.load_icon('clear'))
        clear_action.setToolTip("Clear current analysis")
        clear_action.triggered.connect(self.clear_analysis)
        toolbar.addAction(clear_action)

        toolbar.addSeparator()

        # Export Action
        export_action = QtWidgets.QAction("Export", self)
        export_action.setIcon(self.load_icon('export'))
        export_action.setToolTip("Export analysis report")
        export_action.triggered.connect(self.export_report)
        toolbar.addAction(export_action)
        
        # Deep Scan Action
        deep_scan_action = QtWidgets.QAction("Deep Scan", self)
        deep_scan_action.setIcon(self.load_icon('scan'))
        deep_scan_action.setToolTip("Run deep scan (Slow)")
        deep_scan_action.triggered.connect(self.run_deep_scan)
        toolbar.addAction(deep_scan_action)

        # Add a spacer to push other items (if any)
        # empty_widget = QtWidgets.QWidget()
        # empty_widget.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
        # toolbar.addWidget(empty_widget)
        
        # Status Bar
        self.status_bar = self.statusBar()
        self.status_bar.showMessage("Ready")

    def resizeEvent(self, event):
        # Resize overlay to cover entire window content area
        self.overlay.resize(self.central_widget.size())
        super(MainForm, self).resizeEvent(event)

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.accept()
            self.drop_page.setStyleSheet("background-color: #2a2a2a;") # Highlight
        else:
            event.ignore()

    def dragLeaveEvent(self, event):
        self.drop_page.setStyleSheet("") # Reset

    def dropEvent(self, event):
        self.drop_page.setStyleSheet("")
        files = [u.toLocalFile() for u in event.mimeData().urls()]
        for f in files:
            if f.lower().endswith('.apk') or f.lower().endswith('.ipa'):
                self.load_file(f)
                break

    def open_file_dialog(self):
        options = QtWidgets.QFileDialog.Options()
        fname, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open App File", "", "App Files (*.apk *.ipa);;APK Files (*.apk);;IPA Files (*.ipa);;All Files (*)", options=options)
        if fname:
            self.load_file(fname)

    def load_file(self, file_path):
        self.overlay.clear_log() # Clear previous logs
        self.overlay.show()
        self.overlay.raise_()
        self.overlay.set_progress(0, f"Initializing analysis for {os.path.basename(file_path)}...")
        self.status_bar.showMessage(f"Analyzing {file_path}...")

        # Start Thread
        self.thread = AnalysisThread(file_path)
        self.thread.progress_signal.connect(self.update_progress)
        self.thread.finished_signal.connect(self.analysis_finished)
        self.thread.start()

    def update_progress(self, value, message):
        self.overlay.set_progress(value, message)
        self.status_bar.showMessage(message)

    def analysis_finished(self, success, analyzer, analyzer_type):
        self.overlay.hide()
        
        if success:
            self.stacked_widget.setCurrentWidget(self.app_info_widget)
            self.app_info_widget.update_data(analyzer_type, analyzer)
            self.status_bar.showMessage(f"Loaded: {os.path.basename(self.thread.file_path)}")
            
            # Store data for export
            self.current_analyzer_info = analyzer.get_basic_info()
            # Add more details if needed
            self.current_analyzer_info['full_details'] = analyzer.info
            
        else:
            self.stacked_widget.setCurrentWidget(self.drop_page)
            error_msg = analyzer_type if analyzer_type else "Error"
            QtWidgets.QMessageBox.critical(self, "Analysis Error", str(error_msg))
            self.status_bar.showMessage("Analysis failed.")

    def show_about(self):
        QtWidgets.QMessageBox.about(self, "About", 
            "<h3>AppDetecter</h3>"
            "<p>A modern tool for analyzing Android (APK) and iOS (IPA) applications.</p>"
            "<p>Refactored by AYL.</p>"
        )

    def clear_analysis(self):
        self.stacked_widget.setCurrentWidget(self.drop_page)
        self.status_bar.showMessage("Ready")
        self.setWindowTitle("AppDetecter - Modern APK/IPA Analyzer")

    def export_report(self):
        if self.stacked_widget.currentWidget() != self.app_info_widget:
            QtWidgets.QMessageBox.warning(self, "Export", "No analysis data to export. Please load an app first.")
            return

        options = QtWidgets.QFileDialog.Options()
        file_path, _ = QtWidgets.QFileDialog.getSaveFileName(self, "Export Report", "report.json", "JSON Files (*.json);;Text Files (*.txt)", options=options)
        
        if file_path:
            try:
                if hasattr(self, 'current_analyzer_info'):
                    import json
                    with open(file_path, 'w', encoding='utf-8') as f:
                        json.dump(self.current_analyzer_info, f, indent=4, ensure_ascii=False)
                    self.status_bar.showMessage(f"Report exported to {file_path}")
                else:
                     QtWidgets.QMessageBox.warning(self, "Export", "Data not available for export.")

            except Exception as e:
                QtWidgets.QMessageBox.critical(self, "Export Error", str(e))

    def run_deep_scan(self):
        if self.stacked_widget.currentWidget() != self.app_info_widget:
            QtWidgets.QMessageBox.warning(self, "Deep Scan", "Please load an app first.")
            return

        # Check if we have an analyzer instance
        if hasattr(self, 'thread') and self.thread.analyzer:
             analyzer = self.thread.analyzer
             
             # Determine type
             apk_obj = None
             ipa_path = None
             
             if hasattr(analyzer, 'apk'):
                 apk_obj = analyzer.apk
             elif hasattr(analyzer, 'file_path') and analyzer.file_path.lower().endswith('.ipa'):
                 ipa_path = analyzer.file_path
                 # Pass the found binary path if available
                 if hasattr(analyzer, 'binary_path'):
                     # We can't pass it directly to DeepScanner constructor as currently defined,
                     # but we can improve DeepScanner or DeepScanThread.
                     # Let's pass the analyzer itself to DeepScanThread instead?
                     pass
             
             if apk_obj or ipa_path:
                 self.overlay.show()
                 self.overlay.raise_()
                 self.overlay.set_progress(0, "Starting Deep Scan...")
                 
                 # Run in a new thread to avoid blocking UI
                 self.scan_thread = DeepScanThread(apk_obj, ipa_path, analyzer)
                 self.scan_thread.progress_signal.connect(self.update_progress)
                 self.scan_thread.finished_signal.connect(self.deep_scan_finished)
                 self.scan_thread.start()
             else:
                 QtWidgets.QMessageBox.warning(self, "Deep Scan", "Could not determine scan target (APK/IPA).")
        else:
             QtWidgets.QMessageBox.warning(self, "Deep Scan", "Analysis session expired. Please reload the app.")

    def deep_scan_finished(self, results):
        self.overlay.hide()
        self.status_bar.showMessage("Deep Scan Completed")
        
        # Show results in a new dialog or tab
        # For now, let's use a simple dialog with tabs
        dlg = QtWidgets.QDialog(self)
        dlg.setWindowTitle("Deep Scan Results")
        # Remove the context help button (?)
        dlg.setWindowFlags(dlg.windowFlags() & ~QtCore.Qt.WindowContextHelpButtonHint)
        
        if platform.system() == 'Windows':
            dlg.resize(1200, 1000)
        else:
            dlg.resize(600, 500)
        
        layout = QtWidgets.QVBoxLayout(dlg)
        tabs = QtWidgets.QTabWidget()
        
        # Helper to add tab
        def add_result_tab(name, data_list):
            widget = QtWidgets.QWidget()
            vbox = QtWidgets.QVBoxLayout(widget)
            text_edit = QtWidgets.QTextEdit()
            text_edit.setReadOnly(True)
            if data_list:
                text_edit.setText("\n".join(data_list))
            else:
                text_edit.setText("No entries found.")
            vbox.addWidget(text_edit)
            tabs.addTab(widget, f"{name} ({len(data_list)})")
            
        add_result_tab("URLs", results.get("urls", []))
        add_result_tab("IPs", results.get("ips", []))
        add_result_tab("Strings", results.get("sensitive_strings", []))
        add_result_tab("Anti-Debug", results.get("anti_debug", []))
        add_result_tab("Crypto", results.get("crypto", []))
        
        layout.addWidget(tabs)
        
        # Button Box
        btn_layout = QtWidgets.QHBoxLayout()
        
        export_btn = QtWidgets.QPushButton("Export Results")
        export_btn.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_DialogSaveButton))
        export_btn.clicked.connect(lambda: self.export_deep_scan_results(results, dlg))
        btn_layout.addWidget(export_btn)
        
        btn_layout.addStretch()
        
        close_btn = QtWidgets.QPushButton("Close")
        close_btn.clicked.connect(dlg.accept)
        btn_layout.addWidget(close_btn)
        
        layout.addLayout(btn_layout)
        
        dlg.exec_()

    def export_deep_scan_results(self, results, parent_dlg):
        options = QtWidgets.QFileDialog.Options()
        file_path, _ = QtWidgets.QFileDialog.getSaveFileName(parent_dlg, "Export Deep Scan Results", "deep_scan_results.zip", "ZIP Files (*.zip)", options=options)
        
        if file_path:
            try:
                import zipfile
                
                with zipfile.ZipFile(file_path, 'w', zipfile.ZIP_DEFLATED) as zf:
                    # Helper to write list to file in zip
                    def write_list_to_zip(name, data_list):
                        content = ""
                        if data_list:
                            content = "\n".join(data_list)
                        else:
                            content = "No entries found."
                        zf.writestr(f"{name}.txt", content)

                    write_list_to_zip("URLs", results.get("urls", []))
                    write_list_to_zip("IPs", results.get("ips", []))
                    write_list_to_zip("Strings", results.get("sensitive_strings", []))
                    write_list_to_zip("Anti-Debug", results.get("anti_debug", []))
                    write_list_to_zip("Crypto", results.get("crypto", []))

                QtWidgets.QMessageBox.information(parent_dlg, "Export", f"Results exported to {file_path}")
            except Exception as e:
                QtWidgets.QMessageBox.critical(parent_dlg, "Export Error", str(e))



================================================
FILE: GUI/StyleSheet.py
================================================

# Modern Dark Theme for ApkDetecter
import platform

QSS_COMMON = """
/* General Window */
QMainWindow, QDialog, QWidget {
    background-color: #2b2b2b;
    color: #e0e0e0;
    font-family: "Segoe UI", "Arial", sans-serif;
}

/* GroupBox */
QGroupBox {
    border: 1px solid #3d3d3d;
    border-radius: 6px;
    margin-top: 24px;
    font-weight: bold;
    color: #e0e0e0;
}

QGroupBox::title {
    subcontrol-origin: margin;
    subcontrol-position: top left;
    left: 10px;
    padding: 0 5px;
    color: #4da6ff; /* Blue accent */
}

/* Labels */
QLabel {
    color: #cccccc;
}

/* TextBrowser / TextEdit / LineEdit */
QTextBrowser, QTextEdit, QLineEdit {
    background-color: #363636;
    border: 1px solid #3d3d3d;
    border-radius: 4px;
    color: #ffffff;
    selection-background-color: #4da6ff;
}

QTextBrowser:disabled, QTextEdit:disabled {
    background-color: #2f2f2f;
    color: #909090;
    border: 1px solid #333333;
}

/* Push Buttons */
QPushButton {
    background-color: #3a3a3a;
    border: 1px solid #4a4a4a;
    border-radius: 4px;
    color: #e0e0e0;
    padding: 4px 12px;
    min-height: 20px;
}

QPushButton:hover {
    background-color: #4a4a4a;
    border: 1px solid #5a5a5a;
}

QPushButton:pressed {
    background-color: #2a2a2a;
}

QPushButton#file_open {
    background-color: #007acc;
    color: white;
    border: 1px solid #005c99;
}

QPushButton#file_open:hover {
    background-color: #008ae6;
}

QPushButton#file_open:pressed {
    background-color: #005c99;
}

/* Progress Bar */
QProgressBar {
    border: 1px solid #3d3d3d;
    border-radius: 4px;
    background-color: #363636;
    text-align: center;
    color: #e0e0e0;
}

QProgressBar::chunk {
    background-color: #007acc;
    border-radius: 3px;
}

/* ScrollBars */
QScrollBar:vertical {
    border: none;
    background: #2b2b2b;
    width: 10px;
    margin: 0px 0px 0px 0px;
}

QScrollBar::handle:vertical {
    background: #505050;
    min-height: 20px;
    border-radius: 5px;
}

QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {
    height: 0px;
}

QScrollBar:horizontal {
    border: none;
    background: #2b2b2b;
    height: 10px;
    margin: 0px 0px 0px 0px;
}

QScrollBar::handle:horizontal {
    background: #505050;
    min-width: 20px;
    border-radius: 5px;
}

QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal {
    width: 0px;
}
"""

QSS_WIN_OVERRIDES = """
/* Windows Specific Overrides for High DPI / Readability */
QMainWindow, QDialog, QWidget {
    font-size: 24px;
}

QGroupBox {
    font-size: 26px;
    margin-top: 36px;
}

QGroupBox::title {
    top: -24px;
    left: 10px;
}

QLabel {
    font-size: 24px;
}

QTextBrowser, QTextEdit, QLineEdit {
    font-size: 24px;
    padding: 10px;
}

QPushButton {
    padding: 8px 20px;
    min-height: 32px;
}

QScrollBar:vertical {
    width: 20px;
}

QScrollBar:horizontal {
    height: 20px;
}
"""

QSS_MAC_OVERRIDES = """
/* macOS Specific Overrides */
QLabel {
    font-size: 12px;
}
/* Other defaults are usually fine on Mac */
"""

if platform.system() == "Windows":
    QSS = QSS_COMMON + QSS_WIN_OVERRIDES
else:
    # Default to Mac/Linux style
    QSS = QSS_COMMON + QSS_MAC_OVERRIDES


================================================
FILE: GUI/__init__.py
================================================
__author__ = 'Andy'


================================================
FILE: GUI/apkdetecter_ui.ui
================================================
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>APKDetecter</class>
 <widget class="QWidget" name="APKDetecter">
  <property name="windowModality">
   <enum>Qt::WindowModal</enum>
  </property>
  <property name="enabled">
   <bool>true</bool>
  </property>
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>432</width>
    <height>237</height>
   </rect>
  </property>
  <property name="minimumSize">
   <size>
    <width>432</width>
    <height>237</height>
   </size>
  </property>
  <property name="maximumSize">
   <size>
    <width>432</width>
    <height>237</height>
   </size>
  </property>
  <property name="windowTitle">
   <string>APKDetecter</string>
  </property>
  <property name="windowIcon">
   <iconset>
    <normaloff>C:/Users/Andy/Desktop/20150117051304968_easyicon_net_512.png</normaloff>C:/Users/Andy/Desktop/20150117051304968_easyicon_net_512.png</iconset>
  </property>
  <widget class="QLabel" name="lab_file">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>10</y>
     <width>41</width>
     <height>16</height>
    </rect>
   </property>
   <property name="font">
    <font>
     <family>Arial</family>
     <pointsize>10</pointsize>
     <weight>75</weight>
     <bold>true</bold>
    </font>
   </property>
   <property name="text">
    <string>文 件</string>
   </property>
  </widget>
  <widget class="QTextBrowser" name="te_path">
   <property name="geometry">
    <rect>
     <x>50</x>
     <y>5</y>
     <width>291</width>
     <height>24</height>
    </rect>
   </property>
  </widget>
  <widget class="QPushButton" name="file_open">
   <property name="geometry">
    <rect>
     <x>350</x>
     <y>5</y>
     <width>71</width>
     <height>23</height>
    </rect>
   </property>
   <property name="font">
    <font>
     <family>Arial</family>
     <pointsize>10</pointsize>
     <weight>75</weight>
     <bold>true</bold>
    </font>
   </property>
   <property name="text">
    <string>打  开</string>
   </property>
  </widget>
  <widget class="QGroupBox" name="groupBox">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>30</y>
     <width>411</width>
     <height>181</height>
    </rect>
   </property>
   <property name="font">
    <font>
     <family>Arabic Typesetting</family>
     <pointsize>8</pointsize>
     <weight>50</weight>
     <italic>true</italic>
     <bold>false</bold>
    </font>
   </property>
   <property name="title">
    <string>DEX信息</string>
   </property>
   <widget class="QLabel" name="lab_linksize">
    <property name="geometry">
     <rect>
      <x>210</x>
      <y>70</y>
      <width>71</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <italic>false</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>连接段大小</string>
    </property>
   </widget>
   <widget class="QLabel" name="lab_dex_flag">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>30</y>
      <width>61</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <italic>false</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>DEX 标 识</string>
    </property>
   </widget>
   <widget class="QLabel" name="lab_dexheader_size">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>70</y>
      <width>61</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <weight>75</weight>
      <italic>false</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>DEX头大小</string>
    </property>
   </widget>
   <widget class="QTextBrowser" name="te_endiantag">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>80</x>
      <y>104</y>
      <width>111</width>
      <height>27</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <italic>false</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QLabel" name="lab_linkoff">
    <property name="geometry">
     <rect>
      <x>210</x>
      <y>111</y>
      <width>71</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <italic>false</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>连接段偏移</string>
    </property>
   </widget>
   <widget class="QTextBrowser" name="te_linkoff">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>292</x>
      <y>103</y>
      <width>111</width>
      <height>27</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <italic>false</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QLabel" name="lab_file_size">
    <property name="geometry">
     <rect>
      <x>212</x>
      <y>32</y>
      <width>54</width>
      <height>12</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <italic>false</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>文件大小</string>
    </property>
   </widget>
   <widget class="QTextBrowser" name="te_linksize">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>292</x>
      <y>63</y>
      <width>111</width>
      <height>27</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <italic>false</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextBrowser" name="te_dexheader_size">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>80</x>
      <y>63</y>
      <width>111</width>
      <height>27</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <italic>false</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextBrowser" name="te_file_size">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>292</x>
      <y>22</y>
      <width>111</width>
      <height>27</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <italic>false</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QLabel" name="lab_endiantag">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>113</y>
      <width>54</width>
      <height>12</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <italic>false</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>字节序列</string>
    </property>
   </widget>
   <widget class="QTextBrowser" name="te_protect">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>12</x>
      <y>140</y>
      <width>391</width>
      <height>27</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <italic>false</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="te_dex_flag">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>80</x>
      <y>22</y>
      <width>111</width>
      <height>27</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <italic>false</italic>
      <bold>true</bold>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
  </widget>
  <widget class="QProgressBar" name="progressBar">
   <property name="enabled">
    <bool>true</bool>
   </property>
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>217</y>
     <width>191</width>
     <height>16</height>
    </rect>
   </property>
   <property name="value">
    <number>0</number>
   </property>
  </widget>
  <widget class="QPushButton" name="extend_info">
   <property name="geometry">
    <rect>
     <x>275</x>
     <y>214</y>
     <width>71</width>
     <height>20</height>
    </rect>
   </property>
   <property name="text">
    <string>扩展信息</string>
   </property>
  </widget>
  <widget class="QPushButton" name="about_info">
   <property name="geometry">
    <rect>
     <x>350</x>
     <y>214</y>
     <width>71</width>
     <height>20</height>
    </rect>
   </property>
   <property name="text">
    <string>About</string>
   </property>
  </widget>
  <widget class="QPushButton" name="apk_info">
   <property name="geometry">
    <rect>
     <x>200</x>
     <y>214</y>
     <width>71</width>
     <height>20</height>
    </rect>
   </property>
   <property name="text">
    <string>ApkInfo</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>


================================================
FILE: GUI/apkinfo_ui.ui
================================================
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>ApkInfo</class>
 <widget class="QWidget" name="ApkInfo">
  <property name="windowModality">
   <enum>Qt::WindowModal</enum>
  </property>
  <property name="enabled">
   <bool>true</bool>
  </property>
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>621</width>
    <height>340</height>
   </rect>
  </property>
  <property name="minimumSize">
   <size>
    <width>621</width>
    <height>340</height>
   </size>
  </property>
  <property name="maximumSize">
   <size>
    <width>621</width>
    <height>340</height>
   </size>
  </property>
  <property name="windowTitle">
   <string>ApkInformation</string>
  </property>
  <property name="windowIcon">
   <iconset>
    <normaloff>C:/Users/Andy/Desktop/20150117051304968_easyicon_net_512.png</normaloff>C:/Users/Andy/Desktop/20150117051304968_easyicon_net_512.png</iconset>
  </property>
  <widget class="QGroupBox" name="groupBox">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>10</y>
     <width>601</width>
     <height>321</height>
    </rect>
   </property>
   <property name="font">
    <font>
     <family>Aharoni</family>
     <pointsize>9</pointsize>
     <weight>75</weight>
     <italic>false</italic>
     <bold>true</bold>
    </font>
   </property>
   <property name="title">
    <string>文件信息</string>
   </property>
   <widget class="QLabel" name="file_size">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>27</y>
      <width>54</width>
      <height>12</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>文件大小</string>
    </property>
   </widget>
   <widget class="QLabel" name="package_name">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>63</y>
      <width>54</width>
      <height>12</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>文件包名</string>
    </property>
   </widget>
   <widget class="QLabel" name="version">
    <property name="geometry">
     <rect>
      <x>312</x>
      <y>28</y>
      <width>54</width>
      <height>12</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>版   本</string>
    </property>
   </widget>
   <widget class="QLabel" name="version_num">
    <property name="geometry">
     <rect>
      <x>311</x>
      <y>64</y>
      <width>54</width>
      <height>12</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>版本号</string>
    </property>
   </widget>
   <widget class="QLabel" name="version_need">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>101</y>
      <width>54</width>
      <height>12</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>系统要求</string>
    </property>
   </widget>
   <widget class="QLabel" name="serial_num">
    <property name="geometry">
     <rect>
      <x>312</x>
      <y>100</y>
      <width>54</width>
      <height>12</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>序列号</string>
    </property>
   </widget>
   <widget class="QLabel" name="publisher">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>228</y>
      <width>54</width>
      <height>12</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>发 行 者</string>
    </property>
   </widget>
   <widget class="QLabel" name="issuer">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>280</y>
      <width>54</width>
      <height>12</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial</family>
      <pointsize>10</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>签 发 人</string>
    </property>
   </widget>
   <widget class="QLabel" name="apkmd5">
    <property name="geometry">
     <rect>
      <x>11</x>
      <y>143</y>
      <width>54</width>
      <height>12</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial</family>
      <pointsize>9</pointsize>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>APKMD5</string>
    </property>
   </widget>
   <widget class="QLabel" name="dexmd5">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>181</y>
      <width>54</width>
      <height>12</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial</family>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>DEXMD5</string>
    </property>
   </widget>
   <widget class="QTextEdit" name="edt_file">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>70</x>
      <y>18</y>
      <width>231</width>
      <height>28</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Box</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="edt_package">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>70</x>
      <y>54</y>
      <width>231</width>
      <height>28</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="edt_version_need">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>70</x>
      <y>91</y>
      <width>231</width>
      <height>28</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="edt_version">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>360</x>
      <y>19</y>
      <width>231</width>
      <height>28</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Box</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="edt_version_num">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>360</x>
      <y>55</y>
      <width>231</width>
      <height>28</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="edt_serial_num">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>360</x>
      <y>92</y>
      <width>231</width>
      <height>28</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="edt_apkmd5">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>70</x>
      <y>132</y>
      <width>521</width>
      <height>28</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="edt_dexmd5">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>70</x>
      <y>170</y>
      <width>521</width>
      <height>28</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="edt_publisher">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>70</x>
      <y>207</y>
      <width>521</width>
      <height>48</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="edt_issuer">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>70</x>
      <y>263</y>
      <width>521</width>
      <height>48</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <family>Arial Narrow</family>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>


================================================
FILE: GUI/dexinfor_ui.ui
================================================
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>DexInfo</class>
 <widget class="QWidget" name="DexInfo">
  <property name="windowModality">
   <enum>Qt::WindowModal</enum>
  </property>
  <property name="enabled">
   <bool>true</bool>
  </property>
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>581</width>
    <height>422</height>
   </rect>
  </property>
  <property name="minimumSize">
   <size>
    <width>581</width>
    <height>422</height>
   </size>
  </property>
  <property name="maximumSize">
   <size>
    <width>581</width>
    <height>422</height>
   </size>
  </property>
  <property name="windowTitle">
   <string>DexInformation</string>
  </property>
  <property name="windowIcon">
   <iconset>
    <normaloff>C:/Users/Andy/Desktop/201.png</normaloff>C:/Users/Andy/Desktop/201.png</iconset>
  </property>
  <widget class="QGroupBox" name="groupBox">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>10</y>
     <width>561</width>
     <height>401</height>
    </rect>
   </property>
   <property name="font">
    <font>
     <pointsize>9</pointsize>
     <weight>50</weight>
     <italic>false</italic>
     <bold>false</bold>
    </font>
   </property>
   <property name="title">
    <string>DexInfo</string>
   </property>
   <widget class="QLabel" name="lab_magic">
    <property name="geometry">
     <rect>
      <x>6</x>
      <y>20</y>
      <width>81</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>Magic标识</string>
    </property>
   </widget>
   <widget class="QLabel" name="lab_checksum">
    <property name="geometry">
     <rect>
      <x>6</x>
      <y>50</y>
      <width>81</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>校验码</string>
    </property>
   </widget>
   <widget class="QLabel" name="lab_dex_file_size">
    <property name="geometry">
     <rect>
      <x>6</x>
      <y>82</y>
      <width>81</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>DEX文件大小</string>
    </property>
   </widget>
   <widget class="QLabel" name="lab_header_size">
    <property name="geometry">
     <rect>
      <x>6</x>
      <y>112</y>
      <width>91</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>文件头长度</string>
    </property>
   </widget>
   <widget class="QLabel" name="lab_endian_tag">
    <property name="geometry">
     <rect>
      <x>6</x>
      <y>144</y>
      <width>71</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>字节序标记</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_link_size">
    <property name="geometry">
     <rect>
      <x>6</x>
      <y>176</y>
      <width>71</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>链接段大小</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_link_off">
    <property name="geometry">
     <rect>
      <x>6</x>
      <y>208</y>
      <width>81</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>链接段基地址</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_map_off">
    <property name="geometry">
     <rect>
      <x>6</x>
      <y>238</y>
      <width>91</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>Map数据基地址</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_string_ids_size">
    <property name="geometry">
     <rect>
      <x>6</x>
      <y>269</y>
      <width>131</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>字符串列表的字符串数</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_string_ids_off">
    <property name="geometry">
     <rect>
      <x>6</x>
      <y>301</y>
      <width>121</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>字符串列表表基地址</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_field_ids_size">
    <property name="geometry">
     <rect>
      <x>287</x>
      <y>114</y>
      <width>111</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>字段列表里字段数</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_proto_ids_size">
    <property name="geometry">
     <rect>
      <x>287</x>
      <y>51</y>
      <width>111</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>原型列表里原型数</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_method_ids_size">
    <property name="geometry">
     <rect>
      <x>287</x>
      <y>177</y>
      <width>111</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>方法列表里方法数</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_field_ids_off">
    <property name="geometry">
     <rect>
      <x>287</x>
      <y>145</y>
      <width>101</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>字段列表基地址</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_method_ids_off">
    <property name="geometry">
     <rect>
      <x>287</x>
      <y>207</y>
      <width>91</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>方法列表基地址</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_data_size">
    <property name="geometry">
     <rect>
      <x>287</x>
      <y>302</y>
      <width>81</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>数据段的大小</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_proto_ids_off">
    <property name="geometry">
     <rect>
      <x>287</x>
      <y>83</y>
      <width>101</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>原型列表基地址</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_type_ids_off">
    <property name="geometry">
     <rect>
      <x>287</x>
      <y>20</y>
      <width>91</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>类型列表基地址</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_class_defs_size">
    <property name="geometry">
     <rect>
      <x>287</x>
      <y>238</y>
      <width>121</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>类定义类表中类的数</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_class_defs_off">
    <property name="geometry">
     <rect>
      <x>287</x>
      <y>271</y>
      <width>91</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>类定义列表基地址</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_type_ids_size">
    <property name="geometry">
     <rect>
      <x>6</x>
      <y>333</y>
      <width>111</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>类型列表中类型数</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_data_off">
    <property name="geometry">
     <rect>
      <x>287</x>
      <y>334</y>
      <width>81</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>数据段基地址</string>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_magic">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>138</x>
      <y>14</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_checksum">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>138</x>
      <y>45</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_file_size">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>138</x>
      <y>76</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_header_size">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>138</x>
      <y>107</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_endian_tag">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>138</x>
      <y>138</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_link_size">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>138</x>
      <y>170</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_link_off">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>138</x>
      <y>201</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_map_off">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>138</x>
      <y>232</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_string_ids_size">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>138</x>
      <y>264</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_string_ids_off">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>138</x>
      <y>296</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_type_ids_size">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>138</x>
      <y>327</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_class_defs_off">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>408</x>
      <y>265</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_proto_ids_off">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>408</x>
      <y>77</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_method_ids_off">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>408</x>
      <y>202</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_field_ids_off">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>408</x>
      <y>139</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_proto_ids_size">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>408</x>
      <y>46</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_field_ids_size">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>408</x>
      <y>108</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_type_ids_off">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>408</x>
      <y>15</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_data_size">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>408</x>
      <y>297</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_class_defs_size">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>408</x>
      <y>233</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_method_ids_size">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>408</x>
      <y>171</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_data_off">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>408</x>
      <y>328</y>
      <width>141</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
   <widget class="QLabel" name="label_sha">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>366</y>
      <width>71</width>
      <height>16</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <weight>75</weight>
      <bold>true</bold>
     </font>
    </property>
    <property name="text">
     <string>SHA-1签名</string>
    </property>
   </widget>
   <widget class="QTextEdit" name="text_sha">
    <property name="enabled">
     <bool>false</bool>
    </property>
    <property name="geometry">
     <rect>
      <x>80</x>
      <y>360</y>
      <width>471</width>
      <height>27</height>
     </rect>
    </property>
    <property name="frameShape">
     <enum>QFrame::Panel</enum>
    </property>
   </widget>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>


================================================
FILE: LICENSE.txt
================================================
                  GNU LESSER GENERAL PUBLIC LICENSE
                       Version 2.1, February 1999

 Copyright (C) 1991, 1999 Free Software Foundation, Inc.
 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

(This is the first released version of the Lesser GPL.  It also counts
 as the successor of the GNU Library Public License, version 2, hence
 the version number 2.1.)

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.

  This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it.  You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.

  When we speak of free software, we are referring to freedom of use,
not price.  Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.

  To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights.  These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.

  For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you.  You must make sure that they, too, receive or can get the source
code.  If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it.  And you must show them these terms so they know their rights.

  We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.

  To protect each distributor, we want to make it very clear that
there is no warranty for the free library.  Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.

  Finally, software patents pose a constant threat to the existence of
any free program.  We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder.  Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.

  Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License.  This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License.  We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.

  When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library.  The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom.  The Lesser General
Public License permits more lax criteria for linking other code with
the library.

  We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License.  It also provides other free software developers Less
of an advantage over competing non-free programs.  These disadvantages
are the reason we use the ordinary General Public License for many
libraries.  However, the Lesser license provides advantages in certain
special circumstances.

  For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard.  To achieve this, non-free programs must be
allowed to use the library.  A more frequent case is that a free
library does the same job as widely used non-free libraries.  In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.

  In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software.  For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.

  Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.

  The precise terms and conditions for copying, distribution and
modification follow.  Pay close attention to the difference between a
"work based on the library" and a "work that uses the library".  The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.

                  GNU LESSER GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".

  A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

  The "Library", below, refers to any such software library or work
which has been distributed under these terms.  A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

  "Source code" for a work means the preferred form of the work for
making modifications to it.  For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.

  Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.

  1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.

  You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.

  2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library.  To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License.  (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.)  Do not make any other change in
these notices.

  Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

  This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

  4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.

  If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

  5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

  However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library".  The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

  When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library.  The
threshold for this to be true is not precisely defined by law.

  If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work.  (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

  Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

  6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

  You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License.  Also, you must do one
of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Use a suitable shared library mechanism for linking with the
    Library.  A suitable mechanism is one that (1) uses at run time a
    copy of the library already present on the user's computer system,
    rather than copying library functions into the executable, and (2)
    will operate properly with a modified version of the library, if
    the user installs one, as long as the modified version is
    interface-compatible with the version that the work was made with.

    c) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    d) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    e) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

  For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it.  However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.

  It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system.  Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

  7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

  8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License.  Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License.  However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.

  9. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

  10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.

  11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all.  For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded.  In such case, this License incorporates the limitation as if
written in the body of this License.

  13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number.  If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation.  If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

  14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission.  For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this.  Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.

                            NO WARRANTY

  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

                     END OF TERMS AND CONDITIONS

           How to Apply These Terms to Your New Libraries

  If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change.  You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).

  To apply these terms, attach the following notices to the library.  It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

    aswan
    Copyright (C) 2019 sec

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
    USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  library `Frob' (a library for tweaking knobs) written by James Random
  Hacker.

  {signature of Ty Coon}, 1 April 1990
  Ty Coon, President of Vice

That's all there is to it!

================================================
FILE: README.md
================================================
# ApkDetecter - APK/IPA 查壳分析工具

ApkDetecter 是一款功能强大的跨平台工具,用于分析 Android (APK) 和 iOS (IPA) 应用程序。它提供了一个图形界面,用于查看应用信息、检查是否加壳,并对敏感数据进行深度扫描。

## ✨ 主要功能

### 📱 Android (APK) 分析
- **基本信息**:应用名称、包名、版本号/版本名、最小/目标 SDK 版本、是否加固。
- **组件列表**:列出 Activity、Service、Receiver 和 Provider。
- **权限分析**:详细列出应用申请的所有权限。
- **安全检查**:检测应用签名状态、是否可调试 (Debuggable) 等。

<img src="Resources/images/basic_info.png" width="820" alt="APK界面" />

### 🍎 iOS (IPA) 分析
- **基本信息**:应用名称、Bundle ID、版本号、最低系统要求、支持的平台。
- **安全检查**:
  - **壳检测 (Cryptid)**:检测二进制文件是否经过加密(AppStore 正版)或已脱壳(破解版/调试版)。
  - **描述文件 (Provisioning Profile)**:解析嵌入的 mobileprovision 文件(Team ID、UUID、过期时间、权限 entitlement 等)。
- **URL Schemes**:提取已注册的 URL Schemes。

<img src="Resources/images/basic_info2.png" width="820" alt="IPA界面" />

### 🔍 深度扫描 (Deep Scan)
对应用程序的二进制代码(Android 的 DEX,iOS 的 Mach-O)进行全面扫描,挖掘潜在风险:
- **URL & IP**:提取硬编码的 URL 链接和 IP 地址。
- **敏感字符串**:检测密钥(AWS, Google 等)、密码以及可疑关键词(如 root, su, vpn 等)。
- **反调试检测**:识别反调试技术(例如 `ptrace`, `sysctl`, `isDebuggerConnected`)。
- **加密库使用**:检测加密库和 API 的调用情况(例如 `AES`, `RSA`, `CommonCrypto`)。

<img src="Resources/images/deepscan.png" width="820" alt="深度分析界面" />

### 🛠 其他特性
- **现代化 GUI**:基于 PyQt5 构建的暗色主题界面,简洁美观。
- **拖拽支持**:只需将 APK 或 IPA 文件拖入窗口即可开始分析。
- **报告导出**:支持将基本分析数据导出为 JSON 格式。
- **深度扫描导出**:支持将深度扫描结果导出为包含分类文本报告的 ZIP 压缩包。

## 🚀 安装指南

### 环境要求
- Python 3.8 或更高版本
- pip (Python 包管理器)

### 安装步骤
1. 克隆项目仓库:
   ```bash
   git clone https://github.com/yourusername/ApkDetecter.git
   cd ApkDetecter
   ```

2. 安装依赖库:
   ```bash
   pip install -r requirements.txt
   ```

   *注意:核心功能依赖于 `androguard` 和 `asn1crypto` 等库。*

## 💻 使用说明

1. **启动程序**:
   ```bash
   python ApkDetecter.py
   ```

2. **加载应用**:
   - **拖拽**:直接将 `.apk` 或 `.ipa` 文件拖放到主窗口中。
   - **菜单**:点击菜单栏的 `File -> Open` 选择文件。

3. **查看基本信息**:
   - 加载完成后,主界面会立即显示应用图标、版本信息和安全状态概览。

4. **执行深度扫描**:
   - 点击工具栏上的 **Deep Scan** 按钮(芯片图标)。
   - 等待扫描完成(界面会有进度条覆盖层提示)。
   - 扫描结束后,会在弹出的对话框中分类展示结果(URLs, IPs, Strings, Anti-Debug, Crypto)。

5. **导出结果**:
   - **基本报告**:点击工具栏的 **Export** 按钮,将应用元数据保存为 JSON 文件。
   - **深度扫描报告**:在 Deep Scan 结果对话框中,点击左下角的 **Export Results** 按钮,将所有扫描结果打包导出为 ZIP 文件。

## 📦 构建指南

### 前置要求
- 安装 Python 3.8+
- 安装 `pip`

### macOS 构建
1. 在项目目录中打开终端。
2. 安装依赖:
   ```bash
   pip install -r requirements.txt
   pip install pyinstaller
   ```
3. 运行构建命令:
   ```bash
    build_mac.sh
   ```
4. 应用程序 `ApkDetecter.app` 将位于 `dist` 文件夹中。

### Windows 构建
1. 在项目目录中打开命令提示符 (Command Prompt) 或 PowerShell。
2. 安装依赖:
   ```bash
   pip install -r requirements.txt
   pip install pyinstaller
   ```
3. 运行构建脚本:
   ```cmd
   build_windows.bat
   ```

4. 可执行文件 `ApkDetecter.exe` 将位于 `dist\ApkDetecter` 文件夹中。

## 📂 项目结构

- `Core/`: 核心分析逻辑 (`ApkAnalyzer.py`, `IpaAnalyzer.py`, `DeepScanner.py`)。
- `GUI/`: 用户界面组件 (`MainForm.py`, `AppInfoWidget.py`)。
- `Resources/`: 图标和资源文件。
- `libs/`: 包含的第三方依赖库(androguard)。



================================================
FILE: Resources/signatures.json
================================================
{
  "signatures": [
    {
      "name": "360加固 (Qihoo 360)",
      "rules": [
        { "type": "file", "pattern": "libjiagu.so" },
        { "type": "file", "pattern": "libprotectClass.so" },
        { "type": "file", "pattern": ".appkey", "match": "endswith" }
      ]
    },
    {
      "name": "腾讯御安全 (Tencent Legu)",
      "rules": [
        { "type": "file", "pattern": "libshell.so" },
        { "type": "file", "pattern": "libtup.so" },
        { "type": "file", "pattern": "mix.dex" },
        { "type": "file", "pattern": "libshella-", "match": "startswith" }
      ]
    },
    {
      "name": "梆梆加固 (Bangcle)",
      "rules": [
        { "type": "file", "pattern": "libsecexe.so" },
        { "type": "file", "pattern": "libsecmain.so" },
        { "type": "file", "pattern": "libSecShell.so" },
        { "type": "file", "pattern": "libDexHelper.so" },
        { "type": "file", "pattern": "libbangcle.so" }
      ]
    },
    {
      "name": "爱加密 (Ijiami)",
      "rules": [
        { "type": "file", "pattern": "libexec.so" },
        { "type": "file", "pattern": "ijiami.dat" },
        { "type": "file", "pattern": "libexecmain.so" },
        { "type": "file", "pattern": "ijiami.ajm" }
      ]
    },
    {
      "name": "阿里加固 (Alibaba)",
      "rules": [
        { "type": "file", "pattern": "libmobisec.so" },
        { "type": "file", "pattern": "libaliupdates.so" },
        { "type": "file", "pattern": "aliprotect.dat" },
        { "type": "file", "pattern": "libsgmain.so" },
        { "type": "file", "pattern": "libsgsecuritybody.so" }
      ]
    },
    {
      "name": "百度加固 (Baidu)",
      "rules": [
        { "type": "file", "pattern": "libbaiduprotect.so" },
        { "type": "file", "pattern": "baiduprotect.jar" }
      ]
    },
    {
      "name": "娜迦加固 (Naga)",
      "rules": [
        { "type": "file", "pattern": "libddog.so" },
        { "type": "file", "pattern": "libchaosvmp.so" },
        { "type": "file", "pattern": "libfdog.so" }
      ]
    },
    {
      "name": "网秦加固 (NetQin)",
      "rules": [
        { "type": "file", "pattern": "libnqshield.so" }
      ]
    },
    {
      "name": "通付盾加固 (PayEgis)",
      "rules": [
        { "type": "file", "pattern": "libNSaferOnly.so" },
        { "type": "file", "pattern": "libegis.so" }
      ]
    },
    {
      "name": "几维安全 (Kiwi)",
      "rules": [
        { "type": "file", "pattern": "libkcodemon.so" },
        { "type": "file", "pattern": "libkwscmm.so" },
        { "type": "file", "pattern": "libkwscr.so" }
      ]
    },
    {
      "name": "顶象加固 (DingXiang)",
      "rules": [
        { "type": "file", "pattern": "libdx-risk.so" },
        { "type": "file", "pattern": "libx3g.so" }
      ]
    },
    {
      "name": "网易易盾 (NetEase)",
      "rules": [
        { "type": "file", "pattern": "libnesec.so" }
      ]
    },
    {
      "name": "APKProtect",
      "rules": [
        { "type": "file", "pattern": "libAPKProtect.so" },
        { "type": "combined", "conditions": [
            { "type": "file", "pattern": "key.dat" },
            { "type": "path", "pattern": "apkprotect.com", "match": "contains" }
          ]
        }
      ]
    },
    {
      "name": "U8SDK",
      "rules": [
        { "type": "file", "pattern": "libu8.so" }
      ]
    },
    {
        "name": "Medusah (Pangu)",
        "rules": [
            { "type": "file", "pattern": "libmd.so" }
        ]
    }
  ]
}

================================================
FILE: __init__.py
================================================
__author__ = 'Andy'


================================================
FILE: build_mac.sh
================================================
#!/bin/bash

echo "Detected macOS system build request."
SPEC_FILE="ApkDetecter.spec"

if [ ! -f "$SPEC_FILE" ]; then
    echo "Error: $SPEC_FILE not found."
    exit 1
fi

echo "Starting build with $SPEC_FILE..."

# Clean previous build/dist
if [ -d "build" ]; then
    echo "Cleaning build directory..."
    rm -rf build
fi

if [ -d "dist" ]; then
    echo "Cleaning dist directory..."
    rm -rf dist
fi

# Run PyInstaller
echo "Running PyInstaller..."
pyinstaller "$SPEC_FILE" --clean --noconfirm

if [ $? -eq 0 ]; then
    echo ""
    echo "Build successful!"
    echo "App bundle is in dist/ApkDetecter.app"
else
    echo ""
    echo "Build failed."
    exit 1
fi


================================================
FILE: build_windows.bat
================================================
@echo off
echo Building ApkDetecter for Windows...
pip install -r requirements.txt
pip install pyinstaller Pillow

echo Cleaning up previous builds...
if exist build rmdir /s /q build
if exist dist rmdir /s /q dist

echo Running PyInstaller...
pyinstaller --noconsole --onefile --clean --name "ApkDetecter" --icon "Resources/logo.png" --add-data "Resources;Resources" --add-data "libs/androguard/core/resources/public.xml;androguard/core/resources" --add-data "libs/androguard/core/api_specific_resources;androguard/core/api_specific_resources" --paths "." --paths "libs" --hidden-import GUI --hidden-import GUI.MainForm --hidden-import GUI.AppInfoWidget --hidden-import Core --hidden-import Core.ApkAnalyzer --hidden-import Core.DeepScanner --hidden-import Core.IpaAnalyzer ApkDetecter.py

echo Build complete!
echo The executable is located in dist\ApkDetecter.exe
pause


================================================
FILE: core/ApkAnalyzer.py
================================================

import os
import hashlib
import sys
import zipfile
import re
import logging
from datetime import datetime

# Import existing helpers
try:
    from CheckProtect import CheckProtect
except ImportError:
    current_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    if current_dir not in sys.path:
        sys.path.insert(0, current_dir)
    from CheckProtect import CheckProtect

from androguard.core.apk import APK

# Try to import loguru to check if it's available in the environment
try:
    from loguru import logger as loguru_logger
    HAS_LOGURU = True
except ImportError:
    HAS_LOGURU = False

class ApkAnalyzer:
    def __init__(self, file_path):
        self.file_path = file_path
        self.apk = None
        self.info = {}
        self.cert_info = {}
        self.protect_info = ""
        self.icon_data = None
        self.error = None
        self.progress_callback = None
        self.loguru_sink_id = None
        
        # Capture Androguard logs
        self.log_buffer = []
        self._setup_logging()

    def _setup_logging(self):
        # 1. Setup Standard Logging Hook
        class CallbackHandler(logging.Handler):
            def __init__(self, callback):
                super().__init__()
                self.callback = callback
                self.setFormatter(logging.Formatter('%(asctime)s | %(levelname)-8s | %(name)s:%(funcName)s:%(lineno)s - %(message)s'))

            def emit(self, record):
                msg = self.format(record)
                if self.callback:
                    self.callback(msg)

        self.log_handler = CallbackHandler(self._log_callback)
        
        # Hook into multiple potential loggers
        loggers_to_hook = ['androguard', 'androguard.core.axml', 'androguard.core.apk']
        for name in loggers_to_hook:
            logger = logging.getLogger(name)
            logger.setLevel(logging.DEBUG)
            logger.addHandler(self.log_handler)

        # 2. Setup Loguru Hook (if available)
        # Many newer Androguard versions use loguru exclusively
        if HAS_LOGURU:
            # We add a sink that calls our callback
            # format matches the user's example style
            self.loguru_sink_id = loguru_logger.add(
                self._loguru_callback, 
                level="DEBUG", 
                format="{time:YYYY-MM-DD HH:mm:ss.SSS} | {level: <8} | {name}:{function}:{line} - {message}"
            )

    def _log_callback(self, msg):
        # Heuristic: Increment progress for every log message during parsing phase
        if hasattr(self, '_parsing_progress_min') and hasattr(self, '_parsing_progress_max'):
            self._parsing_log_count += 1
            # Logarithmic-ish scale to prevent hitting max too early
            # Assume ~50 log messages for a typical APK parse
            increment = min(self._parsing_log_count * 0.5, (self._parsing_progress_max - self._parsing_progress_min))
            current = int(self._parsing_progress_min + increment)
            if current > self._parsing_progress_max:
                current = self._parsing_progress_max
            
            if self.progress_callback:
                self.progress_callback(current, msg)
        else:
            if self.progress_callback:
                self.progress_callback(-1, msg)

    def _loguru_callback(self, msg):
        # loguru 'msg' is a string already formatted
        if self.progress_callback:
            # Reuse logic
            self._log_callback(msg.strip())

    def set_progress_callback(self, callback):
        self.progress_callback = callback

    def _update_progress(self, value, message=""):
        if self.progress_callback:
            self.progress_callback(value, message)

    def _calculate_md5_chunked(self, path):
        hash_md5 = hashlib.md5()
        file_size = os.path.getsize(path)
        read_size = 0
        chunk_size = 8192  # 8KB chunks
        
        with open(path, "rb") as f:
            while True:
                chunk = f.read(chunk_size)
                if not chunk:
                    break
                hash_md5.update(chunk)
                read_size += len(chunk)
                
                # Progress 0-10%
                percent = int((read_size / file_size) * 10)
                self._update_progress(percent, f"Calculating MD5... ({int((read_size/file_size)*100)}%)")
        
        return hash_md5.hexdigest().upper()

    def analyze(self):
        if not os.path.exists(self.file_path):
            self.error = "File not found"
            return False

        try:
            self._update_progress(0, "Calculating MD5...")
            # File Stats
            stat = os.stat(self.file_path)
            self.info['file_size'] = stat.st_size
            
            # Chunked MD5
            self.info['md5'] = self._calculate_md5_chunked(self.file_path)

            self._update_progress(15, "Parsing APK Manifest (This may take a while)...")
            
            # Define a helper to simulate progress during the blocking APK() call via log hooks
            # We map log events to progress range 15% -> 40%
            self._parsing_progress_min = 15
            self._parsing_progress_max = 40
            self._parsing_log_count = 0
            
            # Androguard Analysis (APK only, no DEX)
            self.apk = APK(self.file_path)
            
            # Basic Info
            self.info['package_name'] = self.apk.get_package()
            self.info['app_name'] = self.apk.get_app_name()
            self.info['version_name'] = self.apk.get_androidversion_name()
            self.info['version_code'] = self.apk.get_androidversion_code()
            self.info['min_sdk'] = self.apk.get_min_sdk_version()
            self.info['target_sdk'] = self.apk.get_target_sdk_version()
            
            self._update_progress(45, "Extracting Icon...")
            # Icon Extraction Strategy
            # 1. Try get_app_icon()
            # 2. If it returns None or XML, try to search for high-res PNGs in standard locations
            
            try:
                icon_path = self.apk.get_app_icon()
                logging.getLogger('androguard').info(f"Original icon path: {icon_path}")
                if HAS_LOGURU: loguru_logger.info(f"Original icon path: {icon_path}")
                
                # Check if icon is XML (Adaptive Icon) or None
                is_valid_icon = False
                if icon_path and not icon_path.endswith('.xml'):
                    try:
                        self.icon_data = self.apk.get_file(icon_path)
                        is_valid_icon = True
                    except:
                        pass
                
                if not is_valid_icon:
                    msg = "Attempting fallback icon search..."
                    logging.getLogger('androguard').info(msg)
                    if HAS_LOGURU: loguru_logger.info(msg)
                    
                    # Fallback Strategy: Search for PNG icons
                    files = self.apk.get_files()
                    
                    # Priority list for densities
                    densities = ['xxxhdpi', 'xxhdpi', 'xhdpi', 'hdpi', 'mdpi']
                    
                    # Keywords to look for
                    icon_keywords = ['ic_launcher', 'icon', 'ic_app', 'launcher']
                    if icon_path:
                        # Try to use the basename of the reported icon path (even if xml)
                        # e.g. res/mipmap-anydpi-v26/ic_launcher.xml -> ic_launcher
                        basename = os.path.splitext(os.path.basename(icon_path))[0]
                        icon_keywords.insert(0, basename)
                        # Sometimes xml is ic_launcher_round, but png is ic_launcher
                        if '_round' in basename:
                            icon_keywords.insert(1, basename.replace('_round', ''))
                    
                    best_icon = None
                    
                    # Strategy A: Strict density + keyword match
                    for density in densities:
                        for keyword in icon_keywords:
                            pattern = re.compile(f".*res/.*{density}.*/.*{keyword}.*\.png$", re.IGNORECASE)
                            for f in files:
                                if pattern.match(f):
                                    best_icon = f
                                    break
                            if best_icon: break
                        if best_icon: break
                    
                    # Strategy B: Loose match in res/ (any density, strict keyword)
                    if not best_icon:
                        for keyword in icon_keywords:
                            for f in files:
                                if f.endswith(f"/{keyword}.png"):
                                    best_icon = f
                                    break
                            if best_icon: break

                    # Strategy C: Desperation - ANY png with 'launcher' or 'icon' in name
                    if not best_icon:
                        for f in files:
                            if f.endswith('.png') and ('launcher' in f or 'icon' in f) and 'notification' not in f:
                                best_icon = f
                                break

                    # Strategy D: The "Big Gun" - Find the largest PNGs in the APK (heuristic)
                    if not best_icon:
                        msg = "Strategy D: Searching by file size..."
                        logging.getLogger('androguard').info(msg)
                        if HAS_LOGURU: loguru_logger.info(msg)
                        
                        png_files = []
                        with zipfile.ZipFile(self.file_path, 'r') as z:
                            for info in z.infolist():
                                if info.filename.endswith('.png') and not info.filename.endswith('.9.png'):
                                    if 'assets/' not in info.filename:
                                        png_files.append(info)
                        
                        # Sort by size descending
                        png_files.sort(key=lambda x: x.file_size, reverse=True)
                        
                        if png_files:
                            best_icon = png_files[0].filename
                            msg = f"Strategy D picked largest PNG: {best_icon} ({png_files[0].file_size} bytes)"
                            logging.getLogger('androguard').info(msg)
                            if HAS_LOGURU: loguru_logger.info(msg)

                    if best_icon:
                        msg = f"Fallback icon found: {best_icon}"
                        logging.getLogger('androguard').info(msg)
                        if HAS_LOGURU: loguru_logger.info(msg)
                        self.icon_data = self.apk.get_file(best_icon)
                    else:
                        msg = "No fallback icon found."
                        logging.getLogger('androguard').warning(msg)
                        if HAS_LOGURU: loguru_logger.warning(msg)
                    
            except Exception as e:
                msg = f"Error getting icon: {e}"
                logging.getLogger('androguard').error(msg)
                if HAS_LOGURU: loguru_logger.error(msg)

            self._update_progress(60, "Analyzing Certificate...")
            # Cert Info (Fast Way)
            try:
                certs = self.apk.get_certificates()
                if certs:
                    cert = certs[0]
                    self.cert_info = {
                        'serial': hex(cert.serial_number)[2:].upper(),
                        'issuer': cert.issuer.human_friendly,
                        'subject': cert.subject.human_friendly,
                        'sha1': cert.sha1_fingerprint.replace(" ", ":"),
                        'sha256': cert.sha256_fingerprint.replace(" ", ":")
                    }
            except Exception as e:
                msg = f"Error getting cert info: {e}"
                logging.getLogger('androguard').error(msg)
                if HAS_LOGURU: loguru_logger.error(msg)

            self._update_progress(80, "Checking Protection...")
            # Protection
            try:
                cp = CheckProtect(self.apk)
                self.protect_info = cp.check_protectflag()
            except Exception as e:
                self.protect_info = f"Check failed: {e}"

            # Components
            self.info['activities'] = self.apk.get_activities()
            self.info['services'] = self.apk.get_services()
            self.info['receivers'] = self.apk.get_receivers()
            self.info['providers'] = self.apk.get_providers()
            self.info['permissions'] = self.apk.get_permissions()

            self._update_progress(100, "Done")

        except Exception as e:
            self.error = f"Analysis failed: {str(e)}"
            import traceback
            traceback.print_exc()
            return False
        finally:
             # Clean up standard logger
             loggers_to_hook = ['androguard', 'androguard.core.axml', 'androguard.core.apk']
             for name in loggers_to_hook:
                 if hasattr(self, 'log_handler'):
                     logging.getLogger(name).removeHandler(self.log_handler)
             
             # Clean up loguru
             if HAS_LOGURU and self.loguru_sink_id is not None:
                 try:
                     loguru_logger.remove(self.loguru_sink_id)
                 except: pass
        
        return True

    def get_basic_info(self):
        return {
            'name': self.info.get('app_name'),
            'package': self.info.get('package_name'),
            'version': f"{self.info.get('version_name')} ({self.info.get('version_code')})",
            'min_sdk': self.info.get('min_sdk'),
            'target_sdk': self.info.get('target_sdk'),
            'size': self._format_size(self.info.get('file_size', 0)),
            'md5': self.info.get('md5'),
            'protect': self.protect_info
        }

    def _format_size(self, size):
        for unit in ['B', 'KB', 'MB', 'GB']:
            if size < 1024:
                return f"{size:.2f} {unit}"
            size /= 1024
        return f"{size:.2f} TB"


================================================
FILE: core/DeepScanner.py
================================================
# -*- coding: utf-8 -*-
import re
import logging
import zipfile
import string

try:
    from androguard.core.dex import DEX
except ImportError:
    DEX = None

class DeepScanner:
    def __init__(self, apk_obj=None, ipa_path=None, binary_path_in_zip=None):
        self.apk = apk_obj
        self.ipa_path = ipa_path
        self.binary_path_in_zip = binary_path_in_zip
        self.is_ipa = (ipa_path is not None)
        
        self.results = {
            "urls": [],
            "ips": [],
            "sensitive_strings": [],
            "anti_debug": [],
            "crypto": []
        }
        
        # Regex Patterns
        self.patterns = {
            "url": re.compile(r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'),
            "ip": re.compile(r'\b(?:\d{1,3}\.){3}\d{1,3}\b'),
            "ak_sk": re.compile(r'(?i)(access_key|secret_key|api_key|app_secret|app_id).*?["\']([a-zA-Z0-9]{16,})["\']'),
        }

        # Keywords for string search
        self.suspicious_keywords = [
            "root", "su", "superuser", "magisk", "xposed", "frida", 
            "substrate", "hook", "proxy", "vpn", "emulator", "jailbreak", "cydia"
        ]
        
        # Android Patterns
        self.android_anti_debug = [
            "android/os/Debug;->isDebuggerConnected",
            "android/os/Debug;->waitForDebugger",
            "java/lang/System;->exit",
            "ptrace"
        ]
        
        self.android_crypto = [
            "javax/crypto/Cipher",
            "javax/crypto/spec/SecretKeySpec",
            "java/security/MessageDigest"
        ]

        # iOS Patterns
        self.ios_anti_debug = [
            "ptrace",
            "sysctl",
            "getppid", 
            "isatty",
            "ioctl",
            "svc 0x80", # SVC call
            "task_for_pid"
        ]

        self.ios_crypto = [
            "CCCrypt", 
            "CCSha256", 
            "CCSha1",
            "CCMd5",
            "SecItemAdd",
            "SecItemCopyMatching", 
            "SecKeyEncrypt",
            "SecKeyDecrypt"
        ]

    def scan(self, progress_callback=None):
        if self.is_ipa:
            return self._scan_ipa(progress_callback)
        else:
            return self._scan_apk(progress_callback)

    def _scan_apk(self, progress_callback):
        if not self.apk:
            return self.results
            
        dex_files = []
        try:
            # Get all DEX files
            for f in self.apk.get_files():
                if f.endswith('.dex'):
                    dex_files.append(f)
        except:
            pass

        total_dex = len(dex_files)
        if total_dex == 0:
            return self.results

        for idx, dex_path in enumerate(dex_files):
            if progress_callback:
                progress_callback(int((idx / total_dex) * 100), f"Scanning {dex_path}...")

            try:
                dex_data = self.apk.get_file(dex_path)
                if DEX:
                    d = DEX(dex_data)
                    # 1. String Analysis
                    for s in d.get_strings():
                         self._analyze_string(s)
                            
                    # 2. Method/API Analysis
                    all_strings = set(d.get_strings())
                    self._analyze_apis(all_strings)
                else:
                    # Fallback if androguard dex not available
                    strings = self._extract_strings(dex_data)
                    for s in strings:
                        self._analyze_string(s)

            except Exception as e:
                logging.error(f"Error scanning {dex_path}: {e}")

        self._deduplicate()
        return self.results

    def _scan_ipa(self, progress_callback):
        if not self.ipa_path:
            return self.results

        try:
            with zipfile.ZipFile(self.ipa_path, 'r') as z:
                # Use passed binary path if available
                # However, the binary_path might be in a different encoding than what zipfile expects
                # if the zip file has encoding issues (CP437 vs UTF-8).
                # We need to robustly find the file in the zip.
                
                target_binary_info = None
                
                # Helper to normalize names for comparison
                def normalize(name):
                    return name.replace('\\', '/').rstrip('/')

                # 1. Try to find the passed binary path directly
                if self.binary_path_in_zip:
                    try:
                        target_binary_info = z.getinfo(self.binary_path_in_zip)
                    except KeyError:
                        # Failed direct lookup, might be encoding issue or slight path mismatch
                        pass
                
                # 2. If not found, try to search for it using robust encoding check
                if not target_binary_info:
                    logging.info(f"Direct lookup for {self.binary_path_in_zip} failed. Scanning all files in zip...")
                    
                    # Candidate files list for debugging/fallback
                    candidates = []
                    
                    # We look for Payload/*.app/BinaryName
                    for info in z.infolist():
                        # Fix encoding for the name in the zip
                        try:
                            real_name = info.filename.encode('cp437').decode('utf-8')
                        except:
                            try:
                                real_name = info.filename.encode('cp437').decode('gbk')
                            except:
                                real_name = info.filename
                        
                        # Store normalized name for logic
                        norm_real = normalize(real_name)
                        
                        # Debug log for potentially matching files
                        if '.app/' in norm_real and not norm_real.endswith('/'):
                             candidates.append((norm_real, info))

                        # Check if this looks like our binary
                        if self.binary_path_in_zip:
                            # Compare normalized paths
                            # Also try simple filename match if full path fails (sometimes parent dirs differ slightly)
                            target_norm = normalize(self.binary_path_in_zip)
                            target_basename = target_norm.split('/')[-1]
                            real_basename = norm_real.split('/')[-1]

                            if norm_real == target_norm:
                                target_binary_info = info
                                logging.info(f"Found binary via normalized path match: {real_name}")
                                break
                            elif real_basename == target_basename and '.app/' in norm_real:
                                # Strong candidate if basename matches and it's inside an app bundle
                                # But we should be careful not to pick a resource file with same name (unlikely for binary)
                                # Let's store it as a fallback if exact match fails
                                if not target_binary_info:
                                     target_binary_info = info
                                     logging.info(f"Found binary via basename match: {real_name}")
                        else:
                            # Fallback guessing logic
                            # Look for file with same name as .app folder
                            parts = norm_real.split('/')
                            for i, part in enumerate(parts):
                                if part.endswith('.app'):
                                    app_name = part.replace('.app', '')
                                    if i + 1 < len(parts) and parts[i+1] == app_name:
                                         target_binary_info = info
                                         break

                    # If still not found, try the largest file in the .app folder
                    if not target_binary_info and candidates:
                        logging.info("Binary not found via name match. Trying largest file in .app bundle...")
                        largest_file = None
                        max_size = 0
                        for name, info in candidates:
                            # Ignore obvious non-binary files
                            if name.lower().endswith(('.png', '.plist', '.nib', '.storyboardc', '.car', '.mobileprovision', '.cer')):
                                continue
                            if info.file_size > max_size:
                                max_size = info.file_size
                                largest_file = info
                        
                        if largest_file:
                            target_binary_info = largest_file
                            logging.info(f"Selected largest file as binary candidate: {largest_file.filename}")

                if target_binary_info:
                    if progress_callback:
                        progress_callback(10, f"Scanning binary {target_binary_info.filename}...")
                    
                    with z.open(target_binary_info) as f:
                        data = f.read()
                        # Extract strings from binary
                        strings_gen = self._extract_strings(data)
                        
                        # Convert generator to list to get length
                        string_list = list(strings_gen)
                        total = len(string_list)
                        
                        for i, s in enumerate(string_list):
                            if i % 5000 == 0 and progress_callback and total > 0:
                                progress_callback(int((i / total) * 90), "Analyzing strings...")
                            self._analyze_string(s)
                        
                        # Simple API check via strings presence
                        self._analyze_apis(set(string_list))
                            
                else:
                    logging.error(f"Binary {self.binary_path_in_zip} not found in zip (Encoding issue?)")

        except Exception as e:
            logging.error(f"Error scanning IPA: {e}")

        self._deduplicate()
        return self.results

    def _extract_strings(self, data, min_length=4):
        """
        Extract printable strings from binary data
        """
        result = ""
        for b in data:
            c = chr(b)
            if c in string.printable:
                result += c
            else:
                if len(result) >= min_length:
                    yield result
                result = ""
        if len(result) >= min_length:
            yield result

    def _analyze_string(self, s):
        # Check URL
        if self.patterns['url'].match(s):
            self.results['urls'].append(s)
        # Check IP
        elif self.patterns['ip'].match(s) and not s.startswith("0."):
            self.results['ips'].append(s)
        
        # Check Keywords
        s_lower = s.lower()
        for kw in self.suspicious_keywords:
            if kw in s_lower:
                # Store only the string content, not the keyword prefix
                # We can append the keyword as metadata if needed, but user requested clean string
                self.results['sensitive_strings'].append(s)
                break # Avoid adding same string multiple times if it matches multiple keywords

    def _analyze_apis(self, all_strings):
        if self.is_ipa:
            target_anti_debug = self.ios_anti_debug
            target_crypto = self.ios_crypto
        else:
            target_anti_debug = self.android_anti_debug
            target_crypto = self.android_crypto

        for api in target_anti_debug:
            # Loose check
            parts = api.split('->')
            term = parts[-1] if len(parts) > 1 else api
            if term in all_strings:
                 self.results['anti_debug'].append(api)
        
        for api in target_crypto:
             parts = api.split('/')
             term = parts[-1]
             if term in all_strings:
                 self.results['crypto'].append(api)

    def _deduplicate(self):
        for k in self.results:
            self.results[k] = list(set(self.results[k]))



================================================
FILE: core/IpaAnalyzer.py
================================================

import zipfile
import plistlib
import os
import hashlib
import sys
import struct
from datetime import datetime

# Ensure libs are in path
current_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
libs_dir = os.path.join(current_dir, 'libs')
if libs_dir not in sys.path:
    sys.path.insert(0, libs_dir)

from asn1crypto import cms

class IpaAnalyzer:
    def __init__(self, file_path):
        self.file_path = file_path
        self.info = {}
        self.provision = {}
        self.icon_data = None
        self.error = None
        self.progress_callback = None
        self.is_encrypted = False
        self.binary_path = None # Store binary path for deep scan

    def set_progress_callback(self, callback):
        self.progress_callback = callback

    def _update_progress(self, value, message=""):
        if self.progress_callback:
            self.progress_callback(value, message)

    def _find_zip_entry(self, z, folder, name):
        """
        Robustly find a file in the zip, handling encoding mismatches.
        folder: The folder path in the zip (likely mojibake/cp437)
        name: The target filename (could be UTF-8 from Info.plist)
        """
        # 1. Try direct join (Success if name was also derived from zip listing)
        path = os.path.join(folder, name).replace('\\', '/')
        try:
            return z.getinfo(path)
        except KeyError:
            pass

        # 2. Iterative search in the specific folder
        # We know 'folder' exists in the zip (it was found via namelist)
        # We need to find 'name' inside 'folder', but 'name' might need encoding conversion
        
        # Normalize folder to ensure it ends with /
        if not folder.endswith('/'):
            folder += '/'
            
        # List all files in this folder
        candidates = []
        for n in z.namelist():
            if n.startswith(folder):
                # Get the filename part
                fname = n[len(folder):]
                # Skip subdirectories
                if '/' in fname.rstrip('/'): 
                    continue
                if not fname: 
                    continue
                    
                candidates.append(n)
        
        # Try to match 'name' against candidates
        # Convert 'name' (UTF-8) to potential CP437 mojibake representation?
        # Or convert candidates (CP437) to UTF-8/GBK and compare with 'name'?
        
        for candidate in candidates:
            fname = candidate[len(folder):]
            
            # Try 1: Is it a direct match? (Already checked by getinfo, but logic here covers scanning)
            if fname == name:
                return z.getinfo(candidate)
                
            # Try 2: Decode candidate from cp437 -> gbk/utf-8 and compare with name
            try:
                decoded = fname.encode('cp437').decode('gbk')
                if decoded == name:
                    return z.getinfo(candidate)
            except:
                pass
                
            try:
                decoded = fname.encode('cp437').decode('utf-8')
                if decoded == name:
                    return z.getinfo(candidate)
            except:
                pass

        # 3. Last resort: Return the largest file in the folder (heuristics for main binary)
        best_candidate = None
        max_size = 0
        for cand_path in candidates:
             # Skip known non-binary extensions
             lower_name = cand_path.lower()
             if lower_name.endswith(('.png', '.plist', '.nib', '.car', '.mobileprovision', '.xml', '.json', '.wav', '.mp3')):
                 continue
             
             info = z.getinfo(cand_path)
             if info.file_size > max_size:
                 max_size = info.file_size
                 best_candidate = info
                 
        return best_candidate

    def _calculate_md5_chunked(self, path):
        hash_md5 = hashlib.md5()
        file_size = os.path.getsize(path)
        read_size = 0
        chunk_size = 8192  # 8KB chunks
        
        with open(path, "rb") as f:
            while True:
                chunk = f.read(chunk_size)
                if not chunk:
                    break
                hash_md5.update(chunk)
                read_size += len(chunk)
                
                # Progress 0-10%
                percent = int((read_size / file_size) * 10)
                self._update_progress(percent, f"Calculating MD5... ({int((read_size/file_size)*100)}%)")
        
        return hash_md5.hexdigest().upper()

    def analyze(self):
        if not os.path.exists(self.file_path):
            self.error = "File not found"
            return False

        try:
            self._update_progress(0, "Calculating MD5...")
            # File Stats
            stat = os.stat(self.file_path)
            self.info['file_size'] = stat.st_size
            
            # Chunked MD5
            self.info['md5'] = self._calculate_md5_chunked(self.file_path)

            self._update_progress(10, "Reading IPA Structure...")
            with zipfile.ZipFile(self.file_path, 'r') as z:
                # Find Payload/*.app
                app_folder = None
                app_binary_name = None
                app_binary_path = None
                
                namelist = z.namelist()
                total_files = len(namelist)
                
                # Progress 10-30% for scanning files
                for i, name in enumerate(namelist):
                    if i % 100 == 0:
                        percent = 10 + int((i / total_files) * 20)
                        self._update_progress(percent, "Scanning IPA structure...")
                        
                    if name.startswith('Payload/') and name.endswith('.app/'):
                        app_folder = name
                        # Usually binary name matches .app folder name
                        # Payload/Name.app/ -> Name
                        app_binary_name = os.path.splitext(os.path.basename(name.rstrip('/')))[0]
                        # Don't break immediately, scan all to ensure correct progress? 
                        # Actually breaking is fine for performance, just jump progress.
                        break
                
                if not app_folder:
                    self.error = "Invalid IPA: No .app folder found"
                    return False
                
                self._update_progress(30, "Found App Bundle: " + app_folder)
                
                if app_binary_name:
                    # app_binary_name is derived from app_folder basename (mojibake)
                    # So this simple join usually works if binary name matches folder name
                    # But we use the robust finder anyway to be safe
                    # app_binary_path = os.path.join(app_folder, app_binary_name).replace('\\', '/')
                    # self.binary_path = app_binary_path
                    entry = self._find_zip_entry(z, app_folder, app_binary_name)
                    if entry:
                        self.binary_path = entry.filename

                self._update_progress(35, "Parsing Info.plist...")
                # Parse Info.plist
                info_plist_path = os.path.join(app_folder, 'Info.plist').replace('\\', '/')
                try:
                    with z.open(info_plist_path) as f:
                        plist_content = f.read()
                        try:
                            plist_data = plistlib.loads(plist_content)
                        except:
                            pass
                        else:
                            self._parse_info_plist(plist_data)
                except KeyError:
                    self.error = "Info.plist not found"

                # If binary name wasn't guessed correctly, try to use CFBundleExecutable from plist
                if self.info.get('raw_plist') and 'CFBundleExecutable' in self.info['raw_plist']:
                    app_binary_name = self.info['raw_plist']['CFBundleExecutable']
                    # app_binary_name here is UTF-8 (e.g. "网校企业版")
                    # app_folder is Mojibake (e.g. "Payload/网...")
                    # Direct join will fail. Use robust finder.
                    entry = self._find_zip_entry(z, app_folder, app_binary_name)
                    if entry:
                        self.binary_path = entry.filename

                self._update_progress(50, "Checking Cryptid (Encryption)...")
                # Check Encryption (Mach-O cryptid)
                if self.binary_path:
                    try:
                        # Use self.binary_path which is the correct internal zip path
                        with z.open(self.binary_path) as f:
                            # Read header to determine if fat binary or thin
                            header = f.read(4)
                            f.seek(0)
                            if len(header) == 4:
                                self.is_encrypted = self._check_cryptid(f)
                    except KeyError:
                        print(f"Binary file not found in IPA: {self.binary_path}")
                    except Exception as e:
                        print(f"Error checking cryptid: {e}")

                self._update_progress(70, "Parsing Provisioning Profile...")
                # Parse embedded.mobileprovision
                prov_path = os.path.join(app_folder, 'embedded.mobileprovision').replace('\\', '/')
                try:
                    with z.open(prov_path) as f:
                        prov_bytes = f.read()
                        self._parse_provision(prov_bytes)
                except KeyError:
                    pass

                self._update_progress(90, "Extracting Icon...")
                # Extract Icon logic...
                icon_name = None
                if 'CFBundleIcons' in self.info.get('raw_plist', {}):
                    try:
                        icons = self.info['raw_plist']['CFBundleIcons'].get('CFBundlePrimaryIcon', {}).get('CFBundleIconFiles', [])
                        if icons:
                            icon_name = icons[-1] 
                    except: pass
                
                if not icon_name and 'CFBundleIconFiles' in self.info.get('raw_plist', {}):
                     try:
                        icons = self.info['raw_plist']['CFBundleIconFiles']
                        if icons:
                            icon_name = icons[-1]
                     except: pass

                if icon_name:
                    candidates = [
                        os.path.join(app_folder, icon_name).replace('\\', '/'),
                        os.path.join(app_folder, icon_name + '.png').replace('\\', '/'),
                        os.path.join(app_folder, icon_name + '@2x.png').replace('\\', '/'),
                        os.path.join(app_folder, icon_name + '@3x.png').replace('\\', '/')
                    ]
                    for name in z.namelist():
                        if name.startswith(app_folder) and icon_name in name and name.endswith('.png'):
                            candidates.append(name)

                    for path in candidates:
                        try:
                            with z.open(path) as f:
                                self.icon_data = f.read()
                                break
                        except KeyError:
                            continue
            
            self._update_progress(100, "Done")

        except Exception as e:
            self.error = f"Analysis failed: {str(e)}"
            import traceback
            traceback.print_exc()
            return False
        
        return True

    def _check_cryptid(self, f):
        """
        Check LC_ENCRYPTION_INFO or LC_ENCRYPTION_INFO_64 load commands in Mach-O binary.
        Returns True if cryptid != 0 (Encrypted/AppStore), False otherwise.
        Handles Fat Binaries (Universal) by checking all architectures.
        """
        MH_MAGIC = 0xfeedface
        MH_CIGAM = 0xcefaedfe
        MH_MAGIC_64 = 0xfeedfacf
        MH_CIGAM_64 = 0xcffaedfe
        FAT_MAGIC = 0xcafebabe
        FAT_CIGAM = 0xbebafeca
        
        LC_ENCRYPTION_INFO = 0x21
        LC_ENCRYPTION_INFO_64 = 0x2C

        def read_uint32(fh, endian='>'): 
            d = fh.read(4)
            if len(d) < 4: return None
            return struct.unpack(endian + 'I', d)[0]

        magic_bytes = f.read(4)
        f.seek(0)
        
        if len(magic_bytes) < 4: return False
        
        magic = struct.unpack('>I', magic_bytes)[0]
        
        # Determine architectures to check
        archs = [] # (offset, size)
        
        if magic == FAT_MAGIC or magic == FAT_CIGAM:
            # Fat Binary
            endian = '>' # Fat header is always big-endian
            f.seek(4)
            nfat_arch = read_uint32(f, endian)
            
            for i in range(nfat_arch):
                # fat_arch struct: cpu_type, cpu_subtype, offset, size, align
                f.seek(8 + i * 20) # 4+4 header + 20 bytes per arch
                cpu_type = read_uint32(f, endian)
                cpu_subtype = read_uint32(f, endian)
                offset = read_uint32(f, endian)
                size = read_uint32(f, endian)
                archs.append(offset)
        else:
            # Thin Binary
            archs.append(0)
            
        for offset in archs:
            f.seek(offset)
            magic_bytes = f.read(4)
            if len(magic_bytes) < 4: continue
            
            magic = struct.unpack('>I', magic_bytes)[0]
            
            is_64 = False
            endian = '<' # Default little endian for mach-o (ARM)
            
            if magic == MH_MAGIC: pass
            elif magic == MH_CIGAM: endian = '>'
            elif magic == MH_MAGIC_64: is_64 = True
            elif magic == MH_CIGAM_64: 
                is_64 = True
                endian = '>'
            else:
                continue # Unknown magic
                
            # Read mach_header
            # magic(4) + cputype(4) + cpusubtype(4) + filetype(4) + ncmds(4) + sizeofcmds(4) + flags(4) [+ reserved(4) if 64]
            header_size = 28 if not is_64 else 32
            
            f.seek(offset + 16) # Skip to ncmds
            ncmds = read_uint32(f, endian)
            
            # Start of Load Commands
            f.seek(offset + header_size)
            
            for _ in range(ncmds):
                # load_command struct: cmd(4), cmdsize(4)
                cmd_start = f.tell()
                cmd = read_uint32(f, endian)
                cmd_size = read_uint32(f, endian)
                
                if cmd == LC_ENCRYPTION_INFO or cmd == LC_ENCRYPTION_INFO_64:
                    # encryption_info_command: cmd, cmdsize, cryptoff, cryptsize, cryptid
                    # We need cryptid (offset 16 from start of cmd)
                    f.seek(cmd_start + 16)
                    cryptid = read_uint32(f, endian)
                    if cryptid and cryptid > 0:
                        return True # Found encryption!
                
                f.seek(cmd_start + cmd_size)
                
        return False

    def _parse_info_plist(self, plist):
        self.info['raw_plist'] = plist
        self.info['package_name'] = plist.get('CFBundleIdentifier', 'Unknown')
        self.info['app_name'] = plist.get('CFBundleDisplayName', plist.get('CFBundleName', 'Unknown'))
        self.info['version_name'] = plist.get('CFBundleShortVersionString', '')
        self.info['version_code'] = plist.get('CFBundleVersion', '')
        self.info['min_os'] = plist.get('MinimumOSVersion', '')
        self.info['platform'] = plist.get('DTPlatformName', 'ios')
        self.info['supported_platforms'] = plist.get('CFBundleSupportedPlatforms', [])
        self.info['url_schemes'] = []
        
        if 'CFBundleURLTypes' in plist:
            for url_type in plist['CFBundleURLTypes']:
                schemes = url_type.get('CFBundleURLSchemes', [])
                self.info['url_schemes'].extend(schemes)

    def _parse_provision(self, content):
        try:
            content_info = cms.ContentInfo.load(content)
            signed_data = content_info['content']
            encap_content = signed_data['encap_content_info']
            plist_bytes = encap_content['content'].native
            data = plistlib.loads(plist_bytes)
            
            self.provision = {
                'app_id_name': data.get('AppIDName'),
                'team_name': data.get('TeamName'),
                'team_id': data.get('TeamIdentifier', [''])[0],
                'uuid': data.get('UUID'),
                'creation_date': data.get('CreationDate'),
                'expiration_date': data.get('ExpirationDate'),
                'entitlements': data.get('Entitlements', {}),
                'provisioned_devices': data.get('ProvisionedDevices', [])
            }
        except Exception as e:
            print(f"Error parsing mobileprovision: {e}")

    def get_basic_info(self):
        # Determine protection status text
        # If cryptid == 1, it's Encrypted (AppStore build, not cracked) -> "未脱壳"
        # If cryptid == 0, it's Decrypted (Cracked/Debug build) -> "已脱壳"
        protect_status = "未脱壳 (Encrypted)" if self.is_encrypted else "已脱壳 (Decrypted)"
        
        return {
            'name': self.info.get('app_name'),
            'package': self.info.get('package_name'),
            'version': f"{self.info.get('version_name')} ({self.info.get('version_code')})",
            'min_sdk': f"iOS {self.info.get('min_os')}",
            'target_sdk': 'N/A', 
            'size': self._format_size(self.info.get('file_size', 0)),
            'md5': self.info.get('md5'),
            'protect': protect_status
        }
    
    def get_details(self):
        return {
            'url_schemes': self.info.get('url_schemes', []),
            'platform': self.info.get('platform'),
            'supported_platforms': self.info.get('supported_platforms'),
            'provision': self.provision
        }

    def _format_size(self, size):
        for unit in ['B', 'KB', 'MB', 'GB']:
            if size < 1024:
                return f"{size:.2f} {unit}"
            size /= 1024
        return f"{size:.2f} TB"


================================================
FILE: core/__init__.py
================================================


================================================
FILE: libs/androguard/__init__.py
================================================
# The current version of Androguard
# Please use only this variable in any scripts,
# to keep the version number the same everywhere.
__version__ = "4.1.3"


================================================
FILE: libs/androguard/cli/__init__.py
================================================


================================================
FILE: libs/androguard/cli/cli.py
================================================
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""Androguard is a full Python tool to reverse Android Applications."""
import json
import sys

import click
import networkx as nx
from loguru import logger

from androguard.session import Session
import androguard.core.apk
from androguard import util
from androguard.cli.main import (
    androarsc_main,
    androaxml_main,
    androdis_main,
    androdump_main,
    androlyze_main,
    androsign_main,
    androtrace_main,
    export_apps_to_format,
)


@click.group(help=__doc__)
@click.version_option(version=androguard.__version__)
@click.option(
    "--verbose",
    "--debug",
    'verbosity',
    flag_value='verbose',
    help="Print more",
)
def entry_point(verbosity):
    if verbosity is None:
        util.set_log("ERROR")
    else:
        util.set_log("INFO")
    logger.add("androguard.log", retention="10 days")


@entry_point.command()
@click.option(
    '--input',
    '-i',
    'input_',
    type=click.Path(exists=True, file_okay=True, dir_okay=False),
    help='AndroidManifest.xml or APK to parse (legacy option)',
)
@click.option(
    '--output',
    '-o',
    help='filename to save the decoded AndroidManifest.xml to, default stdout',
)
@click.option(
    "--resource",
    "-r",
    help="Resource (any binary XML file) inside the APK to parse instead of AndroidManifest.xml",
)
@click.argument(
    'file_',
    required=False,
    type=click.Path(exists=True, file_okay=True, dir_okay=False),
)
def axml(input_, output, file_, resource):
    """
    Parse the AndroidManifest.xml.

    Parsing is either direct or from a given APK and prints in XML format or
    saves to file.

    This tool can also be used to process any AXML encoded file, for example
    from the layout directory.

    Example:

        >>> androguard axml AndroidManifest.xml
    """
    if file_ is not None and input_ is not None:
        print(
            "Can not give --input and positional argument! "
            "Please use only one of them!"
        )
        sys.exit(1)

    if file_ is None and input_ is None:
        print("Give one file to decode!")
        sys.exit(1)

    if file_ is not None:
        androaxml_main(file_, output, resource)
    elif input_ is not None:
        androaxml_main(input_, output, resource)


@entry_point.command()
@click.option(
    '--input',
    '-i',
    'input_',
    type=click.Path(exists=True),
    help='resources.arsc or APK to parse (legacy option)',
)
@click.argument(
    'file_',
    required=False,
)
@click.option(
    '--output',
    '-o',
    # required=True,  #  not required due to --list-types
    help='filename to save the decoded resources to',
)
@click.option(
    '--package',
    '-p',
    help='Show only resources for the given package name '
    '(default: the first package name found)',
)
@click.option(
    '--locale',
    '-l',
    help='Show only resources for the given locale (default: \'\\x00\\x00\')',
)
@click.option(
    '--type',
    '-t',
    'type_',
    help='Show only resources of the given type (default: public)',
)
@click.option(
    '--id',
    'id_',
    help="Resolve the given ID for the given locale and package. Provide the hex ID!",
)
@click.option(
    '--list-packages',
    is_flag=True,
    default=False,
    help='List all package names and exit',
)
@click.option(
    '--list-locales',
    is_flag=True,
    default=False,
    help='List all package names and exit',
)
@click.option(
    '--list-types',
    is_flag=True,
    default=False,
    help='List all types and exit',
)
def arsc(
    input_,
    file_,
    output,
    package,
    locale,
    type_,
    id_,
    list_packages,
    list_locales,
    list_types,
):
    """
    Decode resources.arsc either directly from a given file or from an APK.

    Example:

        >>> androguard arsc app.apk
    """

    from androguard.core import androconf, apk, axml

    if file_ and input_:
        logger.info(
            "Can not give --input and positional argument! Please use only one of them!"
        )
        sys.exit(1)

    if not input_ and not file_:
        logger.info("Give one file to decode!")
        sys.exit(1)

    if input_:
        fname = input_
    else:
        fname = file_

    ret_type = androconf.is_android(fname)
    if ret_type == "APK":
        a = apk.APK(fname)
        arscobj = a.get_android_resources()
        if not arscobj:
            logger.error("The APK does not contain a resources file!")
            sys.exit(0)
    elif ret_type == "ARSC":
        with open(fname, 'rb') as fp:
            arscobj = axml.ARSCParser(fp.read())
            if not arscobj:
                logger.error("The resources file seems to be invalid!")
                sys.exit(1)
    else:
        logger.error("Unknown file type!")
        sys.exit(1)

    if id_:
        # Strip the @, if any
        if id_[0] == "@":
            id_ = id_[1:]
        try:
            i_id = int(id_, 16)
        except ValueError:
            print(
                "ID '{}' could not be parsed! have you supplied the correct hex ID?".format(
                    id_
                )
            )
            sys.exit(1)

        name = arscobj.get_resource_xml_name(i_id)
        if not name:
            print("Specified resource was not found!")
            sys.exit(1)

        print("@{:08x} resolves to '{}'".format(i_id, name))
        print()

        # All the information is in the config.
        # we simply need to get the actual value of the entry
        for config, entry in arscobj.get_resolved_res_configs(i_id):
            print(
                "{} = '{}'".format(
                    (
                        config.get_qualifier()
                        if not config.is_default()
                        else "<default>"
                    ),
                    entry,
                )
            )

        sys.exit(0)

    if list_packages:
        print("\n".join(arscobj.get_packages_names()))
        sys.exit(0)

    if list_locales:
        for p in arscobj.get_packages_names():
            print("In Package:", p)
            print(
                "\n".join(
                    map(
                        lambda x: (
                            "  \\x00\\x00"
                            if x == "\x00\x00"
                            else "  {}".format(x)
                        ),
                        sorted(arscobj.get_locales(p)),
                    )
                )
            )
        sys.exit(0)

    if list_types:
        for p in arscobj.get_packages_names():
            print("In Package:", p)
            for locale in sorted(arscobj.get_locales(p)):
                print(
                    "  In Locale: {}".format(
                        "\\x00\\x00" if locale == "\x00\x00" else locale
                    )
                )
                print(
                    "\n".join(
                        map(
                            "    {}".format,
                            sorted(arscobj.get_types(p, locale)),
                        )
                    )
                )
        sys.exit(0)

    androarsc_main(
        arscobj, outp=output, package=package, typ=type_, locale=locale
    )


@entry_point.command()
@click.option(
    '--input',
    '-i',
    'input_',
    type=click.Path(exists=True, dir_okay=False, file_okay=True),
    help='APK to parse (legacy option)',
)
@click.argument(
    'file_',
    type=click.Path(exists=True, dir_okay=False, file_okay=True),
    required=False,
)
@click.option(
    '--output',
    '-o',
    required=True,
    help='output directory. If the output folder already exsist, '
    'it will be overwritten!',
)
@click.option(
    '--format',
    '-f',
    'format_',
    help='Additionally write control flow graphs for each method, specify '
    'the format for example png, jpg, raw (write dot file), ...',
    type=click.Choice(['png', 'jpg', 'raw']),
)
@click.option(
    '--jar',
    '-j',
    is_flag=True,
    default=False,
    help='Use DEX2JAR to create a JAR file',
)
@click.option(
    '--limit',
    '-l',
    help='Limit to certain methods only by regex (default: \'.*\')',
)
@click.option(
    '--decompiler',
    '-d',
    help='Use a different decompiler (default: DAD)',
)
def decompile(input_, file_, output, format_, jar, limit, decompiler):
    """
    Decompile an APK and create Control Flow Graphs.

    Example:

        >>> androguard resources.arsc
    """
    from androguard import session

    if file_ and input_:
        print(
            "Can not give --input and positional argument! "
            "Please use only one of them!",
            file=sys.stderr,
        )
        sys.exit(1)

    if not input_ and not file_:
        print("Give one file to decode!", file=sys.stderr)
        sys.exit(1)

    if input_:
        fname = input_
    else:
        fname = file_

    s = session.Session()
    with open(fname, "rb") as fd:
        s.add(fname, fd.read())
    export_apps_to_format(fname, s, output, limit, jar, decompiler, format_)


@entry_point.command()
@click.option(
    '--hash',
    'hash_',
    type=click.Choice(['md5', 'sha1', 'sha256', 'sha512']),
    default='sha1',
    show_default=True,
    help='Fingerprint Hash algorithm',
)
@click.option(
    '--all',
    '-a',
    'print_all_hashes',
    is_flag=True,
    default=False,
    show_default=True,
    help='Print all supported hashes',
)
@click.option(
    '--show',
    '-s',
    is_flag=True,
    default=False,
    show_default=True,
    help='Additionally of printing the fingerprints, show more '
    'certificate information',
)
@click.argument(
    'apk',
    nargs=-1,
    type=click.Path(exists=True, dir_okay=False, file_okay=True),
)
def sign(hash_, print_all_hashes, show, apk):
    """Return the fingerprint(s) of all certificates inside an APK."""
    androsign_main(apk, hash_, print_all_hashes, show)


@entry_point.command()
@click.argument(
    'apks',
    nargs=-1,
    type=click.Path(exists=True, file_okay=True, dir_okay=False),
)
def apkid(apks: list[str]):
    """Prints the packageName/versionCode/versionName per APK as JSON.
    
    :param apks: list of apk filepaths
    """
    from androguard.core.apk import get_apkid

    logger.debug("APKID")

    results = dict()
    for apk in apks:
        results[apk] = get_apkid(apk)
    print(json.dumps(results, indent=2))


@entry_point.command()
@click.option(
    '--session',
    help='Previously saved session to load instead of a file',
    type=click.Path(exists=True),
)
@click.argument(
    'apk',
    default=None,
    required=False,
    type=click.Path(exists=True, dir_okay=False, file_okay=True),
)
def analyze(session: str, apk: str):
    """Open a IPython Shell and start reverse engineering.
    
    :param session: session file to restore
    :param apk: apk filename to analyze, if session not set
    """
    androlyze_main(session, apk)


@entry_point.command()
@click.option(
    "-o",
    "--offset",
    default=0,
    type=int,
    help="Offset to start dissassembly inside the file",
)
@click.option(
    "-s",
    "--size",
    default=0,
    type=int,
    help="Number of bytes from offset to disassemble, 0 for whole file",
)
@click.argument(
    "DEX",
    type=click.Path(exists=True, dir_okay=False, file_okay=True),
)
def disassemble(offset, size, dex):
    """
    Disassemble Dalvik Code with size SIZE starting from an offset
    """
    androdis_main(offset, size, dex)


@entry_point.command()
@click.argument(
    'apk',
    default=None,
    required=False,
    type=click.Path(exists=True, dir_okay=False, file_okay=True),
)
@click.option(
    "-m",
    "--modules",
    multiple=True,
    default=[],
    help="A list of modules to load in frida",
)
@click.option(
    '--enable-ui',
    is_flag=True,
    default=False,
    help='Enable UI',
)
def trace(apk, modules, enable_ui):
    """
    Push an APK on the phone and start to trace all interesting methods from the modules list

    Example:

        >>> androguard trace test.APK -m "ipc/*"  -m "webviews/*" -m "modules/**"
        >>> androguard trace test.APK -m "ipc/*"  -m "webviews/*" -m "modules/**" --enable-ui
    """
    androtrace_main(apk, modules, False, enable_ui)


@entry_point.command()
@click.argument(
    'package_name',
    default=None,
    required=False,
)
@click.option(
    "-m",
    "--modules",
    multiple=True,
    default=[],
    help="A list of modules to load in frida",
)
def dtrace(package_name, modules):
    """
    Start dynamically an installed APK on the phone and start to trace all interesting methods from the modules list

    Example:

        >>> androguard dtrace package_name -m "ipc/*"  -m "webviews/*" -m "modules/**"
    """
    androtrace_main(package_name, modules, True)


@entry_point.command()
@click.argument(
    'package_name',
    default=None,
    required=False,
)
@click.option(
    "-m",
    "--modules",
    multiple=True,
    default=["androguard/pentest/modules/helpers/dump/dexdump.js"],
    help="A list of modules to load in frida",
)
def dump(package_name, modules):
    """
    Start and dump dynamically an installed APK on the phone

    Example:

        >>> androguard dump package_name
    """
    androdump_main(package_name, modules)


# callgraph exporting utility functions
def _write_gml(G, path):
    """Wrapper around nx.write_gml"""
    return nx.write_gml(G, path, stringizer=str)


def _write_gpickle(G, path):
    """Wrapper around pickle dump"""
    import pickle

    with open(path, 'wb') as f:
        pickle.dump(G, f, pickle.HIGHEST_PROTOCOL)


def _write_yaml(G, path):
    """Wrapper around yaml dump"""
    import yaml

    with open(path, 'w') as f:
        yaml.dump(G, f)


# mapping of types to their respective exporting functions
write_methods = dict(
    gml=_write_gml,
    gexf=nx.write_gexf,
    # gpickle=_write_gpickle,   # Pickling can't be done due to BufferedReader attributes (e.g. EncodedMethod.buff) not being serializable
    graphml=nx.write_graphml,
    # yaml=_write_yaml,         # Same limitation as gpickle
    net=nx.write_pajek,
)


@entry_point.command()
@click.argument(
    'file_',
    type=click.Path(exists=True, dir_okay=False, file_okay=True),
    required=True,
)
@click.option(
    '--output',
    '-o',
    default='callgraph.gml',
    help='Filename of the output graph file',
)
@click.option(
    '--output-type',
    type=click.Choice(list(write_methods.keys()), case_sensitive=False),
    default='gml',
    help='Type of the graph to output ',
)
@click.option(
    '--show',
    '-s',
    default=False,
    is_flag=True,
    help='instead of saving the graph file, render it with matplotlib',
)
@click.option(
    '--classname',
    default='.*',
    help='Regex to filter by classname',
)
@click.option(
    '--methodname',
    default='.*',
    help='Regex to filter by methodname',
)
@click.option(
    '--descriptor',
    default='.*',
    help='Regex to filter by descriptor',
)
@click.option(
    '--accessflag',
    default='.*',
    help='Regex to filter by accessflag',
)
@click.option(
    '--no-isolated',
    default=False,
    is_flag=True,
    help='Do not store methods which has no xrefs',
)
def cg(
    file_,
    output,
    output_type,
    show,
    classname,
    methodname,
    descriptor,
    accessflag,
    no_isolated,
):
    """
    Cre
Download .txt
gitextract_u287gwvh/

├── .gitignore
├── AnalysisCSN/
│   ├── CSN.py
│   └── __init__.py
├── AnalysisDEX/
│   ├── InitDEX.py
│   └── __init__.py
├── AnalysisXML/
│   ├── AXML.py
│   └── __init__.py
├── ApkDetecter.py
├── ApkDetecter.pyw
├── ApkDetecter.spec
├── CheckProtect.py
├── GUI/
│   ├── AppInfoWidget.py
│   ├── MainForm.py
│   ├── StyleSheet.py
│   ├── __init__.py
│   ├── apkdetecter_ui.ui
│   ├── apkinfo_ui.ui
│   └── dexinfor_ui.ui
├── LICENSE.txt
├── README.md
├── Resources/
│   ├── AppIcon.icns
│   └── signatures.json
├── __init__.py
├── build_mac.sh
├── build_windows.bat
├── core/
│   ├── ApkAnalyzer.py
│   ├── DeepScanner.py
│   ├── IpaAnalyzer.py
│   └── __init__.py
├── libs/
│   ├── androguard/
│   │   ├── __init__.py
│   │   ├── cli/
│   │   │   ├── __init__.py
│   │   │   ├── cli.py
│   │   │   └── main.py
│   │   ├── core/
│   │   │   ├── __init__.py
│   │   │   ├── analysis/
│   │   │   │   ├── __init__.py
│   │   │   │   └── analysis.py
│   │   │   ├── androconf.py
│   │   │   ├── api_specific_resources/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── aosp_permissions/
│   │   │   │   │   ├── permissions_10.json
│   │   │   │   │   ├── permissions_13.json
│   │   │   │   │   ├── permissions_14.json
│   │   │   │   │   ├── permissions_15.json
│   │   │   │   │   ├── permissions_16.json
│   │   │   │   │   ├── permissions_17.json
│   │   │   │   │   ├── permissions_18.json
│   │   │   │   │   ├── permissions_19.json
│   │   │   │   │   ├── permissions_21.json
│   │   │   │   │   ├── permissions_22.json
│   │   │   │   │   ├── permissions_23.json
│   │   │   │   │   ├── permissions_24.json
│   │   │   │   │   ├── permissions_25.json
│   │   │   │   │   ├── permissions_26.json
│   │   │   │   │   ├── permissions_27.json
│   │   │   │   │   ├── permissions_28.json
│   │   │   │   │   ├── permissions_29.json
│   │   │   │   │   ├── permissions_30.json
│   │   │   │   │   ├── permissions_31.json
│   │   │   │   │   ├── permissions_32.json
│   │   │   │   │   ├── permissions_33.json
│   │   │   │   │   ├── permissions_34.json
│   │   │   │   │   ├── permissions_4.json
│   │   │   │   │   ├── permissions_5.json
│   │   │   │   │   ├── permissions_6.json
│   │   │   │   │   ├── permissions_7.json
│   │   │   │   │   ├── permissions_8.json
│   │   │   │   │   └── permissions_9.json
│   │   │   │   └── api_permission_mappings/
│   │   │   │       ├── permissions_16.json
│   │   │   │       ├── permissions_17.json
│   │   │   │       ├── permissions_18.json
│   │   │   │       ├── permissions_19.json
│   │   │   │       ├── permissions_21.json
│   │   │   │       ├── permissions_22.json
│   │   │   │       ├── permissions_23.json
│   │   │   │       ├── permissions_24.json
│   │   │   │       └── permissions_25.json
│   │   │   ├── apk/
│   │   │   │   └── __init__.py
│   │   │   ├── axml/
│   │   │   │   ├── __init__.py
│   │   │   │   └── types.py
│   │   │   ├── bytecode.py
│   │   │   ├── dex/
│   │   │   │   ├── __init__.py
│   │   │   │   └── dex_types.py
│   │   │   ├── mutf8/
│   │   │   │   └── __init__.py
│   │   │   └── resources/
│   │   │       ├── __init__.py
│   │   │       ├── public.json
│   │   │       ├── public.py
│   │   │       └── public.xml
│   │   ├── decompiler/
│   │   │   ├── __init__.py
│   │   │   ├── basic_blocks.py
│   │   │   ├── control_flow.py
│   │   │   ├── dast.py
│   │   │   ├── dataflow.py
│   │   │   ├── decompile.py
│   │   │   ├── decompiler.py
│   │   │   ├── graph.py
│   │   │   ├── instruction.py
│   │   │   ├── node.py
│   │   │   ├── opcode_ins.py
│   │   │   ├── util.py
│   │   │   └── writer.py
│   │   ├── misc.py
│   │   ├── pentest/
│   │   │   ├── __init__.py
│   │   │   ├── adb.py
│   │   │   ├── internal/
│   │   │   │   └── utils.js
│   │   │   └── modules/
│   │   │       ├── binder/
│   │   │       │   └── intercept_binder.js
│   │   │       ├── code_loading/
│   │   │       │   ├── dex.js
│   │   │       │   ├── dyndex.js
│   │   │       │   ├── load_class.js
│   │   │       │   └── native.js
│   │   │       ├── compression/
│   │   │       │   └── gzip.js
│   │   │       ├── encoding/
│   │   │       │   └── base64.js
│   │   │       ├── encryption/
│   │   │       │   ├── cipher.js
│   │   │       │   └── keystore.js
│   │   │       ├── file_system/
│   │   │       │   └── shared_preferences.js
│   │   │       ├── framework/
│   │   │       │   ├── cordova.js
│   │   │       │   └── flutter/
│   │   │       │       ├── disable_cert_chain_bypass_v7a.js
│   │   │       │       ├── disable_cert_chain_bypass_v8a.js
│   │   │       │       └── disable_cert_chain_bypass_x86_64.js
│   │   │       ├── helpers/
│   │   │       │   ├── antidebug/
│   │   │       │   │   ├── binaries.js
│   │   │       │   │   ├── debug.js
│   │   │       │   │   ├── environment.js
│   │   │       │   │   ├── package.js
│   │   │       │   │   └── process.js
│   │   │       │   ├── dump/
│   │   │       │   │   └── dexdump.js
│   │   │       │   └── pinning/
│   │   │       │       └── ssl.js
│   │   │       ├── http_communications/
│   │   │       │   └── uri.js
│   │   │       ├── intents/
│   │   │       │   ├── intents.js
│   │   │       │   ├── intents_creation.js
│   │   │       │   └── pending_intents.js
│   │   │       ├── ipc/
│   │   │       │   └── ipc.js
│   │   │       ├── preferences/
│   │   │       │   └── preferences.js
│   │   │       ├── sockets/
│   │   │       │   └── sockets.js
│   │   │       └── webviews/
│   │   │           └── webviews.js
│   │   ├── session.py
│   │   ├── ui/
│   │   │   ├── __init__.py
│   │   │   ├── data_types.py
│   │   │   ├── filter.py
│   │   │   ├── selection.py
│   │   │   ├── table.py
│   │   │   ├── util.py
│   │   │   └── widget/
│   │   │       ├── __init__.py
│   │   │       ├── details.py
│   │   │       ├── filters.py
│   │   │       ├── frame.py
│   │   │       ├── help.py
│   │   │       ├── toolbar.py
│   │   │       └── transactions.py
│   │   └── util.py
│   ├── apkInspector/
│   │   ├── __init__.py
│   │   ├── axml.py
│   │   ├── extract.py
│   │   ├── headers.py
│   │   ├── helpers.py
│   │   └── indicators.py
│   ├── apkInspectorCLI/
│   │   ├── __init__.py
│   │   └── main.py
│   ├── apkinspector-1.3.6.dist-info/
│   │   ├── METADATA
│   │   ├── RECORD
│   │   ├── WHEEL
│   │   ├── entry_points.txt
│   │   └── licenses/
│   │       └── LICENSE
│   ├── asn1crypto/
│   │   ├── __init__.py
│   │   ├── _errors.py
│   │   ├── _inet.py
│   │   ├── _int.py
│   │   ├── _iri.py
│   │   ├── _ordereddict.py
│   │   ├── _teletex_codec.py
│   │   ├── _types.py
│   │   ├── algos.py
│   │   ├── cms.py
│   │   ├── core.py
│   │   ├── crl.py
│   │   ├── csr.py
│   │   ├── keys.py
│   │   ├── ocsp.py
│   │   ├── parser.py
│   │   ├── pdf.py
│   │   ├── pem.py
│   │   ├── pkcs12.py
│   │   ├── tsp.py
│   │   ├── util.py
│   │   ├── version.py
│   │   └── x509.py
│   ├── asn1crypto-1.5.1.dist-info/
│   │   ├── LICENSE
│   │   ├── METADATA
│   │   ├── RECORD
│   │   ├── WHEEL
│   │   └── top_level.txt
│   ├── click/
│   │   ├── __init__.py
│   │   ├── _compat.py
│   │   ├── _termui_impl.py
│   │   ├── _textwrap.py
│   │   ├── _winconsole.py
│   │   ├── core.py
│   │   ├── decorators.py
│   │   ├── exceptions.py
│   │   ├── formatting.py
│   │   ├── globals.py
│   │   ├── parser.py
│   │   ├── py.typed
│   │   ├── shell_completion.py
│   │   ├── termui.py
│   │   ├── testing.py
│   │   ├── types.py
│   │   └── utils.py
│   ├── click-8.1.8.dist-info/
│   │   ├── LICENSE.txt
│   │   ├── METADATA
│   │   ├── RECORD
│   │   └── WHEEL
│   ├── colorama/
│   │   ├── __init__.py
│   │   ├── ansi.py
│   │   ├── ansitowin32.py
│   │   ├── initialise.py
│   │   ├── tests/
│   │   │   ├── __init__.py
│   │   │   ├── ansi_test.py
│   │   │   ├── ansitowin32_test.py
│   │   │   ├── initialise_test.py
│   │   │   ├── isatty_test.py
│   │   │   ├── utils.py
│   │   │   └── winterm_test.py
│   │   ├── win32.py
│   │   └── winterm.py
│   ├── colorama-0.4.6.dist-info/
│   │   ├── METADATA
│   │   ├── RECORD
│   │   ├── WHEEL
│   │   └── licenses/
│   │       └── LICENSE.txt
│   ├── loguru/
│   │   ├── __init__.py
│   │   ├── __init__.pyi
│   │   ├── _asyncio_loop.py
│   │   ├── _better_exceptions.py
│   │   ├── _colorama.py
│   │   ├── _colorizer.py
│   │   ├── _contextvars.py
│   │   ├── _ctime_functions.py
│   │   ├── _datetime.py
│   │   ├── _defaults.py
│   │   ├── _error_interceptor.py
│   │   ├── _file_sink.py
│   │   ├── _filters.py
│   │   ├── _get_frame.py
│   │   ├── _handler.py
│   │   ├── _locks_machinery.py
│   │   ├── _logger.py
│   │   ├── _recattrs.py
│   │   ├── _simple_sinks.py
│   │   ├── _string_parsers.py
│   │   └── py.typed
│   ├── loguru-0.7.3.dist-info/
│   │   ├── METADATA
│   │   ├── RECORD
│   │   └── WHEEL
│   ├── mutf8/
│   │   ├── __init__.py
│   │   └── mutf8.py
│   └── mutf8-1.0.6.dist-info/
│       ├── LICENCE
│       ├── METADATA
│       ├── RECORD
│       ├── WHEEL
│       └── top_level.txt
└── requirements.txt
Download .txt
Showing preview only (340K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4750 symbols across 132 files)

FILE: AnalysisCSN/CSN.py
  class CSN (line 4) | class CSN:
    method __init__ (line 5) | def __init__(self, apk_obj):
    method get_size (line 16) | def get_size(self):
    method getCertificateSN (line 26) | def getCertificateSN(self):
    method getCertificateIDN (line 33) | def getCertificateIDN(self):
    method getCertificateSDN (line 42) | def getCertificateSDN(self):

FILE: AnalysisDEX/InitDEX.py
  class InitDEX (line 6) | class InitDEX:
    method __init__ (line 7) | def __init__(self, apk_obj):
    method getDexInfo (line 11) | def getDexInfo(self):

FILE: AnalysisXML/AXML.py
  class AXML (line 61) | class AXML:
    method __init__ (line 62) | def __init__(self, apk_obj):
    method get_package (line 65) | def get_package(self):
    method get_androidversion_name (line 68) | def get_androidversion_name(self):
    method get_androidversion_code (line 71) | def get_androidversion_code(self):
    method getMinSdkVersion (line 74) | def getMinSdkVersion(self):
    method getRiskPermission (line 80) | def getRiskPermission(self):

FILE: ApkDetecter.py
  class NullWriter (line 12) | class NullWriter:
    method write (line 13) | def write(self, text):
    method flush (line 15) | def flush(self):
    method isatty (line 17) | def isatty(self):
  function resource_path (line 216) | def resource_path(relative_path):

FILE: CheckProtect.py
  class CheckProtect (line 8) | class CheckProtect:
    method __init__ (line 9) | def __init__(self, apk_obj):
    method _load_signatures (line 17) | def _load_signatures(self):
    method check_protectflag (line 35) | def check_protectflag(self):
    method _check_rule (line 87) | def _check_rule(self, rule, file_set, path_set):

FILE: GUI/AppInfoWidget.py
  class AppInfoWidget (line 6) | class AppInfoWidget(QtWidgets.QWidget):
    method __init__ (line 7) | def __init__(self, parent=None):
    method init_ui (line 11) | def init_ui(self):
    method init_basic_tab (line 79) | def init_basic_tab(self):
    method init_perms_tab (line 145) | def init_perms_tab(self):
    method update_data (line 151) | def update_data(self, analyzer_type, analyzer):
    method _update_apk_details (line 179) | def _update_apk_details(self, analyzer):
    method _update_ipa_details (line 214) | def _update_ipa_details(self, analyzer):

FILE: GUI/MainForm.py
  class DeepScanThread (line 12) | class DeepScanThread(QtCore.QThread):
    method __init__ (line 16) | def __init__(self, apk_obj=None, ipa_path=None, analyzer=None):
    method run (line 22) | def run(self):
    method emit_progress (line 31) | def emit_progress(self, value, message):
  class AnalysisThread (line 34) | class AnalysisThread(QtCore.QThread):
    method __init__ (line 38) | def __init__(self, file_path):
    method run (line 44) | def run(self):
    method emit_progress (line 68) | def emit_progress(self, value, message):
  class OverlayWidget (line 71) | class OverlayWidget(QtWidgets.QWidget):
    method __init__ (line 72) | def __init__(self, parent=None):
    method resizeEvent (line 178) | def resizeEvent(self, event):
    method set_progress (line 192) | def set_progress(self, value, message):
    method _start_creep (line 218) | def _start_creep(self):
    method _on_creep_timer (line 223) | def _on_creep_timer(self):
    method log_text_append (line 244) | def log_text_append(self, text):
    method clear_log (line 250) | def clear_log(self):
  class MainForm (line 254) | class MainForm(QtWidgets.QMainWindow):
    method __init__ (line 255) | def __init__(self):
    method load_icon (line 268) | def load_icon(self, name):
    method init_ui (line 280) | def init_ui(self):
    method resizeEvent (line 418) | def resizeEvent(self, event):
    method dragEnterEvent (line 423) | def dragEnterEvent(self, event):
    method dragLeaveEvent (line 430) | def dragLeaveEvent(self, event):
    method dropEvent (line 433) | def dropEvent(self, event):
    method open_file_dialog (line 441) | def open_file_dialog(self):
    method load_file (line 447) | def load_file(self, file_path):
    method update_progress (line 460) | def update_progress(self, value, message):
    method analysis_finished (line 464) | def analysis_finished(self, success, analyzer, analyzer_type):
    method show_about (line 483) | def show_about(self):
    method clear_analysis (line 490) | def clear_analysis(self):
    method export_report (line 495) | def export_report(self):
    method run_deep_scan (line 516) | def run_deep_scan(self):
    method deep_scan_finished (line 555) | def deep_scan_finished(self, results):
    method export_deep_scan_results (line 613) | def export_deep_scan_results(self, results, parent_dlg):

FILE: core/ApkAnalyzer.py
  class ApkAnalyzer (line 28) | class ApkAnalyzer:
    method __init__ (line 29) | def __init__(self, file_path):
    method _setup_logging (line 44) | def _setup_logging(self):
    method _log_callback (line 77) | def _log_callback(self, msg):
    method _loguru_callback (line 94) | def _loguru_callback(self, msg):
    method set_progress_callback (line 100) | def set_progress_callback(self, callback):
    method _update_progress (line 103) | def _update_progress(self, value, message=""):
    method _calculate_md5_chunked (line 107) | def _calculate_md5_chunked(self, path):
    method analyze (line 127) | def analyze(self):
    method get_basic_info (line 322) | def get_basic_info(self):
    method _format_size (line 334) | def _format_size(self, size):

FILE: core/DeepScanner.py
  class DeepScanner (line 12) | class DeepScanner:
    method __init__ (line 13) | def __init__(self, apk_obj=None, ipa_path=None, binary_path_in_zip=None):
    method scan (line 76) | def scan(self, progress_callback=None):
    method _scan_apk (line 82) | def _scan_apk(self, progress_callback):
    method _scan_ipa (line 126) | def _scan_ipa(self, progress_callback):
    method _extract_strings (line 253) | def _extract_strings(self, data, min_length=4):
    method _analyze_string (line 269) | def _analyze_string(self, s):
    method _analyze_apis (line 286) | def _analyze_apis(self, all_strings):
    method _deduplicate (line 307) | def _deduplicate(self):

FILE: core/IpaAnalyzer.py
  class IpaAnalyzer (line 18) | class IpaAnalyzer:
    method __init__ (line 19) | def __init__(self, file_path):
    method set_progress_callback (line 29) | def set_progress_callback(self, callback):
    method _update_progress (line 32) | def _update_progress(self, value, message=""):
    method _find_zip_entry (line 36) | def _find_zip_entry(self, z, folder, name):
    method _calculate_md5_chunked (line 113) | def _calculate_md5_chunked(self, path):
    method analyze (line 133) | def analyze(self):
    method _check_cryptid (line 285) | def _check_cryptid(self, f):
    method _parse_info_plist (line 381) | def _parse_info_plist(self, plist):
    method _parse_provision (line 397) | def _parse_provision(self, content):
    method get_basic_info (line 418) | def get_basic_info(self):
    method get_details (line 435) | def get_details(self):
    method _format_size (line 443) | def _format_size(self, size):

FILE: libs/androguard/cli/cli.py
  function entry_point (line 36) | def entry_point(verbosity):
  function axml (line 67) | def axml(input_, output, file_, resource):
  function arsc (line 156) | def arsc(
  function decompile (line 338) | def decompile(input_, file_, output, format_, jar, limit, decompiler):
  function sign (line 403) | def sign(hash_, print_all_hashes, show, apk):
  function apkid (line 414) | def apkid(apks: list[str]):
  function analyze (line 441) | def analyze(session: str, apk: str):
  function disassemble (line 469) | def disassemble(offset, size, dex):
  function trace (line 496) | def trace(apk, modules, enable_ui):
  function dtrace (line 521) | def dtrace(package_name, modules):
  function dump (line 545) | def dump(package_name, modules):
  function _write_gml (line 557) | def _write_gml(G, path):
  function _write_gpickle (line 562) | def _write_gpickle(G, path):
  function _write_yaml (line 570) | def _write_yaml(G, path):
  function cg (line 640) | def cg(

FILE: libs/androguard/cli/main.py
  function androaxml_main (line 26) | def androaxml_main(
  function androarsc_main (line 66) | def androarsc_main(
  function export_apps_to_format (line 110) | def export_apps_to_format(
  function valid_class_name (line 263) | def valid_class_name(class_name: str) -> str:
  function create_directory (line 269) | def create_directory(pathdir: str) -> None:
  function androlyze_main (line 274) | def androlyze_main(session: Session, filename: str) -> None:
  function androsign_main (line 375) | def androsign_main(
  function androdis_main (line 510) | def androdis_main(offset: int, size: int, dex_file: str) -> None:
  function androtrace_main (line 549) | def androtrace_main(
  function androdump_main (line 603) | def androdump_main(package_name: str, list_modules: list[str]) -> None:

FILE: libs/androguard/core/analysis/analysis.py
  class REF_TYPE (line 30) | class REF_TYPE(IntEnum):
  class ExceptionAnalysis (line 51) | class ExceptionAnalysis:
    method __init__ (line 52) | def __init__(self, exception: list, basic_blocks: BasicBlocks):
    method show_buff (line 61) | def show_buff(self) -> str:
    method get (line 74) | def get(self) -> dict[str, Union[int, list[dict[str, Union[str, int]]]]]:
  class Exceptions (line 85) | class Exceptions:
    method __init__ (line 86) | def __init__(self) -> None:
    method add (line 89) | def add(self, exceptions: list[list], basic_blocks: BasicBlocks) -> None:
    method get_exception (line 93) | def get_exception(
    method gets (line 105) | def gets(self) -> list[ExceptionAnalysis]:
    method get (line 108) | def get(self) -> Iterator[ExceptionAnalysis]:
  class BasicBlocks (line 113) | class BasicBlocks:
    method __init__ (line 120) | def __init__(self) -> None:
    method push (line 123) | def push(self, bb: DEXBasicBlock) -> None:
    method pop (line 131) | def pop(self, idx: int) -> DEXBasicBlock:
    method get_basic_block (line 139) | def get_basic_block(self, idx: int) -> Union[DEXBasicBlock,None]:
    method __len__ (line 150) | def __len__(self) -> int:
    method __iter__ (line 153) | def __iter__(self) -> Iterator[DEXBasicBlock]:
    method __getitem__ (line 159) | def __getitem__(self, item: int) -> DEXBasicBlock:
    method gets (line 168) | def gets(self) -> list[DEXBasicBlock]:
  class DEXBasicBlock (line 179) | class DEXBasicBlock:
    method __init__ (line 187) | def __init__(
    method get_notes (line 223) | def get_notes(self) -> list[str]:
    method set_notes (line 226) | def set_notes(self, value: str) -> None:
    method add_note (line 229) | def add_note(self, note: str) -> None:
    method clear_notes (line 232) | def clear_notes(self) -> None:
    method get_instructions (line 235) | def get_instructions(self) -> Iterator[dex.Instruction]:
    method get_nb_instructions (line 247) | def get_nb_instructions(self) -> int:
    method get_method (line 250) | def get_method(self) -> dex.EncodedMethod:
    method get_name (line 258) | def get_name(self) -> str:
    method get_start (line 261) | def get_start(self) -> int:
    method get_end (line 269) | def get_end(self) -> int:
    method get_last (line 277) | def get_last(self) -> dex.Instruction:
    method get_next (line 285) | def get_next(self) -> DEXBasicBlock:
    method get_prev (line 293) | def get_prev(self) -> DEXBasicBlock:
    method set_fathers (line 301) | def set_fathers(self, f: DEXBasicBlock) -> None:
    method get_last_length (line 304) | def get_last_length(self) -> int:
    method set_childs (line 307) | def set_childs(self, values: list[int]) -> None:
    method push (line 328) | def push(self, i: DEXBasicBlock) -> None:
    method get_special_ins (line 340) | def get_special_ins(self, idx: int) -> Union[dex.Instruction, None]:
    method get_exception_analysis (line 353) | def get_exception_analysis(self) -> ExceptionAnalysis:
    method set_exception_analysis (line 356) | def set_exception_analysis(self, exception_analysis: ExceptionAnalysis):
    method show (line 359) | def show(self) -> None:
  class MethodAnalysis (line 370) | class MethodAnalysis:
    method __init__ (line 376) | def __init__(self, vm: dex.DEX, method: dex.EncodedMethod) -> None:
    method name (line 421) | def name(self) -> str:
    method descriptor (line 429) | def descriptor(self) -> str:
    method access (line 437) | def access(self) -> str:
    method class_name (line 445) | def class_name(self) -> str:
    method full_name (line 453) | def full_name(self) -> str:
    method get_class_name (line 460) | def get_class_name(self) -> str:
    method get_access_flags_string (line 467) | def get_access_flags_string(self) -> str:
    method get_descriptor (line 474) | def get_descriptor(self) -> str:
    method _create_basic_block (line 477) | def _create_basic_block(self) -> None:
    method add_xref_read (line 552) | def add_xref_read(
    method add_xref_write (line 562) | def add_xref_write(
    method get_xref_read (line 572) | def get_xref_read(self) -> list[tuple[ClassAnalysis, FieldAnalysis]]:
    method get_xref_write (line 584) | def get_xref_write(self) -> list[tuple[ClassAnalysis, FieldAnalysis]]:
    method add_xref_to (line 596) | def add_xref_to(
    method add_xref_from (line 605) | def add_xref_from(
    method get_xref_from (line 614) | def get_xref_from(self) -> list[tuple[ClassAnalysis, MethodAnalysis, i...
    method get_xref_to (line 628) | def get_xref_to(self) -> list[tuple[ClassAnalysis, MethodAnalysis, int]]:
    method add_xref_new_instance (line 642) | def add_xref_new_instance(
    method get_xref_new_instance (line 651) | def get_xref_new_instance(self) -> list[tuple[ClassAnalysis, int]]:
    method add_xref_const_class (line 664) | def add_xref_const_class(
    method get_xref_const_class (line 672) | def get_xref_const_class(self) -> list[tuple[ClassAnalysis, int]]:
    method is_external (line 685) | def is_external(self) -> bool:
    method is_android_api (line 693) | def is_android_api(self) -> bool:
    method get_basic_blocks (line 732) | def get_basic_blocks(self) -> BasicBlocks:
    method get_length (line 741) | def get_length(self) -> int:
    method get_vm (line 747) | def get_vm(self) -> dex.DEX:
    method get_method (line 753) | def get_method(self) -> dex.EncodedMethod:
    method show (line 759) | def show(self) -> None:
    method show_xrefs (line 791) | def show_xrefs(self) -> None:
    method __repr__ (line 808) | def __repr__(self):
  class StringAnalysis (line 812) | class StringAnalysis:
    method __init__ (line 822) | def __init__(self, value: str) -> None:
    method add_xref_from (line 831) | def add_xref_from(
    method get_xref_from (line 843) | def get_xref_from(
    method set_value (line 857) | def set_value(self, value: str) -> None:
    method get_value (line 866) | def get_value(self) -> str:
    method get_orig_value (line 874) | def get_orig_value(self) -> str:
    method is_overwritten (line 882) | def is_overwritten(self) -> bool:
    method __str__ (line 889) | def __str__(self):
    method __repr__ (line 897) | def __repr__(self):
  class FieldAnalysis (line 906) | class FieldAnalysis:
    method __init__ (line 916) | def __init__(self, field: dex.EncodedField) -> None:
    method name (line 925) | def name(self) -> str:
    method add_xref_read (line 928) | def add_xref_read(
    method add_xref_write (line 938) | def add_xref_write(
    method get_xref_read (line 948) | def get_xref_read(
    method get_xref_write (line 967) | def get_xref_write(
    method get_field (line 986) | def get_field(self) -> dex.EncodedField:
    method __str__ (line 994) | def __str__(self):
    method __repr__ (line 1011) | def __repr__(self):
  class ExternalClass (line 1017) | class ExternalClass:
    method __init__ (line 1024) | def __init__(self, name: str) -> None:
    method get_methods (line 1031) | def get_methods(self) -> list[MethodAnalysis]:
    method add_method (line 1038) | def add_method(self, method: MethodAnalysis) -> None:
    method get_name (line 1041) | def get_name(self) -> str:
    method __repr__ (line 1049) | def __repr__(self):
  class ExternalMethod (line 1053) | class ExternalMethod:
    method __init__ (line 1066) | def __init__(self, class_name: str, name: str, descriptor: str) -> None:
    method get_name (line 1077) | def get_name(self) -> str:
    method get_class_name (line 1084) | def get_class_name(self) -> str:
    method get_descriptor (line 1091) | def get_descriptor(self) -> str:
    method full_name (line 1098) | def full_name(self) -> str:
    method permission_api_name (line 1112) | def permission_api_name(self) -> str:
    method get_access_flags_string (line 1125) | def get_access_flags_string(self) -> str:
    method __str__ (line 1138) | def __str__(self):
    method __repr__ (line 1145) | def __repr__(self):
  class ClassAnalysis (line 1149) | class ClassAnalysis:
    method __init__ (line 1159) | def __init__(
    method add_method (line 1188) | def add_method(self, method_analysis: MethodAnalysis) -> None:
    method implements (line 1201) | def implements(self) -> list[str]:
    method extends (line 1213) | def extends(self) -> str:
    method name (line 1227) | def name(self) -> str:
    method is_external (line 1235) | def is_external(self) -> bool:
    method is_android_api (line 1243) | def is_android_api(self) -> bool:
    method get_methods (line 1282) | def get_methods(self) -> list[MethodAnalysis]:
    method get_fields (line 1291) | def get_fields(self) -> list[FieldAnalysis]:
    method get_nb_methods (line 1299) | def get_nb_methods(self) -> int:
    method get_method_analysis (line 1307) | def get_method_analysis(self, method: dex.EncodedMethod) -> MethodAnal...
    method get_field_analysis (line 1316) | def get_field_analysis(self, field: dex.EncodedMethod) -> FieldAnalysis:
    method add_field (line 1324) | def add_field(self, field_analysis: FieldAnalysis) -> None:
    method add_field_xref_read (line 1336) | def add_field_xref_read(
    method add_field_xref_write (line 1355) | def add_field_xref_write(
    method add_method_xref_to (line 1374) | def add_method_xref_to(
    method add_method_xref_from (line 1398) | def add_method_xref_from(
    method add_xref_to (line 1420) | def add_xref_to(
    method add_xref_from (line 1441) | def add_xref_from(
    method get_xref_from (line 1459) | def get_xref_from(
    method get_xref_to (line 1487) | def get_xref_to(
    method add_xref_new_instance (line 1515) | def add_xref_new_instance(
    method get_xref_new_instance (line 1527) | def get_xref_new_instance(self) -> list[tuple[MethodAnalysis, int]]:
    method add_xref_const_class (line 1541) | def add_xref_const_class(
    method get_xref_const_class (line 1552) | def get_xref_const_class(self) -> list[tuple[MethodAnalysis, int]]:
    method get_vm_class (line 1565) | def get_vm_class(self) -> Union[dex.ClassDefItem, ExternalClass]:
    method set_restriction_flag (line 1573) | def set_restriction_flag(
    method set_domain_flag (line 1589) | def set_domain_flag(
    method __repr__ (line 1608) | def __repr__(self):
    method __str__ (line 1614) | def __str__(self):
  class Analysis (line 1638) | class Analysis:
    method __init__ (line 1665) | def __init__(self, vm: Union[dex.DEX, None] = None) -> None:
    method fields (line 1688) | def fields(self) -> Iterator[FieldAnalysis]:
    method add (line 1695) | def add(self, vm: dex.DEX) -> None:
    method create_xref (line 1752) | def create_xref(self) -> None:
    method _create_xref (line 1793) | def _create_xref(self, current_class: dex.ClassDefItem) -> None:
    method get_method (line 1958) | def get_method(
    method _resolve_method (line 1975) | def _resolve_method(
    method get_method_by_name (line 2009) | def get_method_by_name(
    method get_method_analysis_by_name (line 2027) | def get_method_analysis_by_name(
    method get_field_analysis (line 2046) | def get_field_analysis(
    method is_class_present (line 2060) | def is_class_present(self, class_name: str) -> bool:
    method get_class_analysis (line 2069) | def get_class_analysis(self, class_name: str) -> ClassAnalysis:
    method get_external_classes (line 2078) | def get_external_classes(self) -> Iterator[ClassAnalysis]:
    method get_internal_classes (line 2089) | def get_internal_classes(self) -> Iterator[ClassAnalysis]:
    method get_internal_methods (line 2100) | def get_internal_methods(self) -> Iterator[MethodAnalysis]:
    method get_external_methods (line 2111) | def get_external_methods(self) -> Iterator[MethodAnalysis]:
    method get_strings_analysis (line 2122) | def get_strings_analysis(self) -> dict[str, StringAnalysis]:
    method get_strings (line 2130) | def get_strings(self) -> list[StringAnalysis]:
    method get_classes (line 2138) | def get_classes(self) -> list[ClassAnalysis]:
    method get_methods (line 2148) | def get_methods(self) -> Iterator[MethodAnalysis]:
    method get_fields (line 2157) | def get_fields(self) -> Iterator[FieldAnalysis]:
    method find_classes (line 2167) | def find_classes(
    method find_methods (line 2185) | def find_methods(
    method find_strings (line 2225) | def find_strings(self, string: str = ".*") -> Iterator[StringAnalysis]:
    method find_fields (line 2236) | def find_fields(
    method __repr__ (line 2263) | def __repr__(self):
    method get_call_graph (line 2271) | def get_call_graph(
    method create_ipython_exports (line 2356) | def create_ipython_exports(self) -> None:
    method get_permissions (line 2414) | def get_permissions(
    method get_permission_usage (line 2466) | def get_permission_usage(
    method get_android_api_usage (line 2515) | def get_android_api_usage(self) -> Iterator[MethodAnalysis]:
  function is_ascii_obfuscation (line 2528) | def is_ascii_obfuscation(vm: dex.DEX) -> bool:

FILE: libs/androguard/core/androconf.py
  class InvalidResourceError (line 26) | class InvalidResourceError(Exception):
  function is_ascii_problem (line 34) | def is_ascii_problem(s: str) -> bool:
  class Configuration (line 89) | class Configuration:
    method __init__ (line 92) | def __init__(self) -> None:
    method __getattr__ (line 100) | def __getattr__(self, item):
    method __getitem__ (line 103) | def __getitem__(self, item):
    method __setitem__ (line 106) | def __setitem__(self, key, value):
    method __str__ (line 109) | def __str__(self):
    method __repr__ (line 112) | def __repr__(self):
  function is_android (line 119) | def is_android(filename: str) -> str:
  function is_android_raw (line 134) | def is_android_raw(raw: bytes) -> str:
  function rrmdir (line 166) | def rrmdir(directory: str) -> None:
  function make_color_tuple (line 180) | def make_color_tuple(color: str) -> tuple[int, int, int]:
  function interpolate_tuple (line 196) | def interpolate_tuple(
  function color_range (line 243) | def color_range(
  function load_api_specific_resource_module (line 262) | def load_api_specific_resource_module(

FILE: libs/androguard/core/api_specific_resources/__init__.py
  class APILevelNotFoundError (line 9) | class APILevelNotFoundError(Exception):
  function load_permissions (line 13) | def load_permissions(
  function load_permission_mappings (line 89) | def load_permission_mappings(

FILE: libs/androguard/core/apk/__init__.py
  function parse_lxml_dom (line 93) | def parse_lxml_dom(tree):
  class Error (line 99) | class Error(Exception):
  class FileNotPresent (line 105) | class FileNotPresent(Error):
  class BrokenAPKError (line 109) | class BrokenAPKError(Error):
  function _dump_additional_attributes (line 113) | def _dump_additional_attributes(additional_attributes):
  function _dump_digests_or_signatures (line 135) | def _dump_digests_or_signatures(digests_or_sigs):
  class APKV2SignedData (line 150) | class APKV2SignedData:
    method __init__ (line 156) | def __init__(self) -> None:
    method __str__ (line 162) | def __str__(self):
  class APKV3SignedData (line 206) | class APKV3SignedData(APKV2SignedData):
    method __init__ (line 212) | def __init__(self) -> None:
    method __str__ (line 217) | def __str__(self):
  class APKV2Signer (line 235) | class APKV2Signer:
    method __init__ (line 241) | def __init__(self) -> None:
    method __str__ (line 247) | def __str__(self):
  class APKV3Signer (line 259) | class APKV3Signer(APKV2Signer):
    method __init__ (line 265) | def __init__(self) -> None:
    method __str__ (line 270) | def __str__(self):
  class APK (line 288) | class APK:
    method __init__ (line 311) | def __init__(
    method _ns (line 395) | def _ns(name):
    method _apk_analysis (line 401) | def _apk_analysis(self):
    method __getstate__ (line 507) | def __getstate__(self):
    method __setstate__ (line 524) | def __setstate__(self, state):
    method _get_res_string_value (line 536) | def _get_res_string_value(self, string):
    method _get_permission_maxsdk (line 552) | def _get_permission_maxsdk(self, item):
    method is_valid_APK (line 565) | def is_valid_APK(self) -> bool:
    method get_filename (line 576) | def get_filename(self) -> str:
    method get_app_name (line 584) | def get_app_name(self, locale=None) -> str:
    method get_app_icon (line 658) | def get_app_icon(self, max_dpi: int = 65536) -> Union[str, None]:
    method get_package (line 751) | def get_package(self) -> str:
    method get_androidversion_code (line 761) | def get_androidversion_code(self) -> str:
    method get_androidversion_name (line 771) | def get_androidversion_name(self) -> str:
    method get_files (line 781) | def get_files(self) -> list[str]:
    method _get_file_magic_name (line 789) | def _get_file_magic_name(self, buffer: bytes) -> str:
    method files (line 850) | def files(self) -> dict[str, str]:
    method get_files_types (line 858) | def get_files_types(self) -> dict[str, str]:
    method _patch_magic (line 874) | def _patch_magic(self, buffer, orig):
    method _get_crc32 (line 891) | def _get_crc32(self, filename):
    method get_files_crc32 (line 919) | def get_files_crc32(self) -> dict[str, int]:
    method get_files_information (line 931) | def get_files_information(self) -> Iterator[tuple[str, str, int]]:
    method get_raw (line 940) | def get_raw(self) -> bytes:
    method get_file (line 954) | def get_file(self, filename: str) -> bytes:
    method get_dex (line 968) | def get_dex(self) -> bytes:
    method get_dex_names (line 984) | def get_dex_names(self) -> list[str]:
    method get_all_dex (line 995) | def get_all_dex(self) -> Iterator[bytes]:
    method is_multidex (line 1004) | def is_multidex(self) -> bool:
    method _format_value (line 1022) | def _format_value(self, value):
    method get_all_attribute_value (line 1043) | def get_all_attribute_value(
    method get_attribute_value (line 1068) | def get_attribute_value(
    method get_value_from_tag (line 1091) | def get_value_from_tag(
    method find_tags (line 1142) | def find_tags(self, tag_name: str, **attribute_filter) -> list[str]:
    method find_tags_from_xml (line 1156) | def find_tags_from_xml(
    method is_tag_matched (line 1184) | def is_tag_matched(self, tag: lxml.etree.Element, **attribute_filter) ...
    method get_main_activities (line 1214) | def get_main_activities(self) -> set[str]:
    method get_main_activity (line 1259) | def get_main_activity(self) -> Union[str, None]:
    method get_activities (line 1282) | def get_activities(self) -> list[str]:
    method get_activity_aliases (line 1290) | def get_activity_aliases(self) -> list[dict[str, str]]:
    method get_services (line 1308) | def get_services(self) -> list[str]:
    method get_receivers (line 1316) | def get_receivers(self) -> list[str]:
    method get_providers (line 1324) | def get_providers(self) -> list[str]:
    method get_res_value (line 1332) | def get_res_value(self, name: str) -> str:
    method get_intent_filters (line 1354) | def get_intent_filters(
    method get_permissions (line 1421) | def get_permissions(self) -> list[str]:
    method get_uses_implied_permission_list (line 1437) | def get_uses_implied_permission_list(self) -> list[str]:
    method _update_permission_protection_level (line 1488) | def _update_permission_protection_level(
    method _fill_deprecated_permissions (line 1495) | def _fill_deprecated_permissions(self, permissions):
    method get_details_permissions (line 1525) | def get_details_permissions(self) -> dict[str, list[str]]:
    method get_requested_aosp_permissions (line 1557) | def get_requested_aosp_permissions(self) -> list[str]:
    method get_requested_aosp_permissions_details (line 1572) | def get_requested_aosp_permissions_details(self) -> dict[str, list[str]]:
    method get_requested_third_party_permissions (line 1587) | def get_requested_third_party_permissions(self) -> list[str]:
    method get_declared_permissions (line 1600) | def get_declared_permissions(self) -> list[str]:
    method get_declared_permissions_details (line 1608) | def get_declared_permissions_details(self) -> dict[str, list[str]]:
    method get_max_sdk_version (line 1616) | def get_max_sdk_version(self) -> str:
    method get_min_sdk_version (line 1624) | def get_min_sdk_version(self) -> str:
    method get_target_sdk_version (line 1632) | def get_target_sdk_version(self) -> str:
    method get_effective_target_sdk_version (line 1640) | def get_effective_target_sdk_version(self) -> int:
    method get_libraries (line 1658) | def get_libraries(self) -> list[str]:
    method get_features (line 1666) | def get_features(self) -> list[str]:
    method is_wearable (line 1675) | def is_wearable(self) -> bool:
    method is_leanback (line 1688) | def is_leanback(self) -> bool:
    method is_androidtv (line 1697) | def is_androidtv(self) -> bool:
    method get_certificate_der (line 1715) | def get_certificate_der(
    method verify_signer_info_against_sig_file (line 1792) | def verify_signer_info_against_sig_file(
    method verify_signature (line 1883) | def verify_signature(
    method get_hash_algorithm (line 1941) | def get_hash_algorithm(signer_info: asn1crypto.cms.SignerInfo) -> dict...
    method find_certificate (line 1957) | def find_certificate(
    method get_certificate (line 1999) | def get_certificate(self, filename: str) -> Union[asn1crypto.x509.Cert...
    method canonical_name (line 2013) | def canonical_name(self, name: asn1crypto.x509.Name, android: bool = F...
    method comparison_name (line 2031) | def comparison_name(
    method x509_ordered_name (line 2055) | def x509_ordered_name(
    method new_zip (line 2139) | def new_zip(
    method get_android_manifest_axml (line 2181) | def get_android_manifest_axml(self) -> Union[AXMLPrinter, None]:
    method get_android_manifest_xml (line 2192) | def get_android_manifest_xml(self) -> Union[lxml.etree.Element, None]:
    method get_android_resources (line 2203) | def get_android_resources(self) -> Union[ARSCParser, None]:
    method is_signed (line 2221) | def is_signed(self) -> bool:
    method is_signed_v1 (line 2231) | def is_signed_v1(self) -> bool:
    method is_signed_v2 (line 2242) | def is_signed_v2(self) -> bool:
    method is_signed_v3 (line 2256) | def is_signed_v3(self) -> bool:
    method read_uint32_le (line 2270) | def read_uint32_le(self, io_stream) -> int:
    method parse_signatures_or_digests (line 2279) | def parse_signatures_or_digests(
    method parse_v2_v3_signature (line 2305) | def parse_v2_v3_signature(self) -> None:
    method parse_v3_signing_block (line 2403) | def parse_v3_signing_block(self) -> None:
    method parse_v2_signing_block (line 2503) | def parse_v2_signing_block(self) -> None:
    method get_public_keys_der_v3 (line 2587) | def get_public_keys_der_v3(self) -> list[bytes]:
    method get_public_keys_der_v2 (line 2604) | def get_public_keys_der_v2(self) -> list[bytes]:
    method get_certificates_der_v3 (line 2621) | def get_certificates_der_v3(self) -> list[bytes]:
    method get_certificates_der_v2 (line 2640) | def get_certificates_der_v2(self) -> list[bytes]:
    method get_public_keys_v3 (line 2659) | def get_public_keys_v3(self) -> list[asn1crypto.keys.PublicKeyInfo]:
    method get_public_keys_v2 (line 2671) | def get_public_keys_v2(self) -> list[asn1crypto.keys.PublicKeyInfo]:
    method get_certificates_v3 (line 2683) | def get_certificates_v3(self) -> list[asn1crypto.x509.Certificate]:
    method get_certificates_v2 (line 2697) | def get_certificates_v2(self) -> list[asn1crypto.x509.Certificate]:
    method get_certificates_v1 (line 2711) | def get_certificates_v1(self) -> list[Union[x509.Certificate, None]]:
    method get_certificates (line 2723) | def get_certificates(self) -> list[asn1crypto.x509.Certificate]:
    method get_signature_name (line 2745) | def get_signature_name(self) -> Union[str, None]:
    method get_signature_names (line 2757) | def get_signature_names(self) -> list[str]:
    method get_signature (line 2780) | def get_signature(self) -> Union[str, None]:
    method get_signatures (line 2792) | def get_signatures(self) -> list[bytes]:
    method show (line 2808) | def show(self) -> None:
  function show_Certificate (line 2861) | def show_Certificate(cert:asn1crypto.x509.Certificate, short:bool=False)...
  function ensure_final_value (line 2882) | def ensure_final_value(packageName: str, arsc: ARSCParser, value: str) -...
  function get_apkid (line 2906) | def get_apkid(apkfile: str) -> tuple[str, str, str]:

FILE: libs/androguard/core/axml/__init__.py
  class ResParserError (line 90) | class ResParserError(Exception):
  function complexToFloat (line 96) | def complexToFloat(xcomplex) -> float:
  class StringBlock (line 103) | class StringBlock:
    method __init__ (line 111) | def __init__(self, buff: BinaryIO, header: ARSCHeader) -> None:
    method __repr__ (line 187) | def __repr__(self):
    method __getitem__ (line 192) | def __getitem__(self, idx):
    method __len__ (line 200) | def __len__(self):
    method __iter__ (line 208) | def __iter__(self):
    method getString (line 217) | def getString(self, idx: int) -> str:
    method getStyle (line 239) | def getStyle(self, idx: int) -> int:
    method _decode8 (line 248) | def _decode8(self, offset: int) -> str:
    method _decode16 (line 285) | def _decode16(self, offset: int) -> str:
    method _decode_bytes (line 327) | def _decode_bytes(data: bytes, encoding: str, str_len: int) -> str:
    method _decode_length (line 344) | def _decode_length(self, offset: int, sizeof_char: int) -> tuple[int, ...
    method show (line 391) | def show(self) -> None:
  class AXMLParser (line 424) | class AXMLParser:
    method __init__ (line 448) | def __init__(self, raw_buff: bytes) -> None:
    method is_valid (line 567) | def is_valid(self) -> bool:
    method _reset (line 578) | def _reset(self):
    method __next__ (line 588) | def __next__(self):
    method _do_next (line 592) | def _do_next(self):
    method name (line 826) | def name(self) -> str:
    method comment (line 840) | def comment(self) -> Union[str, None]:
    method namespace (line 855) | def namespace(self) -> str:
    method nsmap (line 873) | def nsmap(self) -> dict[str, str]:
    method text (line 901) | def text(self) -> str:
    method getName (line 912) | def getName(self) -> str:
    method getText (line 919) | def getText(self) -> str:
    method getPrefix (line 926) | def getPrefix(self) -> str:
    method _get_attribute_offset (line 933) | def _get_attribute_offset(self, index: int):
    method getAttributeCount (line 946) | def getAttributeCount(self) -> int:
    method getAttributeUri (line 958) | def getAttributeUri(self, index:int) -> int:
    method getAttributeNamespace (line 971) | def getAttributeNamespace(self, index:int) -> str:
    method getAttributeName (line 987) | def getAttributeName(self, index:int) -> str:
    method getAttributeValueType (line 1014) | def getAttributeValueType(self, index: int):
    method getAttributeValueData (line 1025) | def getAttributeValueData(self, index: int):
    method getAttributeValue (line 1036) | def getAttributeValue(self, index: int) -> str:
  function format_value (line 1055) | def format_value(
  class AXMLPrinter (line 1117) | class AXMLPrinter:
    method __init__ (line 1128) | def __init__(self, raw_buff: bytes) -> bytes:
    method clean_and_replace_nsmap (line 1246) | def clean_and_replace_nsmap(self, nsmap, invalid_prefix):
    method get_buff (line 1256) | def get_buff(self) -> bytes:
    method get_xml (line 1264) | def get_xml(self, pretty: bool = True) -> bytes:
    method get_xml_obj (line 1272) | def get_xml_obj(self) -> etree.Element:
    method is_valid (line 1280) | def is_valid(self) -> bool:
    method is_packed (line 1290) | def is_packed(self) -> bool:
    method _get_attribute_value (line 1303) | def _get_attribute_value(self, index: int):
    method _fix_name (line 1316) | def _fix_name(self, prefix, name) -> tuple[str, str]:
    method _fix_value (line 1388) | def _fix_value(self, value):
    method _print_namespace (line 1426) | def _print_namespace(self, uri):
  class ARSCParser (line 1624) | class ARSCParser:
    method __init__ (line 1638) | def __init__(self, raw_buff: bytes) -> None:
    method _analyse (line 1919) | def _analyse(self):
    method get_resource_string (line 2017) | def get_resource_string(self, ate: ARSCResTableEntry) -> list:
    method get_resource_id (line 2020) | def get_resource_id(self, ate: ARSCResTableEntry) -> list[str]:
    method get_resource_bool (line 2028) | def get_resource_bool(self, ate: ARSCResTableEntry) -> list[str]:
    method get_resource_integer (line 2036) | def get_resource_integer(self, ate: ARSCResTableEntry) -> list:
    method get_resource_color (line 2039) | def get_resource_color(self, ate: ARSCResTableEntry) -> list:
    method get_resource_dimen (line 2051) | def get_resource_dimen(self, ate: ARSCResTableEntry) -> list:
    method get_resource_style (line 2070) | def get_resource_style(self, ate: ARSCResTableEntry) -> list:
    method get_packages_names (line 2073) | def get_packages_names(self) -> list[str]:
    method get_locales (line 2080) | def get_locales(self, package_name: str) -> list[str]:
    method get_types (line 2090) | def get_types(
    method get_public_resources (line 2104) | def get_public_resources(
    method get_string_resources (line 2136) | def get_string_resources(
    method get_strings_resources (line 2168) | def get_strings_resources(self) -> bytes:
    method get_id_resources (line 2205) | def get_id_resources(
    method get_bool_resources (line 2239) | def get_bool_resources(
    method get_integer_resources (line 2268) | def get_integer_resources(
    method get_color_resources (line 2297) | def get_color_resources(
    method get_dimen_resources (line 2326) | def get_dimen_resources(
    method get_id (line 2355) | def get_id(
    class ResourceResolver (line 2377) | class ResourceResolver:
      method __init__ (line 2383) | def __init__(
      method resolve (line 2395) | def resolve(self, res_id: int) -> list[tuple[ARSCResTableConfig, str]]:
      method _resolve_into_result (line 2406) | def _resolve_into_result(self, result, res_id, config):
      method put_ate_value (line 2414) | def put_ate_value(
      method put_item_value (line 2447) | def put_item_value(
    method get_resolved_res_configs (line 2494) | def get_resolved_res_configs(
    method get_resolved_strings (line 2512) | def get_resolved_strings(self) -> list[str]:
    method get_res_configs (line 2547) | def get_res_configs(
    method get_string (line 2603) | def get_string(
    method get_res_id_by_key (line 2615) | def get_res_id_by_key(self, package_name, resource_type, key):
    method get_items (line 2621) | def get_items(self, package_name):
    method get_type_configs (line 2625) | def get_type_configs(self, package_name, type_name=None):
    method parse_id (line 2641) | def parse_id(name: str) -> tuple[str, str]:
    method get_resource_xml_name (line 2678) | def get_resource_xml_name(
  class PackageContext (line 2717) | class PackageContext:
    method __init__ (line 2718) | def __init__(
    method get_mResId (line 2736) | def get_mResId(self) -> int:
    method set_mResId (line 2739) | def set_mResId(self, mResId: int) -> None:
    method get_package_name (line 2742) | def get_package_name(self) -> str:
    method __repr__ (line 2745) | def __repr__(self):
  class ARSCHeader (line 2754) | class ARSCHeader:
    method __init__ (line 2773) | def __init__(
    method type (line 2853) | def type(self) -> int:
    method header_size (line 2860) | def header_size(self) -> int:
    method size (line 2869) | def size(self) -> int:
    method end (line 2880) | def end(self) -> int:
    method __repr__ (line 2887) | def __repr__(self):
  class ARSCResTablePackage (line 2893) | class ARSCResTablePackage:
    method __init__ (line 2900) | def __init__(self, buff: BinaryIO, header: ARSCHeader) -> None:
    method get_name (line 2911) | def get_name(self) -> None:
  class ARSCResTypeSpec (line 2917) | class ARSCResTypeSpec:
    method __init__ (line 2922) | def __init__(
  class ARSCResType (line 2945) | class ARSCResType:
    method __init__ (line 2953) | def __init__(
    method get_type (line 2975) | def get_type(self) -> str:
    method get_package_name (line 2978) | def get_package_name(self) -> str:
    method __repr__ (line 2981) | def __repr__(self):
  class ARSCResTableConfig (line 2996) | class ARSCResTableConfig:
    method default_config (line 3007) | def default_config(cls):
    method __init__ (line 3012) | def __init__(self, buff: Union[BinaryIO, None] = None, **kwargs) -> None:
    method _unpack_language_or_region (line 3180) | def _unpack_language_or_region(self, char_in, char_base):
    method _pack_language_or_region (line 3196) | def _pack_language_or_region(self, char_in: str) -> list[int]:
    method set_language_and_region (line 3204) | def set_language_and_region(self, language_region):
    method get_language_and_region (line 3221) | def get_language_and_region(self) -> str:
    method get_config_name_friendly (line 3244) | def get_config_name_friendly(self) -> str:
    method get_qualifier (line 3253) | def get_qualifier(self) -> str:
    method get_language (line 3483) | def get_language(self) -> str:
    method get_country (line 3487) | def get_country(self) -> str:
    method get_density (line 3491) | def get_density(self) -> str:
    method is_default (line 3495) | def is_default(self) -> bool:
    method _get_tuple (line 3504) | def _get_tuple(self):
    method __hash__ (line 3517) | def __hash__(self):
    method __eq__ (line 3520) | def __eq__(self, other):
    method __repr__ (line 3523) | def __repr__(self):
  class ARSCResTableEntry (line 3529) | class ARSCResTableEntry:
    method __init__ (line 3553) | def __init__(
    method get_index (line 3583) | def get_index(self) -> int:
    method get_value (line 3586) | def get_value(self) -> str:
    method get_key_data (line 3589) | def get_key_data(self) -> str:
    method is_public (line 3595) | def is_public(self) -> bool:
    method is_complex (line 3598) | def is_complex(self) -> bool:
    method is_compact (line 3601) | def is_compact(self) -> bool:
    method is_weak (line 3604) | def is_weak(self) -> bool:
    method __repr__ (line 3607) | def __repr__(self):
  class ARSCComplex (line 3616) | class ARSCComplex:
    method __init__ (line 3627) | def __init__(
    method __repr__ (line 3656) | def __repr__(self):
  class ARSCResStringPoolRef (line 3662) | class ARSCResStringPoolRef:
    method __init__ (line 3670) | def __init__(
    method get_data_value (line 3687) | def get_data_value(self) -> str:
    method get_data (line 3690) | def get_data(self) -> int:
    method get_data_type (line 3693) | def get_data_type(self) -> bytes:
    method get_data_type_string (line 3696) | def get_data_type_string(self) -> str:
    method format_value (line 3699) | def format_value(self) -> str:
    method is_reference (line 3707) | def is_reference(self) -> bool:
    method __repr__ (line 3713) | def __repr__(self):
  function get_arsc_info (line 3722) | def get_arsc_info(arscobj: ARSCParser) -> str:

FILE: libs/androguard/core/bytecode.py
  function _PrintBanner (line 24) | def _PrintBanner():
  function _PrintSubBanner (line 29) | def _PrintSubBanner(title=None):
  function _PrintNote (line 37) | def _PrintNote(note, tab=0):
  function _Print (line 46) | def _Print(name, arg):
  function PrettyShowEx (line 60) | def PrettyShowEx(exceptions):
  function _PrintXRef (line 74) | def _PrintXRef(tag, items):
  function _PrintDRef (line 89) | def _PrintDRef(tag, items):
  function _PrintDefault (line 104) | def _PrintDefault(msg):
  function _colorize_operands (line 109) | def _colorize_operands(operands, colors):
  function PrettyShow (line 153) | def PrettyShow(basic_blocks: list[DEXBasicBlock], notes: list = []) -> N...
  function _get_operand_html (line 264) | def _get_operand_html(operand, registers_colors, colors):
  function method2dot (line 327) | def method2dot(
  function method2format (line 565) | def method2format(
  function method2png (line 655) | def method2png(
  function method2jpg (line 672) | def method2jpg(
  function vm2json (line 689) | def vm2json(vm: DEX) -> str:
  class TmpBlock (line 711) | class TmpBlock:
    method __init__ (line 712) | def __init__(self, name: str) -> None:
    method get_name (line 715) | def get_name(self) -> str:
  function method2json (line 719) | def method2json(mx: MethodAnalysis, directed_graph: bool = False) -> str:
  function method2json_undirect (line 732) | def method2json_undirect(mx: MethodAnalysis) -> str:
  function method2json_direct (line 774) | def method2json_direct(mx: MethodAnalysis) -> str:
  function object_to_bytes (line 894) | def object_to_bytes(obj: Union[str, bool, int, bytearray]) -> bytearray:
  function FormatClassToJava (line 916) | def FormatClassToJava(i: str) -> str:
  function FormatClassToPython (line 931) | def FormatClassToPython(i: str) -> str:
  function get_package_class_name (line 951) | def get_package_class_name(name: str) -> tuple[str, str]:
  function FormatNameToPython (line 996) | def FormatNameToPython(i: str) -> str:
  function FormatDescriptorToPython (line 1017) | def FormatDescriptorToPython(i: str) -> str:
  class Node (line 1041) | class Node:
    method __init__ (line 1042) | def __init__(self, n, s):

FILE: libs/androguard/core/dex/__init__.py
  class InvalidInstruction (line 105) | class InvalidInstruction(Exception):
  function read_null_terminated_string (line 109) | def read_null_terminated_string(f: IO) -> bytearray:
  function get_access_flags_string (line 130) | def get_access_flags_string(value: int) -> str:
  function get_type (line 146) | def get_type(atype: str, size: Union[int, None] = None) -> str:
  function clean_name_instruction (line 197) | def clean_name_instruction(instruction: Instruction) -> str:
  function static_operand_instruction (line 208) | def static_operand_instruction(instruction: Instruction) -> str:
  function get_sbyte (line 224) | def get_sbyte(cm: ClassManager, buff: BinaryIO) -> int:
  function get_byte (line 228) | def get_byte(cm: ClassManager, buff: BinaryIO) -> int:
  function readuleb128 (line 232) | def readuleb128(cm: ClassManager, buff: BinaryIO) -> int:
  function readuleb128p1 (line 258) | def readuleb128p1(cm: ClassManager, buff: BinaryIO) -> int:
  function readsleb128 (line 269) | def readsleb128(cm: ClassManager, buff: BinaryIO) -> int:
  function writeuleb128 (line 295) | def writeuleb128(cm: ClassManager, value: int) -> bytearray:
  function writesleb128 (line 321) | def writesleb128(cm: ClassManager, value: int) -> bytearray:
  function determineNext (line 350) | def determineNext(i: Instruction, cur_idx: int, m: EncodedMethod) -> list:
  function determineException (line 425) | def determineException(vm: DEX, m: EncodedMethod) -> list[list]:
  class HeaderItem (line 498) | class HeaderItem:
    method __init__ (line 510) | def __init__(self, size, buff: BinaryIO, cm: ClassManager) -> None:
    method get_obj (line 623) | def get_obj(self) -> bytes:
    method get_raw (line 705) | def get_raw(self) -> bytes:
    method get_length (line 708) | def get_length(self) -> int:
    method show (line 711) | def show(self) -> None:
    method __repr__ (line 757) | def __repr__(self):
    method __str__ (line 760) | def __str__(self):
    method set_off (line 793) | def set_off(self, off: int) -> None:
    method get_off (line 796) | def get_off(self) -> int:
  class AnnotationOffItem (line 800) | class AnnotationOffItem:
    method __init__ (line 808) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_annotation_off (line 812) | def get_annotation_off(self) -> int:
    method show (line 815) | def show(self):
    method get_obj (line 819) | def get_obj(self) -> bytes:
    method get_raw (line 827) | def get_raw(self) -> bytes:
    method get_length (line 830) | def get_length(self) -> int:
    method get_annotation_item (line 833) | def get_annotation_item(self) -> AnnotationItem:
  class AnnotationSetItem (line 837) | class AnnotationSetItem:
    method __init__ (line 845) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_annotation_off_item (line 854) | def get_annotation_off_item(self) -> list[AnnotationOffItem]:
    method set_off (line 862) | def set_off(self, off: int) -> None:
    method get_off (line 865) | def get_off(self) -> int:
    method show (line 868) | def show(self) -> None:
    method get_obj (line 873) | def get_obj(self) -> bytes:
    method get_raw (line 876) | def get_raw(self) -> bytes:
    method get_length (line 881) | def get_length(self) -> int:
  class AnnotationSetRefItem (line 890) | class AnnotationSetRefItem:
    method __init__ (line 895) | def __init__(self, buff: BinaryIO, cm:ClassManager) -> None:
    method get_annotations_off (line 903) | def get_annotations_off(self) -> int:
    method show (line 912) | def show(self) -> str:
    method get_obj (line 916) | def get_obj(self) -> bytes:
    method get_raw (line 924) | def get_raw(self) -> bytes:
  class AnnotationSetRefList (line 928) | class AnnotationSetRefList:
    method __init__ (line 933) | def __init__(self, buff: BinaryIO, cm:ClassManager) -> None:
    method get_list (line 945) | def get_list(self) -> list[AnnotationSetRefItem]:
    method get_off (line 953) | def get_off(self) -> int:
    method set_off (line 956) | def set_off(self, off: int) -> None:
    method show (line 959) | def show(self) -> None:
    method get_obj (line 964) | def get_obj(self) -> list[AnnotationSetRefItem]:
    method get_raw (line 967) | def get_raw(self) -> bytes:
    method get_length (line 972) | def get_length(self) -> int:
  class FieldAnnotation (line 976) | class FieldAnnotation:
    method __init__ (line 984) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_field_idx (line 992) | def get_field_idx(self) -> int:
    method get_annotations_off (line 1000) | def get_annotations_off(self) -> int:
    method set_off (line 1008) | def set_off(self, off: int) -> None:
    method get_off (line 1011) | def get_off(self) -> int:
    method show (line 1014) | def show(self) -> None:
    method get_obj (line 1021) | def get_obj(self) -> bytes:
    method get_raw (line 1029) | def get_raw(self) -> bytes:
    method get_length (line 1032) | def get_length(self) -> int:
  class MethodAnnotation (line 1036) | class MethodAnnotation:
    method __init__ (line 1044) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_method_idx (line 1052) | def get_method_idx(self) -> int:
    method get_annotations_off (line 1060) | def get_annotations_off(self) -> int:
    method set_off (line 1068) | def set_off(self, off: int) -> None:
    method get_off (line 1071) | def get_off(self) -> int:
    method show (line 1074) | def show(self) -> None:
    method get_obj (line 1081) | def get_obj(self) -> bytes:
    method get_raw (line 1089) | def get_raw(self) -> bytes:
    method get_length (line 1092) | def get_length(self) -> int:
  class ParameterAnnotation (line 1096) | class ParameterAnnotation:
    method __init__ (line 1104) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_method_idx (line 1112) | def get_method_idx(self) -> int:
    method get_annotations_off (line 1120) | def get_annotations_off(self) -> int:
    method set_off (line 1128) | def set_off(self, off: int) -> None:
    method get_off (line 1131) | def get_off(self) -> int:
    method show (line 1134) | def show(self) -> None:
    method get_obj (line 1141) | def get_obj(self) -> bytes:
    method get_raw (line 1149) | def get_raw(self) -> bytes:
    method get_length (line 1152) | def get_length(self) -> int:
  class AnnotationsDirectoryItem (line 1156) | class AnnotationsDirectoryItem:
    method __init__ (line 1161) | def __init__(self, buff: BinaryIO, cm:ClassManager) -> None:
    method get_class_annotations_off (line 1192) | def get_class_annotations_off(self) -> int:
    method get_annotation_set_item (line 1201) | def get_annotation_set_item(self) -> list[AnnotationSetItem]:
    method get_annotated_fields_size (line 1204) | def get_annotated_fields_size(self) -> int:
    method get_annotated_methods_size (line 1212) | def get_annotated_methods_size(self) -> int:
    method get_annotated_parameters_size (line 1220) | def get_annotated_parameters_size(self) -> int:
    method get_field_annotations (line 1228) | def get_field_annotations(self) -> list[FieldAnnotation]:
    method get_method_annotations (line 1236) | def get_method_annotations(self) -> list[MethodAnnotation]:
    method get_parameter_annotations (line 1244) | def get_parameter_annotations(self) -> list[ParameterAnnotation]:
    method set_off (line 1252) | def set_off(self, off: int) -> None:
    method get_off (line 1255) | def get_off(self) -> int:
    method show (line 1258) | def show(self) -> None:
    method get_obj (line 1279) | def get_obj(self) -> bytes:
    method get_raw (line 1292) | def get_raw(self) -> bytes:
    method get_length (line 1300) | def get_length(self) -> int:
  class HiddenApiClassDataItem (line 1314) | class HiddenApiClassDataItem:
    class RestrictionApiFlag (line 1322) | class RestrictionApiFlag(IntEnum):
    class DomapiApiFlag (line 1331) | class DomapiApiFlag(IntEnum):
    method __init__ (line 1336) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_section_size (line 1364) | def get_section_size(self):
    method get_flags (line 1372) | def get_flags(self, idx) -> tuple[RestrictionApiFlag, DomapiApiFlag]:
    method set_off (line 1382) | def set_off(self, off: int):
    method get_off (line 1385) | def get_off(self):
    method show (line 1388) | def show(self):
    method get_obj (line 1395) | def get_obj(self):
    method get_raw (line 1409) | def get_raw(self):
    method get_length (line 1412) | def get_length(self):
  class TypeItem (line 1416) | class TypeItem:
    method __init__ (line 1424) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_type_idx (line 1428) | def get_type_idx(self):
    method get_string (line 1436) | def get_string(self):
    method show (line 1444) | def show(self):
    method get_obj (line 1448) | def get_obj(self):
    method get_raw (line 1451) | def get_raw(self):
    method get_length (line 1454) | def get_length(self):
  class TypeList (line 1458) | class TypeList:
    method __init__ (line 1466) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_pad (line 1479) | def get_pad(self):
    method get_type_list_off (line 1487) | def get_type_list_off(self):
    method get_string (line 1495) | def get_string(self):
    method get_size (line 1503) | def get_size(self):
    method get_list (line 1511) | def get_list(self):
    method set_off (line 1519) | def set_off(self, off: int):
    method get_off (line 1522) | def get_off(self):
    method show (line 1525) | def show(self):
    method get_obj (line 1532) | def get_obj(self):
    method get_raw (line 1535) | def get_raw(self):
    method get_length (line 1538) | def get_length(self):
  class DBGBytecode (line 1547) | class DBGBytecode:
    method __init__ (line 1548) | def __init__(self, cm, op_value):
    method get_op_value (line 1553) | def get_op_value(self):
    method add (line 1556) | def add(self, value, ttype):
    method get_value (line 1559) | def get_value(self):
    method show (line 1567) | def show(self):
    method get_obj (line 1575) | def get_obj(self):
    method get_raw (line 1578) | def get_raw(self):
  class DebugInfoItem (line 1588) | class DebugInfoItem:
    method __init__ (line 1589) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_parameters_size (line 1639) | def get_parameters_size(self):
    method get_line_start (line 1642) | def get_line_start(self):
    method get_parameter_names (line 1645) | def get_parameter_names(self):
    method get_translated_parameter_names (line 1648) | def get_translated_parameter_names(self):
    method get_bytecodes (line 1657) | def get_bytecodes(self):
    method show (line 1660) | def show(self):
    method get_raw (line 1676) | def get_raw(self):
    method get_off (line 1683) | def get_off(self):
  class DebugInfoItemEmpty (line 1687) | class DebugInfoItemEmpty:
    method __init__ (line 1688) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method set_off (line 1697) | def set_off(self, off: int):
    method get_off (line 1700) | def get_off(self):
    method reload (line 1703) | def reload(self):
    method show (line 1713) | def show(self):
    method get_obj (line 1716) | def get_obj(self):
    method get_raw (line 1719) | def get_raw(self):
    method get_length (line 1722) | def get_length(self):
  class EncodedArray (line 1726) | class EncodedArray:
    method __init__ (line 1731) | def __init__(self, buff: BinaryIO, cm:ClassManager) -> None:
    method get_size (line 1743) | def get_size(self):
    method get_values (line 1751) | def get_values(self) -> list[EncodedValue]:
    method show (line 1760) | def show(self):
    method get_obj (line 1767) | def get_obj(self):
    method get_raw (line 1770) | def get_raw(self) -> bytes:
    method get_length (line 1773) | def get_length(self):
  class EncodedValue (line 1781) | class EncodedValue:
    method __init__ (line 1785) | def __init__(self, buff: BinaryIO, cm:ClassManager) -> None:
    method get_value (line 1845) | def get_value(self):
    method get_value_type (line 1854) | def get_value_type(self):
    method get_value_arg (line 1857) | def get_value_arg(self):
    method _getintvalue (line 1860) | def _getintvalue(self, buf):
    method show (line 1869) | def show(self):
    method get_obj (line 1876) | def get_obj(self):
    method get_raw (line 1881) | def get_raw(self):
    method get_length (line 1891) | def get_length(self):
  class AnnotationElement (line 1895) | class AnnotationElement:
    method __init__ (line 1903) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_name_idx (line 1910) | def get_name_idx(self) -> int:
    method get_value (line 1918) | def get_value(self) -> EncodedValue:
    method show (line 1926) | def show(self):
    method get_obj (line 1931) | def get_obj(self):
    method get_raw (line 1934) | def get_raw(self):
    method get_length (line 1937) | def get_length(self):
  class EncodedAnnotation (line 1941) | class EncodedAnnotation:
    method __init__ (line 1946) | def __init__(self, buff: BinaryIO, cm:ClassManager) -> None:
    method get_type_idx (line 1959) | def get_type_idx(self):
    method get_size (line 1967) | def get_size(self):
    method get_elements (line 1975) | def get_elements(self):
    method show (line 1983) | def show(self):
    method get_obj (line 1992) | def get_obj(self):
    method get_raw (line 1995) | def get_raw(self):
    method get_length (line 2002) | def get_length(self):
  class AnnotationItem (line 2014) | class AnnotationItem:
    method __init__ (line 2019) | def __init__(self, buff: BinaryIO, cm:ClassManager) -> None:
    method get_visibility (line 2031) | def get_visibility(self) -> int:
    method get_annotation (line 2039) | def get_annotation(self) -> EncodedAnnotation:
    method set_off (line 2047) | def set_off(self, off: int) -> None:
    method get_off (line 2050) | def get_off(self) -> int:
    method show (line 2053) | def show(self) -> None:
    method get_obj (line 2058) | def get_obj(self) -> list[EncodedAnnotation]:
    method get_raw (line 2061) | def get_raw(self) -> bytes:
    method get_length (line 2067) | def get_length(self) -> int:
  class EncodedArrayItem (line 2071) | class EncodedArrayItem:
    method __init__ (line 2076) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_value (line 2086) | def get_value(self) -> EncodedArray:
    method set_off (line 2094) | def set_off(self, off: int) -> None:
    method show (line 2097) | def show(self) -> None:
    method get_obj (line 2101) | def get_obj(self) -> list[EncodedArray]:
    method get_raw (line 2104) | def get_raw(self) -> bytes:
    method get_length (line 2107) | def get_length(self) -> int:
    method get_off (line 2110) | def get_off(self) -> int:
  class StringDataItem (line 2114) | class StringDataItem:
    method __init__ (line 2135) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_utf16_size (line 2148) | def get_utf16_size(self) -> int:
    method get_data (line 2156) | def get_data(self) -> str:
    method set_off (line 2164) | def set_off(self, off: int) -> None:
    method get_off (line 2167) | def get_off(self) -> int:
    method get (line 2170) | def get(self) -> str:
    method show (line 2182) | def show(self) -> None:
    method get_obj (line 2188) | def get_obj(self) -> list:
    method get_raw (line 2191) | def get_raw(self) -> bytes:
    method get_length (line 2200) | def get_length(self) -> int:
  class StringIdItem (line 2210) | class StringIdItem:
    method __init__ (line 2215) | def __init__(self, buff: BinaryIO, cm: ClassManager):
    method get_string_data_off (line 2225) | def get_string_data_off(self) -> int:
    method set_off (line 2233) | def set_off(self, off: int) -> None:
    method get_off (line 2236) | def get_off(self) -> int:
    method show (line 2239) | def show(self) -> None:
    method get_obj (line 2243) | def get_obj(self) -> bytes:
    method get_raw (line 2251) | def get_raw(self) -> bytes:
    method get_length (line 2254) | def get_length(self) -> int:
  class TypeIdItem (line 2258) | class TypeIdItem:
    method __init__ (line 2263) | def __init__(self, buff: BinaryIO, cm: ClassManager):
    method get_descriptor_idx (line 2274) | def get_descriptor_idx(self) -> int:
    method get_descriptor_idx_value (line 2282) | def get_descriptor_idx_value(self) -> str:
    method show (line 2290) | def show(self) -> None:
    method get_obj (line 2297) | def get_obj(self) -> bytes:
    method get_raw (line 2300) | def get_raw(self) -> bytes:
    method get_length (line 2303) | def get_length(self) -> int:
  class TypeHIdItem (line 2307) | class TypeHIdItem:
    method __init__ (line 2312) | def __init__(self, size: int, buff: BinaryIO, cm: ClassManager) -> None:
    method get_type (line 2323) | def get_type(self) -> list[TypeIdItem]:
    method get (line 2331) | def get(self, idx: int) -> int:
    method set_off (line 2337) | def set_off(self, off: int) -> None:
    method get_off (line 2340) | def get_off(self) -> int:
    method show (line 2343) | def show(self) -> None:
    method get_obj (line 2348) | def get_obj(self) -> list[TypeIdItem]:
    method get_raw (line 2351) | def get_raw(self) -> bytes:
    method get_length (line 2354) | def get_length(self) -> int:
  class ProtoIdItem (line 2361) | class ProtoIdItem:
    method __init__ (line 2366) | def __init__(self, buff: BinaryIO, cm: ClassManager):
    method get_shorty_idx (line 2382) | def get_shorty_idx(self) -> int:
    method get_return_type_idx (line 2390) | def get_return_type_idx(self) -> int:
    method get_parameters_off (line 2398) | def get_parameters_off(self) -> int:
    method get_shorty_idx_value (line 2406) | def get_shorty_idx_value(self) -> str:
    method get_return_type_idx_value (line 2416) | def get_return_type_idx_value(self) -> str:
    method get_parameters_off_value (line 2426) | def get_parameters_off_value(self) -> str:
    method show (line 2437) | def show(self) -> None:
    method get_obj (line 2452) | def get_obj(self) -> bytes:
    method get_raw (line 2462) | def get_raw(self) -> bytes:
    method get_length (line 2465) | def get_length(self) -> int:
  class ProtoHIdItem (line 2469) | class ProtoHIdItem:
    method __init__ (line 2474) | def __init__(self, size:int, buff: BinaryIO, cm:ClassManager) -> None:
    method set_off (line 2485) | def set_off(self, off: int) -> None:
    method get_off (line 2488) | def get_off(self) -> int:
    method get (line 2491) | def get(self, idx: int) -> ProtoIdItem:
    method show (line 2497) | def show(self) -> None:
    method get_obj (line 2502) | def get_obj(self) -> list[ProtoIdItem]:
    method get_raw (line 2505) | def get_raw(self) -> bytes:
    method get_length (line 2508) | def get_length(self) -> int:
  class FieldIdItem (line 2515) | class FieldIdItem:
    method __init__ (line 2520) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method reload (line 2534) | def reload(self) -> None:
    method get_class_idx (line 2539) | def get_class_idx(self) -> int:
    method get_type_idx (line 2547) | def get_type_idx(self) -> int:
    method get_name_idx (line 2555) | def get_name_idx(self) -> int:
    method get_class_name (line 2563) | def get_class_name(self) -> str:
    method get_type (line 2573) | def get_type(self) -> str:
    method get_descriptor (line 2583) | def get_descriptor(self) -> str:
    method get_name (line 2593) | def get_name(self) -> str:
    method get_list (line 2603) | def get_list(self) -> list[str]:
    method show (line 2606) | def show(self) -> None:
    method get_obj (line 2617) | def get_obj(self) -> bytes:
    method get_raw (line 2622) | def get_raw(self) -> bytes:
    method get_length (line 2625) | def get_length(self) -> int:
  class FieldHIdItem (line 2629) | class FieldHIdItem:
    method __init__ (line 2634) | def __init__(self, size:int, buff: BinaryIO, cm:ClassManager) -> None:
    method set_off (line 2643) | def set_off(self, off: int) -> None:
    method get_off (line 2646) | def get_off(self) -> int:
    method gets (line 2649) | def gets(self) -> list[FieldIdItem]:
    method get (line 2652) | def get(self, idx: int) -> Union[FieldIdItem, FieldIdItemInvalid]:
    method show (line 2658) | def show(self) -> None:
    method get_obj (line 2665) | def get_obj(self) -> list[FieldIdItem]:
    method get_raw (line 2668) | def get_raw(self) -> bytes:
    method get_length (line 2671) | def get_length(self) -> int:
  class MethodIdItem (line 2678) | class MethodIdItem:
    method __init__ (line 2683) | def __init__(self, buff: BinaryIO, cm:ClassManager) -> None:
    method reload (line 2697) | def reload(self) -> None:
    method get_class_idx (line 2702) | def get_class_idx(self) -> int:
    method get_proto_idx (line 2710) | def get_proto_idx(self) -> int:
    method get_name_idx (line 2718) | def get_name_idx(self) -> int:
    method get_class_name (line 2726) | def get_class_name(self) -> str:
    method get_proto (line 2737) | def get_proto(self) -> str:
    method get_descriptor (line 2748) | def get_descriptor(self) -> str:
    method get_real_descriptor (line 2757) | def get_real_descriptor(self) -> str:
    method get_name (line 2766) | def get_name(self) -> str:
    method get_list (line 2776) | def get_list(self) -> list[str]:
    method get_triple (line 2779) | def get_triple(self) -> tuple[str, str, str]:
    method show (line 2786) | def show(self) -> None:
    method get_obj (line 2797) | def get_obj(self) -> bytes:
    method get_raw (line 2802) | def get_raw(self) -> bytes:
    method get_length (line 2805) | def get_length(self) -> int:
  class MethodHIdItem (line 2809) | class MethodHIdItem:
    method __init__ (line 2815) | def __init__(self, size:int, buff: BinaryIO, cm:ClassManager) -> None:
    method set_off (line 2826) | def set_off(self, off: int):
    method get_off (line 2829) | def get_off(self) -> int:
    method gets (line 2832) | def gets(self) -> list[MethodIdItem]:
    method get (line 2835) | def get(self, idx) -> Union[MethodIdItem, MethodIdItemInvalid]:
    method reload (line 2841) | def reload(self) -> None:
    method show (line 2845) | def show(self) -> None:
    method get_obj (line 2853) | def get_obj(self) -> list[MethodIdItem]:
    method get_raw (line 2856) | def get_raw(self) -> bytes:
    method get_length (line 2859) | def get_length(self) -> int:
  class ProtoIdItemInvalid (line 2866) | class ProtoIdItemInvalid:
    method get_params (line 2867) | def get_params(self) -> str:
    method get_shorty (line 2870) | def get_shorty(self) -> str:
    method get_return_type (line 2873) | def get_return_type(self) -> str:
    method show (line 2876) | def show(self) -> None:
  class FieldIdItemInvalid (line 2885) | class FieldIdItemInvalid:
    method get_class_name (line 2886) | def get_class_name(self) -> str:
    method get_type (line 2889) | def get_type(self) -> str:
    method get_descriptor (line 2892) | def get_descriptor(self) -> str:
    method get_name (line 2895) | def get_name(self) -> str:
    method get_list (line 2898) | def get_list(self) -> list[str]:
    method show (line 2901) | def show(self) -> None:
  class MethodIdItemInvalid (line 2905) | class MethodIdItemInvalid:
    method get_class_name (line 2906) | def get_class_name(self) -> str:
    method get_descriptor (line 2909) | def get_descriptor(self) -> str:
    method get_proto (line 2912) | def get_proto(self) -> str:
    method get_name (line 2915) | def get_name(self) -> str:
    method get_list (line 2918) | def get_list(self) -> list[str]:
    method show (line 2921) | def show(self) -> None:
  class EncodedField (line 2925) | class EncodedField:
    method __init__ (line 2930) | def __init__(self, buff: BinaryIO, cm:ClassManager) -> None:
    method load (line 2951) | def load(self) -> None:
    method reload (line 2957) | def reload(self) -> None:
    method set_init_value (line 2963) | def set_init_value(self, value: EncodedValue) -> None:
    method get_init_value (line 2971) | def get_init_value(self) -> EncodedValue:
    method adjust_idx (line 2979) | def adjust_idx(self, val: int) -> None:
    method get_field_idx_diff (line 2982) | def get_field_idx_diff(self) -> int:
    method get_field_idx (line 2991) | def get_field_idx(self) -> int:
    method get_access_flags (line 2999) | def get_access_flags(self) -> int:
    method get_class_name (line 3007) | def get_class_name(self) -> str:
    method get_descriptor (line 3017) | def get_descriptor(self) -> str:
    method get_name (line 3029) | def get_name(self) -> str:
    method get_access_flags_string (line 3039) | def get_access_flags_string(self) -> str:
    method set_name (line 3063) | def set_name(self, value: str) -> None:
    method get_obj (line 3067) | def get_obj(self) -> list:
    method get_raw (line 3070) | def get_raw(self) -> bytes:
    method get_size (line 3075) | def get_size(self) -> bytes:
    method show (line 3078) | def show(self) -> None:
    method __str__ (line 3098) | def __str__(self):
  class EncodedMethod (line 3107) | class EncodedMethod:
    method __init__ (line 3112) | def __init__(self, buff: BinaryIO, cm:ClassManager) -> None:
    method adjust_idx (line 3141) | def adjust_idx(self, val: int) -> None:
    method get_method_idx (line 3144) | def get_method_idx(self) -> int:
    method get_method_idx_diff (line 3152) | def get_method_idx_diff(self) -> int:
    method get_access_flags (line 3161) | def get_access_flags(self) -> int:
    method get_code_off (line 3169) | def get_code_off(self) -> int:
    method get_address (line 3178) | def get_address(self) -> int:
    method get_access_flags_string (line 3187) | def get_access_flags_string(self) -> str:
    method load (line 3208) | def load(self) -> None:
    method reload (line 3214) | def reload(self) -> None:
    method get_locals (line 3232) | def get_locals(self) -> int:
    method get_information (line 3245) | def get_information(self) -> dict[str, Union[str, tuple[int, int], lis...
    method each_params_by_register (line 3288) | def each_params_by_register(self, nb: int, proto: str) -> None:
    method __str__ (line 3324) | def __str__(self):
    method full_name (line 3334) | def full_name(self) -> str:
    method descriptor (line 3339) | def descriptor(self) -> str:
    method get_short_string (line 3343) | def get_short_string(self) -> str:
    method show_info (line 3382) | def show_info(self) -> None:
    method show (line 3396) | def show(self) -> None:
    method show_notes (line 3412) | def show_notes(self) -> None:
    method source (line 3422) | def source(self) -> str:
    method get_source (line 3430) | def get_source(self) -> str:
    method get_length (line 3433) | def get_length(self) -> int:
    method get_code (line 3443) | def get_code(self) -> Union[DalvikCode, None]:
    method is_cached_instructions (line 3454) | def is_cached_instructions(self) -> bool:
    method get_instructions (line 3460) | def get_instructions(self) -> Iterator[Instruction]:
    method get_instructions_idx (line 3470) | def get_instructions_idx(self) -> Iterator[tuple[int, Instruction]]:
    method set_instructions (line 3485) | def set_instructions(self, instructions: list[Instruction]) -> None:
    method get_instruction (line 3495) | def get_instruction(
    method get_debug (line 3510) | def get_debug(self) -> DebugInfoItem:
    method get_descriptor (line 3520) | def get_descriptor(self) -> str:
    method get_class_name (line 3546) | def get_class_name(self) -> str:
    method get_name (line 3556) | def get_name(self) -> str:
    method get_triple (line 3566) | def get_triple(self) -> tuple[str, str, str]:
    method add_inote (line 3569) | def add_inote(
    method add_note (line 3582) | def add_note(self, msg: str) -> None:
    method set_code_idx (line 3590) | def set_code_idx(self, idx: int) -> None:
    method set_name (line 3599) | def set_name(self, value):
    method get_raw (line 3603) | def get_raw(self):
    method get_size (line 3613) | def get_size(self):
  class ClassDataItem (line 3617) | class ClassDataItem:
    method __init__ (line 3622) | def __init__(self, buff: BinaryIO, cm:ClassManager) -> None:
    method get_static_fields_size (line 3666) | def get_static_fields_size(self) -> int:
    method get_instance_fields_size (line 3674) | def get_instance_fields_size(self) -> int:
    method get_direct_methods_size (line 3682) | def get_direct_methods_size(self) -> int:
    method get_virtual_methods_size (line 3690) | def get_virtual_methods_size(self) -> int:
    method get_static_fields (line 3698) | def get_static_fields(self) -> list[EncodedField]:
    method get_instance_fields (line 3706) | def get_instance_fields(self) -> list[EncodedField]:
    method get_direct_methods (line 3714) | def get_direct_methods(self) -> list[EncodedMethod]:
    method get_virtual_methods (line 3722) | def get_virtual_methods(self) -> list[EncodedMethod]:
    method get_methods (line 3732) | def get_methods(self) -> list[EncodedMethod]:
    method get_fields (line 3742) | def get_fields(self) -> list[EncodedField]:
    method set_off (line 3752) | def set_off(self, off: int):
    method set_static_fields (line 3755) | def set_static_fields(self, value):
    method _load_elements (line 3762) | def _load_elements(self, size, l, Type, buff, cm):
    method show (line 3775) | def show(self):
    method get_obj (line 3803) | def get_obj(self):
    method get_raw (line 3811) | def get_raw(self):
    method get_length (line 3825) | def get_length(self):
    method get_off (line 3847) | def get_off(self):
  class ClassDefItem (line 3851) | class ClassDefItem:
    method __init__ (line 3856) | def __init__(self, buff: BinaryIO, cm:ClassManager) -> None:
    method reload (line 3886) | def reload(self) -> None:
    method __str__ (line 3911) | def __str__(self):
    method __repr__ (line 3914) | def __repr__(self):
    method get_methods (line 3917) | def get_methods(self) -> list[EncodedMethod]:
    method get_fields (line 3927) | def get_fields(self) -> list[EncodedField]:
    method _get_annotation_type_ids (line 3937) | def _get_annotation_type_ids(self) -> list[EncodedAnnotation]:
    method get_annotations (line 3961) | def get_annotations(self) -> list[str]:
    method get_class_idx (line 3975) | def get_class_idx(self) -> int:
    method get_access_flags (line 3983) | def get_access_flags(self) -> int:
    method get_superclass_idx (line 3991) | def get_superclass_idx(self) -> int:
    method get_interfaces_off (line 3999) | def get_interfaces_off(self) -> int:
    method get_source_file_idx (line 4007) | def get_source_file_idx(self) -> int:
    method get_annotations_off (line 4016) | def get_annotations_off(self) -> int:
    method get_class_data_off (line 4025) | def get_class_data_off(self) -> int:
    method get_static_values_off (line 4034) | def get_static_values_off(self) -> int:
    method get_class_data (line 4043) | def get_class_data(self) -> ClassDataItem:
    method get_name (line 4051) | def get_name(self) -> str:
    method get_superclassname (line 4059) | def get_superclassname(self) -> str:
    method get_interfaces (line 4067) | def get_interfaces(self) -> list[str]:
    method get_access_flags_string (line 4075) | def get_access_flags_string(self) -> str:
    method show (line 4090) | def show(self) -> None:
    method source (line 4117) | def source(self) -> None:
    method get_source (line 4123) | def get_source(self) -> str:
    method get_source_ext (line 4130) | def get_source_ext(self) -> list[tuple[str, list]]:
    method get_ast (line 4133) | def get_ast(self):
    method set_name (line 4136) | def set_name(self, value):
    method get_obj (line 4139) | def get_obj(self):
    method get_raw (line 4171) | def get_raw(self):
    method get_length (line 4174) | def get_length(self):
  class ClassHDefItem (line 4178) | class ClassHDefItem:
    method __init__ (line 4186) | def __init__(self, size: int, buff: BinaryIO, cm: ClassManager) -> None:
    method set_off (line 4201) | def set_off(self, off: int) -> None:
    method get_off (line 4204) | def get_off(self) -> int:
    method get_class_idx (line 4207) | def get_class_idx(self, idx: int) -> ClassDefItem:
    method get_method (line 4218) | def get_method(
    method get_names (line 4236) | def get_names(self) -> list[str]:
    method show (line 4243) | def show(self) -> None:
    method get_obj (line 4247) | def get_obj(self) -> list[ClassDefItem]:
    method get_raw (line 4254) | def get_raw(self) -> bytes:
    method get_length (line 4257) | def get_length(self) -> int:
  class EncodedTypeAddrPair (line 4264) | class EncodedTypeAddrPair:
    method __init__ (line 4272) | def __init__(self, cm: ClassManager, buff: BinaryIO) -> None:
    method get_type_idx (line 4277) | def get_type_idx(self) -> int:
    method get_addr (line 4285) | def get_addr(self) -> int:
    method get_obj (line 4293) | def get_obj(self) -> list:
    method show (line 4296) | def show(self) -> None:
    method get_raw (line 4302) | def get_raw(self) -> bytearray:
    method get_length (line 4307) | def get_length(self) -> int:
  class EncodedCatchHandler (line 4311) | class EncodedCatchHandler:
    method __init__ (line 4319) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_size (line 4333) | def get_size(self) -> int:
    method get_handlers (line 4341) | def get_handlers(self) -> list[EncodedTypeAddrPair]:
    method get_catch_all_addr (line 4349) | def get_catch_all_addr(self) -> int:
    method get_off (line 4357) | def get_off(self) -> int:
    method set_off (line 4360) | def set_off(self, off: int) -> None:
    method show (line 4363) | def show(self) -> None:
    method get_raw (line 4373) | def get_raw(self) -> bytearray:
    method get_length (line 4384) | def get_length(self) -> int:
  class EncodedCatchHandlerList (line 4396) | class EncodedCatchHandlerList:
    method __init__ (line 4404) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_size (line 4411) | def get_size(self) -> int:
    method get_list (line 4419) | def get_list(self) -> list[EncodedCatchHandler]:
    method show (line 4427) | def show(self) -> None:
    method get_off (line 4434) | def get_off(self) -> int:
    method set_off (line 4437) | def set_off(self, off: int) -> None:
    method get_obj (line 4440) | def get_obj(self) -> bytearray:
    method get_raw (line 4443) | def get_raw(self) -> bytearray:
    method get_length (line 4450) | def get_length(self) -> int:
  function get_kind (line 4458) | def get_kind(cm: ClassManager, kind: int, value: int) -> str:
  class Instruction (line 4509) | class Instruction:
    method get_kind (line 4541) | def get_kind(self) -> int:
    method get_name (line 4554) | def get_name(self) -> str:
    method get_op_value (line 4564) | def get_op_value(self) -> int:
    method get_literals (line 4572) | def get_literals(self) -> list:
    method show (line 4582) | def show(self, idx: int) -> None:
    method show_buff (line 4590) | def show_buff(self, idx: int) -> str:
    method get_translated_kind (line 4598) | def get_translated_kind(self) -> str:
    method get_output (line 4606) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 4616) | def get_operands(self, idx:int=-1) -> list[tuple[Operand, object]]:
    method get_length (line 4629) | def get_length(self) -> int:
    method get_raw (line 4637) | def get_raw(self):
    method get_ref_kind (line 4645) | def get_ref_kind(self):
    method get_hex (line 4653) | def get_hex(self) -> str:
    method __str__ (line 4665) | def __str__(self):
    method disasm (line 4669) | def disasm(self) -> str:
  class FillArrayData (line 4678) | class FillArrayData:
    method __init__ (line 4686) | def __init__(self, cm: ClassManager, buff: BinaryIO) -> None:
    method add_note (line 4704) | def add_note(self, msg: str) -> None:
    method get_notes (line 4712) | def get_notes(self) -> list[str]:
    method get_op_value (line 4720) | def get_op_value(self) -> int:
    method get_data (line 4728) | def get_data(self) -> bytes:
    method get_output (line 4736) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 4752) | def get_operands(self, idx: int=-1) -> tuple[Operand, str]:
    method get_formatted_operands (line 4765) | def get_formatted_operands(self) -> None:
    method get_name (line 4768) | def get_name(self) -> str:
    method show_buff (line 4776) | def show_buff(self, pos: int) -> str:
    method show (line 4788) | def show(self, pos: int) -> None:
    method get_length (line 4796) | def get_length(self) -> int:
    method get_raw (line 4804) | def get_raw(self) -> bytes:
    method get_hex (line 4812) | def get_hex(self) -> str:
    method disasm (line 4819) | def disasm(self) -> str:
  class SparseSwitch (line 4824) | class SparseSwitch:
    method __init__ (line 4832) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method add_note (line 4852) | def add_note(self, msg: str) -> None:
    method get_notes (line 4860) | def get_notes(self) -> list[str]:
    method get_op_value (line 4868) | def get_op_value(self) -> int:
    method get_keys (line 4876) | def get_keys(self) -> list[int]:
    method get_values (line 4884) | def get_values(self) -> list[int]:
    method get_targets (line 4887) | def get_targets(self) -> list[int]:
    method get_output (line 4895) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 4903) | def get_operands(self, idx: int = -1) -> str:
    method get_formatted_operands (line 4911) | def get_formatted_operands(self) -> None:
    method get_name (line 4914) | def get_name(self) -> str:
    method show_buff (line 4922) | def show_buff(self, pos: int) -> str:
    method show (line 4934) | def show(self, pos) -> None:
    method get_length (line 4940) | def get_length(self) -> int:
    method get_raw (line 4943) | def get_raw(self) -> bytes:
    method get_hex (line 4950) | def get_hex(self) -> str:
    method disasm (line 4959) | def disasm(self) -> str:
  class PackedSwitch (line 4964) | class PackedSwitch:
    method __init__ (line 4972) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method add_note (line 4995) | def add_note(self, msg: str) -> None:
    method get_notes (line 5003) | def get_notes(self) -> list[str]:
    method get_op_value (line 5011) | def get_op_value(self) -> int:
    method get_keys (line 5019) | def get_keys(self) -> list[int]:
    method get_values (line 5027) | def get_values(self) -> list[int]:
    method get_targets (line 5030) | def get_targets(self) -> list[int]:
    method get_output (line 5038) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5048) | def get_operands(self, idx: int = -1) -> list:
    method get_formatted_operands (line 5056) | def get_formatted_operands(self) -> None:
    method get_name (line 5059) | def get_name(self) -> str:
    method show_buff (line 5067) | def show_buff(self, pos: int) -> str:
    method show (line 5081) | def show(self, pos: int) -> None:
    method get_length (line 5087) | def get_length(self) -> int:
    method get_raw (line 5090) | def get_raw(self) -> bytes:
    method get_hex (line 5095) | def get_hex(self) -> bytes:
    method disasm (line 5102) | def disasm(self) -> str:
  class Instruction35c (line 5107) | class Instruction35c(Instruction):
    method __init__ (line 5114) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5128) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5159) | def get_operands(self, idx: int = -1) -> list[tuple]:
    method get_ref_kind (line 5213) | def get_ref_kind(self) -> int:
    method get_raw (line 5216) | def get_raw(self) -> bytes:
  class Instruction10x (line 5224) | class Instruction10x(Instruction):
    method __init__ (line 5231) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_raw (line 5241) | def get_raw(self) -> bytes:
  class Instruction21h (line 5245) | class Instruction21h(Instruction):
    method __init__ (line 5252) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5270) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5273) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_literals (line 5276) | def get_literals(self) -> list[int]:
    method get_raw (line 5279) | def get_raw(self) -> bytes:
  class Instruction11n (line 5283) | class Instruction11n(Instruction):
    method __init__ (line 5290) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5299) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5302) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_literals (line 5305) | def get_literals(self) -> list[int]:
    method get_raw (line 5308) | def get_raw(self) -> bytes:
  class Instruction21c (line 5314) | class Instruction21c(Instruction):
    method __init__ (line 5321) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5328) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5334) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int, int]]:
    method get_ref_kind (line 5341) | def get_ref_kind(self) -> int:
    method get_string (line 5344) | def get_string(self) -> str:
    method get_raw_string (line 5347) | def get_raw_string(self) -> str:
    method get_raw (line 5350) | def get_raw(self) -> bytes:
  class Instruction21s (line 5354) | class Instruction21s(Instruction):
    method __init__ (line 5361) | def __init__(self, cm: ClassManager, buff: bytes) -> bytes:
    method get_output (line 5370) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5373) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_literals (line 5376) | def get_literals(self) -> list[int]:
    method get_raw (line 5379) | def get_raw(self) -> bytes:
  class Instruction22c (line 5383) | class Instruction22c(Instruction):
    method __init__ (line 5390) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5399) | def get_output(self, idx: int = -1):
    method get_operands (line 5403) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_kind (line 5411) | def get_ref_kind(self) -> int:
    method get_raw (line 5414) | def get_raw(self) -> int:
  class Instruction22cs (line 5420) | class Instruction22cs(Instruction):
    method __init__ (line 5427) | def __init__(self, cm: ClassManager, buff: bytes) -> str:
    method get_output (line 5436) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5440) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_kind (line 5448) | def get_ref_kind(self) -> int:
    method get_raw (line 5451) | def get_raw(self) -> bytes:
  class Instruction31t (line 5457) | class Instruction31t(Instruction):
    method __init__ (line 5464) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5472) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5475) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_off (line 5478) | def get_ref_off(self) -> int:
    method get_raw (line 5481) | def get_raw(self) -> bytes:
  class Instruction31c (line 5487) | class Instruction31c(Instruction):
    method __init__ (line 5494) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5501) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5505) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_kind (line 5512) | def get_ref_kind(self) -> int:
    method get_string (line 5515) | def get_string(self) -> str:
    method get_raw_string (line 5523) | def get_raw_string(self) -> str:
    method get_raw (line 5526) | def get_raw(self) -> bytes:
  class Instruction12x (line 5532) | class Instruction12x(Instruction):
    method __init__ (line 5539) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5548) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5551) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_raw (line 5554) | def get_raw(self) -> bytes:
  class Instruction11x (line 5560) | class Instruction11x(Instruction):
    method __init__ (line 5567) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5573) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5576) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_raw (line 5579) | def get_raw(self) -> bytes:
  class Instruction51l (line 5583) | class Instruction51l(Instruction):
    method __init__ (line 5590) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5599) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5602) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_literals (line 5608) | def get_literals(self) -> list[int]:
    method get_raw (line 5611) | def get_raw(self) -> bytes:
  class Instruction31i (line 5617) | class Instruction31i(Instruction):
    method __init__ (line 5624) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5635) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5639) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_literals (line 5642) | def get_literals(self) -> list[int]:
    method get_raw (line 5645) | def get_raw(self) -> bytes:
  class Instruction22x (line 5649) | class Instruction22x(Instruction):
    method __init__ (line 5656) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5664) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5667) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_raw (line 5670) | def get_raw(self) -> bytes:
  class Instruction23x (line 5674) | class Instruction23x(Instruction):
    method __init__ (line 5681) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5689) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5692) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_raw (line 5699) | def get_raw(self) -> bytes:
  class Instruction20t (line 5705) | class Instruction20t(Instruction):
    method __init__ (line 5712) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5724) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5728) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_off (line 5731) | def get_ref_off(self) -> int:
    method get_raw (line 5734) | def get_raw(self) -> bytes:
  class Instruction21t (line 5738) | class Instruction21t(Instruction):
    method __init__ (line 5745) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5753) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5756) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_off (line 5759) | def get_ref_off(self) -> int:
    method get_raw (line 5762) | def get_raw(self) -> bytes:
  class Instruction10t (line 5766) | class Instruction10t(Instruction):
    method __init__ (line 5773) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5779) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5783) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_off (line 5786) | def get_ref_off(self) -> int:
    method get_raw (line 5789) | def get_raw(self) -> bytes:
  class Instruction22t (line 5793) | class Instruction22t(Instruction):
    method __init__ (line 5800) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5809) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5812) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_off (line 5819) | def get_ref_off(self) -> int:
    method get_raw (line 5822) | def get_raw(self) -> bytes:
  class Instruction22s (line 5828) | class Instruction22s(Instruction):
    method __init__ (line 5835) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5844) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5847) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_literals (line 5854) | def get_literals(self) -> list[int]:
    method get_raw (line 5857) | def get_raw(self) -> bytes:
  class Instruction22b (line 5863) | class Instruction22b(Instruction):
    method __init__ (line 5870) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5878) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5881) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_literals (line 5888) | def get_literals(self) -> list[int]:
    method get_raw (line 5891) | def get_raw(self) -> bytes:
  class Instruction30t (line 5897) | class Instruction30t(Instruction):
    method __init__ (line 5904) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5916) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5919) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_off (line 5922) | def get_ref_off(self) -> int:
    method get_raw (line 5925) | def get_raw(self) -> bytes:
  class Instruction3rc (line 5929) | class Instruction3rc(Instruction):
    method __init__ (line 5936) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5946) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5954) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_kind (line 5961) | def get_ref_kind(self) -> int:
    method get_raw (line 5964) | def get_raw(self) -> bytes:
  class Instruction32x (line 5970) | class Instruction32x(Instruction):
    method __init__ (line 5977) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 5989) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 5992) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_raw (line 5995) | def get_raw(self) -> bytes:
  class Instruction20bc (line 5999) | class Instruction20bc(Instruction):
    method __init__ (line 6006) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 6014) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 6017) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_raw (line 6020) | def get_raw(self) -> bytes:
  class Instruction35mi (line 6024) | class Instruction35mi(Instruction):
    method __init__ (line 6031) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 6044) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 6071) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_kind (line 6123) | def get_ref_kind(self) -> int:
    method get_raw (line 6126) | def get_raw(self) -> bytes:
  class Instruction35ms (line 6134) | class Instruction35ms(Instruction):
    method __init__ (line 6141) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 6154) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 6181) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_kind (line 6233) | def get_ref_kind(self) -> int:
    method get_raw (line 6236) | def get_raw(self) -> bytes:
  class Instruction3rmi (line 6244) | class Instruction3rmi(Instruction):
    method __init__ (line 6253) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 6263) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 6271) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_kind (line 6287) | def get_ref_kind(self) -> int:
    method get_raw (line 6290) | def get_raw(self) -> bytes:
  class Instruction3rms (line 6296) | class Instruction3rms(Instruction):
    method __init__ (line 6305) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 6315) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 6323) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_kind (line 6339) | def get_ref_kind(self) -> int:
    method get_raw (line 6342) | def get_raw(self) -> bytes:
  class Instruction41c (line 6348) | class Instruction41c(Instruction):
    method __init__ (line 6357) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 6365) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 6369) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_kind (line 6376) | def get_ref_kind(self) -> int:
    method get_raw (line 6379) | def get_raw(self) -> bytes:
  class Instruction40sc (line 6383) | class Instruction40sc(Instruction):
    method __init__ (line 6392) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 6400) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 6404) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_kind (line 6411) | def get_ref_kind(self) -> int:
    method get_raw (line 6414) | def get_raw(self) -> bytes:
  class Instruction52c (line 6418) | class Instruction52c(Instruction):
    method __init__ (line 6427) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 6437) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 6441) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_kind (line 6449) | def get_ref_kind(self) -> int:
    method get_raw (line 6452) | def get_raw(self) -> bytes:
  class Instruction5rc (line 6458) | class Instruction5rc(Instruction):
    method __init__ (line 6467) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_output (line 6477) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 6485) | def get_operands(self, idx: int = -1) -> list[tuple[Operand, int]]:
    method get_ref_kind (line 6501) | def get_ref_kind(self) -> int:
    method get_raw (line 6504) | def get_raw(self) -> bytes:
  class Instruction45cc (line 6510) | class Instruction45cc(Instruction):
    method __init__ (line 6514) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_raw (line 6538) | def get_raw(self) -> bytes:
    method get_output (line 6547) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 6568) | def get_operands(self):
  class Instruction4rcc (line 6575) | class Instruction4rcc(Instruction):
    method __init__ (line 6579) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
    method get_raw (line 6588) | def get_raw(self) -> bytes:
    method get_output (line 6593) | def get_output(self, idx: int = -1) -> str:
    method get_operands (line 6599) | def get_operands(self):
  class Instruction00x (line 6604) | class Instruction00x(Instruction):
    method __init__ (line 6609) | def __init__(self, cm: ClassManager, buff: bytes) -> None:
  function get_instruction (line 6959) | def get_instruction(
  function get_optimized_instruction (line 6982) | def get_optimized_instruction(
  function get_instruction_payload (line 7004) | def get_instruction_payload(
  class LinearSweepAlgorithm (line 7018) | class LinearSweepAlgorithm:
    method get_instructions (line 7024) | def get_instructions(
  class DCode (line 7087) | class DCode:
    method __init__ (line 7097) | def __init__(
    method get_insn (line 7110) | def get_insn(self) -> bytes:
    method set_insn (line 7118) | def set_insn(self, insn: bytes) -> None:
    method seek (line 7127) | def seek(self, idx: int) -> None:
    method is_cached_instructions (line 7135) | def is_cached_instructions(self) -> bool:
    method set_instructions (line 7140) | def set_instructions(self, instructions: list[Instruction]) -> None:
    method get_instructions (line 7148) | def get_instructions(self) -> Iterator[Instruction]:
    method add_inote (line 7164) | def add_inote(
    method get_instruction (line 7182) | def get_instruction(
    method off_to_pos (line 7199) | def off_to_pos(self, off: int) -> int:
    method get_ins_off (line 7216) | def get_ins_off(self, off: int) -> Instruction:
    method show (line 7231) | def show(self) -> None:
    method get_raw (line 7248) | def get_raw(self) -> bytearray:
    method get_length (line 7259) | def get_length(self) -> int:
  class TryItem (line 7268) | class TryItem:
    method __init__ (line 7276) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method set_off (line 7285) | def set_off(self, off: int) -> None:
    method get_off (line 7288) | def get_off(self) -> int:
    method get_start_addr (line 7291) | def get_start_addr(self) -> int:
    method get_insn_count (line 7299) | def get_insn_count(self) -> int:
    method get_handler_off (line 7307) | def get_handler_off(self) -> int:
    method get_raw (line 7315) | def get_raw(self) -> bytes:
    method get_length (line 7320) | def get_length(self) -> int:
  class DalvikCode (line 7324) | class DalvikCode:
    method __init__ (line 7332) | def __init__(self, buff: BinaryIO, cm: ClassManager) -> None:
    method get_registers_size (line 7365) | def get_registers_size(self) -> int:
    method get_ins_size (line 7373) | def get_ins_size(self) -> int:
    method get_outs_size (line 7381) | def get_outs_size(self) -> int:
    method get_tries_size (line 7389) | def get_tries_size(self) -> int:
    method get_debug_info_off (line 7397) | def get_debug_info_off(self) -> int:
    method get_insns_size (line 7405) | def get_insns_size(self) -> int:
    method get_handlers (line 7413) | def get_handlers(self) -> EncodedCatchHandlerList:
    method get_tries (line 7421) | def get_tries(self) -> list[TryItem]:
    method get_debug (line 7429) | def get_debug(self) -> DebugInfoItem:
    method get_bc (line 7437) | def get_bc(self) -> DCode:
    method seek (line 7445) | def seek(self, idx: int) -> None:
    method get_length (line 7448) | def get_length(self) -> int:
    method _begin_show (line 7451) | def _begin_show(self) -> None:
    method show (line 7461) | def show(self) -> None:
    method _end_show (line 7466) | def _end_show(self) -> None:
    method get_obj (line 7469) | def get_obj(self) -> tuple[DCode, list[TryItem], EncodedCatchHandlerLi...
    method get_raw (line 7472) | def get_raw(self) -> bytearray:
    method add_inote (line 7504) | def add_inote(self, msg: str, idx: int, off: int = None) -> None:
    method get_instruction (line 7515) | def get_instruction(
    method get_size (line 7521) | def get_size(self) -> int:
    method set_off (line 7524) | def set_off(self, off: int) -> None:
    method get_off (line 7527) | def get_off(self) -> int:
  class CodeItem (line 7531) | class CodeItem:
    method __init__ (line 7532) | def __init__(self, size: int, buff: bytes, cm: ClassManager) -> None:
    method set_off (line 7552) | def set_off(self, off: int) -> None:
    method get_off (line 7555) | def get_off(self) -> int:
    method get_code (line 7558) | def get_code(self, off: int) -> DalvikCode:
    method show (line 7564) | def show(self) -> None:
    method get_obj (line 7574) | def get_obj(self) -> list[DalvikCode]:
    method get_raw (line 7577) | def get_raw(self) -> bytearray:
    method get_length (line 7583) | def get_length(self) -> int:
  class MapItem (line 7590) | class MapItem:
    method __init__ (line 7591) | def __init__(self, buff: bytes, cm: ClassManager) -> None:
    method get_off (line 7609) | def get_off(self) -> int:
    method get_offset (line 7613) | def get_offset(self) -> int:
    method get_type (line 7617) | def get_type(self) -> TypeMapItem:
    method get_size (line 7620) | def get_size(self) -> int:
    method parse (line 7629) | def parse(self) -> None:
    method show (line 7758) | def show(self) -> None:
    method get_obj (line 7768) | def get_obj(self) -> object:
    method get_raw (line 7782) | def get_raw(self) -> bytes:
    method get_length (line 7794) | def get_length(self) -> int:
    method set_item (line 7797) | def set_item(self, item: object) -> None:
  class ClassManager (line 7801) | class ClassManager:
    method __init__ (line 7807) | def __init__(self, vm: DEX) -> None:
    method packer (line 7839) | def packer(self):
    method packer (line 7843) | def packer(self, p):
    method get_ascii_string (line 7846) | def get_ascii_string(self, s: str) -> str:
    method get_odex_format (line 7859) | def get_odex_format(self) -> bool:
    method get_obj_by_offset (line 7866) | def get_obj_by_offset(self, offset: int) -> object:
    method get_item_by_offset (line 7872) | def get_item_by_offset(self, offset: int) -> object:
    method get_string_by_offset (line 7875) | def get_string_by_offset(self, offset: int) -> object:
    method set_decompiler (line 7878) | def set_decompiler(self, decompiler: DecompilerDAD) -> None:
    method set_analysis (line 7881) | def set_analysis(self, analysis_dex: Analysis) -> None:
    method get_analysis (line 7884) | def get_analysis(self) -> Analysis:
    method add_type_item (line 7887) | def add_type_item(
    method get_code (line 7913) | def get_code(self, idx: int) -> Union[DalvikCode, None]:
    method get_class_data_item (line 7919) | def get_class_data_item(self, off: int) -> ClassDataItem:
    method get_encoded_array_item (line 7925) | def get_encoded_array_item(self, off: int) -> EncodedArrayItem:
    method get_annotations_directory_item (line 7930) | def get_annotations_directory_item(
    method get_annotation_set_item (line 7937) | def get_annotation_set_item(self, off: int) -> AnnotationSetItem:
    method get_annotation_off_item (line 7942) | def get_annotation_off_item(self, off: int) -> AnnotationOffItem:
    method get_annotation_item (line 7947) | def get_annotation_item(self, off: int) -> AnnotationItem:
    method get_hiddenapi_class_data_item (line 7952) | def get_hiddenapi_class_data_item(
    method get_string (line 7959) | def get_string(self, idx: int) -> str:
    method get_raw_string (line 7974) | def get_raw_string(self, idx: int) -> str:
    method get_type_list (line 7994) | def get_type_list(self, off: int) -> list[str]:
    method get_type (line 8001) | def get_type(self, idx: int) -> str:
    method get_type_ref (line 8015) | def get_type_ref(self, idx: int) -> TypeIdItem:
    method get_proto (line 8026) | def get_proto(self, idx: int) -> list:
    method get_field (line 8037) | def get_field(self, idx: int) -> list[str]:
    method get_field_ref (line 8042) | def get_field_ref(self, idx: int) -> FieldIdItem:
    method get_method (line 8045) | def get_method(self, idx: int) -> list[str]:
    method get_method_ref (line 8048) | def get_method_ref(self, idx: int) -> MethodIdItem:
    method set_hook_class_name (line 8051) | def set_hook_class_name(self, class_def: ClassDefItem, value: str) -> ...
    method set_hook_method_name (line 8077) | def set_hook_method_name(
    method set_hook_field_name (line 8140) | def set_hook_field_name(
    method set_hook_string (line 8172) | def set_hook_string(self, idx: int, value: str) -> None:
    method get_next_offset_item (line 8175) | def get_next_offset_item(self, idx: int) -> int:
    method get_debug_off (line 8181) | def get_debug_off(self, off: int) -> DebugInfoItem:
  class MapList (line 8186) | class MapList:
    method __init__ (line 8193) | def __init__(self, cm: ClassManager, off: int, buff: BinaryIO) -> None:
    method get_off (line 8226) | def get_off(self) -> int:
    method set_off (line 8229) | def set_off(self, off: int) -> None:
    method get_item_type (line 8232) | def get_item_type(self, ttype: TypeMapItem) -> object:
    method show (line 8245) | def show(self) -> None:
    method get_obj (line 8256) | def get_obj(self) -> list[object]:
    method get_raw (line 8259) | def get_raw(self) -> bytes:
    method get_class_manager (line 8264) | def get_class_manager(self) -> ClassManager:
    method get_length (line 8267) | def get_length(self) -> int:
  class DalvikPacker (line 8271) | class DalvikPacker:
    method __init__ (line 8276) | def __init__(self, endian_tag: int) -> None:
    method __getitem__ (line 8292) | def __getitem__(self, item):
    method __getstate__ (line 8299) | def __getstate__(self):
    method __setstate__ (line 8302) | def __setstate__(self, state):
  class DEX (line 8307) | class DEX:
    method __init__ (line 8319) | def __init__(
    method _preload (line 8347) | def _preload(self, buff):
    method _load (line 8350) | def _load(self, buff) -> None:
    method _flush (line 8381) | def _flush(self) -> None:
    method version (line 8396) | def version(self) -> int:
    method get_api_version (line 8402) | def get_api_version(self) -> int:
    method get_classes_def_item (line 8411) | def get_classes_def_item(self) -> ClassHDefItem:
    method get_methods_id_item (line 8419) | def get_methods_id_item(self) -> MethodHIdItem:
    method get_fields_id_item (line 8427) | def get_fields_id_item(self) -> FieldHIdItem:
    method get_codes_item (line 8435) | def get_codes_item(self) -> CodeItem:
    method get_string_data_item (line 8443) | def get_string_data_item(self) -> StringDataItem:
    method get_debug_info_item (line 8452) | def get_debug_info_item(self) -> DebugInfoItemEmpty:
    method get_header_item (line 8459) | def get_header_item(self) -> HeaderItem:
    method get_hidden_api (line 8467) | def get_hidden_api(self) -> HiddenApiClassDataItem:
    method get_class_manager (line 8475) | def get_class_manager(self) -> ClassManager:
    method show (line 8484) | def show(self) -> None:
    method save (line 8490) | def save(self) -> bytes:
    method fix_checksums (line 8581) | def fix_checksums(self, buff: bytes) -> bytes:
    method get_cm_field (line 8599) | def get_cm_field(self, idx: int) -> list[str]:
    method get_cm_method (line 8607) | def get_cm_method(self, idx: int) -> list[str]:
    method get_cm_string (line 8615) | def get_cm_string(self, idx: int) -> str:
    method get_cm_type (line 8625) | def get_cm_type(self, idx: int) -> str:
    method get_classes_names (line 8635) | def get_classes_names(self, update: bool = False) -> list[str]:
    method get_classes (line 8646) | def get_classes(self) -> list[ClassDefItem]:
    method get_len_classes (line 8658) | def get_len_classes(self) -> int:
    method get_class (line 8666) | def get_class(self, name: str) -> Union[ClassDefItem, None]:
    method get_field (line 8679) | def get_field(self, name: str) -> list[FieldIdItem]:
    method get_fields (line 8693) | def get_fields(self) -> list[FieldIdItem]:
    method get_len_fields (line 8704) | def get_len_fields(self) -> int:
    method get_encoded_field (line 8712) | def get_encoded_field(self, name: str) -> list[EncodedField]:
    method get_encoded_fields (line 8728) | def get_encoded_fields(self) -> list[EncodedField]:
    method get_len_encoded_fields (line 8741) | def get_len_encoded_fields(self) -> int:
    method get_field (line 8744) | def get_field(self, name: str) -> list[FieldIdItem]:
    method get_method (line 8757) | def get_method(self, name: str) -> list[MethodIdItem]:
    method get_methods (line 8770) | def get_methods(self) -> list[MethodIdItem]:
    method get_len_methods (line 8781) | def get_len_methods(self) -> int:
    method get_encoded_method (line 8789) | def get_encoded_method(self, name: str) -> list[EncodedMethod]:
    method get_encoded_methods (line 8804) | def get_encoded_methods(self) -> list[EncodedMethod]:
    method get_len_encoded_methods (line 8817) | def get_len_encoded_methods(self) -> int:
    method get_encoded_method_by_idx (line 8825) | def get_encoded_method_by_idx(
    method get_encoded_method_descriptor (line 8845) | def get_encoded_method_descriptor(
    method get_encoded_methods_class_method (line 8869) | def get_encoded_methods_class_method(
    method get_encoded_methods_class (line 8888) | def get_encoded_methods_class(
    method get_encoded_fields_class (line 8904) | def get_encoded_fields_class(self, class_name: str) -> list[EncodedFie...
    method get_encoded_field_descriptor (line 8918) | def get_encoded_field_descriptor(
    method get_strings (line 8943) | def get_strings(self) -> list[str]:
    method get_len_strings (line 8956) | def get_len_strings(self) -> int:
    method get_regex_strings (line 8964) | def get_regex_strings(
    method get_format_type (line 8982) | def get_format_type(self) -> str:
    method create_python_export (line 8990) | def create_python_export(self) -> None:
    method _delete_python_export_class (line 9000) | def _delete_python_export_class(self, _class: ClassDefItem) -> None:
    method _create_python_export_class (line 9003) | def _create_python_export_class(
    method _create_python_export_methods (line 9020) | def _create_python_export_methods(
    method _create_python_export_fields (line 9049) | def _create_python_export_fields(
    method set_decompiler (line 9078) | def set_decompiler(self, decompiler: DecompilerDAD) -> None:
    method set_analysis (line 9081) | def set_analysis(self, analysis_dex: Analysis) -> None:
    method disassemble (line 9084) | def disassemble(self, offset: int, size: int) -> Iterator[Instruction]:
    method _get_class_hierarchy (line 9098) | def _get_class_hierarchy(self) -> Node:
    method list_classes_hierarchy (line 9150) | def list_classes_hierarchy(self) -> dict[str, list[dict[str, list]]]:
  class OdexHeaderItem (line 9180) | class OdexHeaderItem:
    method __init__ (line 9187) | def __init__(self, buff: BinaryIO) -> None:
    method show (line 9199) | def show(self) -> None:
    method get_raw (line 9212) | def get_raw(self) -> bytes:
  class OdexDependencies (line 9225) | class OdexDependencies:
    method __init__ (line 9232) | def __init__(self, buff: BinaryIO) -> None:
    method get_dependencies (line 9246) | def get_dependencies(self) -> list[str]:
    method get_raw (line 9254) | def get_raw(self) -> bytes:
  class ODEX (line 9273) | class ODEX(DEX):
    method _preload (line 9285) | def _preload(self, buff: BinaryIO):
    method save (line 9306) | def save(self) -> bytes:
    method get_buff (line 9319) | def get_buff(self) -> bytes:
    method get_dependencies (line 9328) | def get_dependencies(self) -> OdexDependencies:
    method get_format_type (line 9336) | def get_format_type(self) -> str:
  function get_params_info (line 9345) | def get_params_info(nb: int, proto: str) -> str:
  function get_bytecodes_method (line 9372) | def get_bytecodes_method(
  function get_bytecodes_methodx (line 9385) | def get_bytecodes_methodx(method: EncodedMethod, mx: MethodAnalysis) -> ...
  class ExportObject (line 9462) | class ExportObject:

FILE: libs/androguard/core/dex/dex_types.py
  class Kind (line 8) | class Kind(IntEnum):
  class Operand (line 42) | class Operand(IntEnum):
  class TypeMapItem (line 57) | class TypeMapItem(IntEnum):
    method _get_dependencies (line 82) | def _get_dependencies():
    method determine_load_order (line 190) | def determine_load_order():

FILE: libs/androguard/decompiler/basic_blocks.py
  class BasicBlock (line 28) | class BasicBlock(Node):
    method __init__ (line 29) | def __init__(self, name: str, block_ins: list) -> None:
    method get_ins (line 37) | def get_ins(self) -> list:
    method get_loc_with_ins (line 40) | def get_loc_with_ins(self) -> list:
    method remove_ins (line 45) | def remove_ins(self, loc, ins) -> None:
    method add_ins (line 49) | def add_ins(self, new_ins_list: list) -> None:
    method add_variable_declaration (line 53) | def add_variable_declaration(self, variable):
    method number_ins (line 56) | def number_ins(self, num: int) -> int:
    method set_catch_type (line 62) | def set_catch_type(self, _type):
  class StatementBlock (line 66) | class StatementBlock(BasicBlock):
    method __init__ (line 67) | def __init__(self, name, block_ins):
    method visit (line 71) | def visit(self, visitor):
    method __str__ (line 74) | def __str__(self):
  class ReturnBlock (line 78) | class ReturnBlock(BasicBlock):
    method __init__ (line 79) | def __init__(self, name, block_ins):
    method visit (line 83) | def visit(self, visitor):
    method __str__ (line 86) | def __str__(self):
  class ThrowBlock (line 90) | class ThrowBlock(BasicBlock):
    method __init__ (line 91) | def __init__(self, name, block_ins):
    method visit (line 95) | def visit(self, visitor):
    method __str__ (line 98) | def __str__(self):
  class SwitchBlock (line 102) | class SwitchBlock(BasicBlock):
    method __init__ (line 103) | def __init__(self, name, switch, block_ins):
    method add_case (line 111) | def add_case(self, case):
    method visit (line 114) | def visit(self, visitor):
    method copy_from (line 117) | def copy_from(self, node):
    method update_attribute_with (line 122) | def update_attribute_with(self, n_map):
    method order_cases (line 129) | def order_cases(self):
    method __str__ (line 136) | def __str__(self):
  class CondBlock (line 140) | class CondBlock(BasicBlock):
    method __init__ (line 141) | def __init__(self, name, block_ins):
    method update_attribute_with (line 147) | def update_attribute_with(self, n_map):
    method neg (line 152) | def neg(self):
    method visit (line 157) | def visit(self, visitor):
    method visit_cond (line 160) | def visit_cond(self, visitor):
    method __str__ (line 165) | def __str__(self):
  class Condition (line 169) | class Condition:
    method __init__ (line 170) | def __init__(self, cond1, cond2, isand, isnot):
    method neg (line 176) | def neg(self):
    method get_ins (line 181) | def get_ins(self):
    method get_loc_with_ins (line 187) | def get_loc_with_ins(self):
    method visit (line 193) | def visit(self, visitor):
    method __str__ (line 198) | def __str__(self):
  class ShortCircuitBlock (line 206) | class ShortCircuitBlock(CondBlock):
    method __init__ (line 207) | def __init__(self, name, cond):
    method get_ins (line 211) | def get_ins(self):
    method get_loc_with_ins (line 214) | def get_loc_with_ins(self):
    method neg (line 217) | def neg(self):
    method visit_cond (line 220) | def visit_cond(self, visitor):
    method __str__ (line 223) | def __str__(self):
  class LoopBlock (line 227) | class LoopBlock(CondBlock):
    method __init__ (line 228) | def __init__(self, name, cond):
    method get_ins (line 232) | def get_ins(self):
    method neg (line 235) | def neg(self):
    method get_loc_with_ins (line 238) | def get_loc_with_ins(self):
    method visit (line 241) | def visit(self, visitor):
    method visit_cond (line 244) | def visit_cond(self, visitor):
    method update_attribute_with (line 247) | def update_attribute_with(self, n_map):
    method __str__ (line 251) | def __str__(self):
  class TryBlock (line 263) | class TryBlock(BasicBlock):
    method __init__ (line 264) | def __init__(self, node):
    method num (line 271) | def num(self):
    method num (line 275) | def num(self, value):
    method add_catch_node (line 278) | def add_catch_node(self, node):
    method visit (line 281) | def visit(self, visitor):
    method __str__ (line 284) | def __str__(self):
  class CatchBlock (line 288) | class CatchBlock(BasicBlock):
    method __init__ (line 289) | def __init__(self, node):
    method visit (line 299) | def visit(self, visitor):
    method visit_exception (line 302) | def visit_exception(self, visitor):
    method __str__ (line 308) | def __str__(self):
  function build_node_from_block (line 312) | def build_node_from_block(block, vmap, gen_ret, exception_type=None):

FILE: libs/androguard/decompiler/control_flow.py
  function intervals (line 34) | def intervals(graph):
  function derived_sequence (line 93) | def derived_sequence(graph):
  function mark_loop_rec (line 119) | def mark_loop_rec(graph, node, s_num, e_num, interval, nodes_in_loop):
  function mark_loop (line 128) | def mark_loop(graph, start, end, interval):
  function loop_type (line 139) | def loop_type(start, end, nodes_in_loop):
  function loop_follow (line 158) | def loop_follow(start, end, nodes_in_loop):
  function loop_struct (line 190) | def loop_struct(graphs_list, intervals_list):
  function if_struct (line 205) | def if_struct(graph, idoms):
  function switch_struct (line 225) | def switch_struct(graph, idoms):
  function short_circuit_struct (line 249) | def short_circuit_struct(graph, idom, node_map):
  function while_block_struct (line 329) | def while_block_struct(graph, node_map):
  function catch_struct (line 361) | def catch_struct(graph, idoms):
  function update_dom (line 406) | def update_dom(idoms, node_map):
  function identify_structures (line 411) | def identify_structures(graph, idoms):

FILE: libs/androguard/decompiler/dast.py
  class JSONWriter (line 25) | class JSONWriter:
    method __init__ (line 26) | def __init__(self, graph, method):
    method __enter__ (line 47) | def __enter__(self):
    method __exit__ (line 51) | def __exit__(self, *args):
    method add (line 56) | def add(self, val):
    method visit_ins (line 59) | def visit_ins(self, op):
    method get_ast (line 63) | def get_ast(self):
    method _visit_condition (line 101) | def _visit_condition(self, cond):
    method get_cond (line 110) | def get_cond(self, node):
    method visit_node (line 120) | def visit_node(self, node):
    method visit_loop_node (line 138) | def visit_loop_node(self, loop):
    method visit_cond_node (line 178) | def visit_cond_node(self, cond):
    method visit_switch_node (line 238) | def visit_switch_node(self, switch):
    method visit_statement_node (line 282) | def visit_statement_node(self, stmt):
    method visit_try_node (line 294) | def visit_try_node(self, try_node):
    method visit_return_node (line 323) | def visit_return_node(self, ret):
    method visit_throw_node (line 328) | def visit_throw_node(self, throw):
    method _visit_ins (line 332) | def _visit_ins(self, op, isCtor=False):
    method write_inplace_if_possible (line 382) | def write_inplace_if_possible(self, lhs, rhs):
    method visit_expr (line 401) | def visit_expr(self, op):
    method visit_arr_data (line 583) | def visit_arr_data(self, value):
    method visit_decl (line 595) | def visit_decl(self, var, init_expr=None):
    method literal_null (line 601) | def literal_null():
    method literal_double (line 605) | def literal_double(f):
    method literal_float (line 609) | def literal_float(f):
    method literal_long (line 613) | def literal_long(b):
    method literal_hex_int (line 617) | def literal_hex_int(b):
    method literal_int (line 621) | def literal_int(b):
    method literal_bool (line 625) | def literal_bool(b):
    method literal_class (line 629) | def literal_class(desc):
    method literal_string (line 635) | def literal_string(s):
    method parse_descriptor (line 639) | def parse_descriptor(desc: str) -> list:
    method _append (line 653) | def _append(sb, stmt):
    method statement_block (line 660) | def statement_block():
    method switch_stmt (line 666) | def switch_stmt(cond_expr, ksv_pairs):
    method if_stmt (line 670) | def if_stmt(cond_expr, scopes):
    method try_stmt (line 674) | def try_stmt(tryb, pairs):
    method loop_stmt (line 678) | def loop_stmt(isdo, cond_expr, body):
    method jump_stmt (line 683) | def jump_stmt(keyword):
    method throw_stmt (line 687) | def throw_stmt(expr):
    method return_stmt (line 691) | def return_stmt(expr):
    method local_decl_stmt (line 695) | def local_decl_stmt(expr, decl):
    method expression_stmt (line 699) | def expression_stmt(expr):
    method dummy (line 703) | def dummy(*args):
    method var_decl (line 707) | def var_decl(typen, var):
    method unary_postfix (line 711) | def unary_postfix(left, op):
    method unary_prefix (line 715) | def unary_prefix(op, left):
    method typen (line 719) | def typen(baset: str, dim: int) -> list:
    method parenthesis (line 723) | def parenthesis(expr):
    method method_invocation (line 727) | def method_invocation(triple, name, base, params):
    method local (line 733) | def local(name):
    method literal (line 737) | def literal(result, tt):
    method field_access (line 741) | def field_access(triple, left):
    method cast (line 745) | def cast(tn, arg):
    method binary_infix (line 749) | def binary_infix(op, left, right):
    method assignment (line 753) | def assignment(lhs, rhs, op=''):
    method array_initializer (line 757) | def array_initializer(params, tn=None):
    method array_creation (line 761) | def array_creation(tn, params, dim):
    method array_access (line 765) | def array_access(arr, ind) -> list:

FILE: libs/androguard/decompiler/dataflow.py
  class BasicReachDef (line 27) | class BasicReachDef:
    method __init__ (line 28) | def __init__(self, graph, params):
    method run (line 51) | def run(self):
  function update_chain (line 80) | def update_chain(graph, loc, du, ud):
  function dead_code_elimination (line 116) | def dead_code_elimination(graph, du, ud):
  function clear_path_node (line 148) | def clear_path_node(graph, reg, loc1, loc2):
  function clear_path (line 162) | def clear_path(graph, reg, loc1, loc2):
  function register_propagation (line 190) | def register_propagation(graph, du, ud):
  class DummyNode (line 323) | class DummyNode(Node):
    method __init__ (line 324) | def __init__(self, name):
    method get_loc_with_ins (line 327) | def get_loc_with_ins(self):
    method __repr__ (line 330) | def __repr__(self):
    method __str__ (line 333) | def __str__(self):
  function group_variables (line 337) | def group_variables(lvars, DU, UD):
  function split_variables (line 368) | def split_variables(graph, lvars, DU, UD):
  function reach_def_analysis (line 406) | def reach_def_analysis(graph, lparams):
  function build_def_use (line 432) | def build_def_use(graph, lparams):
  function place_declarations (line 471) | def place_declarations(graph, dvars, du, ud):

FILE: libs/androguard/decompiler/decompile.py
  function get_field_ast (line 59) | def get_field_ast(field: EncodedField) -> dict:
  class DvMethod (line 87) | class DvMethod:
    method __init__ (line 95) | def __init__(self, methanalysis: MethodAnalysis) -> None:
    method process (line 143) | def process(self, doAST: bool = False) -> None:
    method get_ast (line 221) | def get_ast(self) -> dict:
    method show_source (line 240) | def show_source(self) -> None:
    method get_source (line 243) | def get_source(self) -> str:
    method get_source_ext (line 248) | def get_source_ext(self) -> list[tuple]:
    method __repr__ (line 253) | def __repr__(self):
  class DvClass (line 258) | class DvClass:
    method __init__ (line 269) | def __init__(
    method get_methods (line 310) | def get_methods(self) -> list[dex.EncodedMethod]:
    method process_method (line 313) | def process_method(self, num: int, doAST: bool = False) -> None:
    method process (line 321) | def process(self, doAST: bool = False) -> None:
    method get_ast (line 331) | def get_ast(self) -> dict:
    method get_source (line 351) | def get_source(self) -> str:
    method get_source_ext (line 402) | def get_source_ext(self) -> list[tuple[str, list]]:
    method show_source (line 504) | def show_source(self) -> None:
    method __repr__ (line 507) | def __repr__(self):
  class DvMachine (line 511) | class DvMachine:
    method __init__ (line 523) | def __init__(self, name: str) -> None:
    method get_classes (line 549) | def get_classes(self) -> list[str]:
    method get_class (line 558) | def get_class(self, class_name: str) -> DvClass:
    method process (line 577) | def process(self) -> None:
    method show_source (line 591) | def show_source(self) -> None:
    method process_and_show (line 601) | def process_and_show(self) -> None:
    method get_ast (line 612) | def get_ast(self) -> dict:

FILE: libs/androguard/decompiler/decompiler.py
  class DecompilerDAD (line 38) | class DecompilerDAD:
    method __init__ (line 39) | def __init__(self, vm: DEX, vmx: Analysis) -> None:
    method get_source_method (line 54) | def get_source_method(self, m: MethodAnalysis) -> str:
    method get_ast_method (line 60) | def get_ast_method(self, m: MethodAnalysis) -> dict:
    method display_source (line 66) | def display_source(self, m: MethodAnalysis) -> None:
    method get_source_class (line 74) | def get_source_class(self, _class: ClassDefItem) -> str:
    method get_ast_class (line 79) | def get_ast_class(self, _class: ClassDefItem) -> dict:
    method get_source_class_ext (line 84) | def get_source_class_ext(
    method display_all (line 94) | def display_all(self, _class: ClassDefItem) -> None:

FILE: libs/androguard/decompiler/graph.py
  class Graph (line 30) | class Graph:
    method __init__ (line 38) | def __init__(self):
    method sucs (line 51) | def sucs(self, node):
    method all_sucs (line 54) | def all_sucs(self, node):
    method preds (line 57) | def preds(self, node):
    method all_preds (line 60) | def all_preds(self, node):
    method add_node (line 65) | def add_node(self, node):
    method add_edge (line 73) | def add_edge(self, e1, e2):
    method add_catch_edge (line 81) | def add_catch_edge(self, e1, e2):
    method remove_node (line 93) | def remove_node(self, node):
    method number_ins (line 120) | def number_ins(self):
    method get_ins_from_loc (line 131) | def get_ins_from_loc(self, loc):
    method get_node_from_loc (line 134) | def get_node_from_loc(self, loc):
    method remove_ins (line 139) | def remove_ins(self, loc):
    method compute_rpo (line 144) | def compute_rpo(self):
    method post_order (line 155) | def post_order(self):
    method draw (line 174) | def draw(self, name, dname, draw_branches=True):
    method immediate_dominators (line 214) | def immediate_dominators(self):
    method __len__ (line 217) | def __len__(self):
    method __repr__ (line 220) | def __repr__(self):
    method __iter__ (line 223) | def __iter__(self):
  function split_if_nodes (line 228) | def split_if_nodes(graph):
  function simplify (line 291) | def simplify(graph):
  function dom_lt (line 352) | def dom_lt(graph):
  function bfs (line 415) | def bfs(start):
  class GenInvokeRetName (line 439) | class GenInvokeRetName:
    method __init__ (line 440) | def __init__(self):
    method new (line 444) | def new(self):
    method set_to (line 449) | def set_to(self, ret):
    method last (line 452) | def last(self):
  function make_node (line 456) | def make_node(graph, block, block_to_node, vmap, gen_ret):
  function construct (line 502) | def construct(start_block, vmap, exceptions):

FILE: libs/androguard/decompiler/instruction.py
  class IRForm (line 21) | class IRForm:
    method __init__ (line 22) | def __init__(self):
    method is_call (line 26) | def is_call(self):
    method is_cond (line 29) | def is_cond(self):
    method is_const (line 32) | def is_const(self):
    method is_ident (line 35) | def is_ident(self):
    method is_propagable (line 38) | def is_propagable(self):
    method get_type (line 41) | def get_type(self):
    method set_type (line 44) | def set_type(self, _type):
    method has_side_effect (line 47) | def has_side_effect(self):
    method get_used_vars (line 50) | def get_used_vars(self):
    method replace (line 53) | def replace(self, old, new):
    method replace_lhs (line 56) | def replace_lhs(self, new):
    method replace_var (line 59) | def replace_var(self, old, new):
    method remove_defined_var (line 62) | def remove_defined_var(self):
    method get_rhs (line 65) | def get_rhs(self):
    method get_lhs (line 68) | def get_lhs(self):
    method visit (line 71) | def visit(self, visitor):
  class Constant (line 75) | class Constant(IRForm):
    method __init__ (line 76) | def __init__(self, value, atype, int_value=None, descriptor=None):
    method get_used_vars (line 94) | def get_used_vars(self):
    method is_const (line 97) | def is_const(self):
    method get_int_value (line 100) | def get_int_value(self):
    method get_type (line 103) | def get_type(self):
    method visit (line 106) | def visit(self, visitor):
    method __str__ (line 119) | def __str__(self):
  class BaseClass (line 123) | class BaseClass(IRForm):
    method __init__ (line 124) | def __init__(self, name, descriptor=None):
    method is_const (line 130) | def is_const(self):
    method visit (line 133) | def visit(self, visitor):
    method __str__ (line 136) | def __str__(self):
  class Variable (line 140) | class Variable(IRForm):
    method __init__ (line 141) | def __init__(self, value):
    method get_used_vars (line 147) | def get_used_vars(self):
    method is_ident (line 150) | def is_ident(self):
    method value (line 153) | def value(self):
    method visit (line 156) | def visit(self, visitor):
    method visit_decl (line 159) | def visit_decl(self, visitor):
    method __str__ (line 162) | def __str__(self):
  class Param (line 166) | class Param(Variable):
    method __init__ (line 167) | def __init__(self, value, atype):
    method is_const (line 173) | def is_const(self):
    method visit (line 176) | def visit(self, visitor):
    method __str__ (line 179) | def __str__(self):
  class ThisParam (line 183) | class ThisParam(Param):
    method __init__ (line 184) | def __init__(self, value, atype):
    method visit (line 189) | def visit(self, visitor):
    method __str__ (line 194) | def __str__(self):
  class AssignExpression (line 198) | class AssignExpression(IRForm):
    method __init__ (line 199) | def __init__(self, lhs, rhs):
    method is_propagable (line 209) | def is_propagable(self):
    method is_call (line 212) | def is_call(self):
    method has_side_effect (line 215) | def has_side_effect(self):
    method get_rhs (line 218) | def get_rhs(self):
    method get_lhs (line 221) | def get_lhs(self):
    method get_used_vars (line 224) | def get_used_vars(self):
    method remove_defined_var (line 227) | def remove_defined_var(self):
    method replace (line 230) | def replace(self, old, new):
    method replace_lhs (line 233) | def replace_lhs(self, new):
    method replace_var (line 237) | def replace_var(self, old, new):
    method visit (line 240) | def visit(self, visitor):
    method __str__ (line 243) | def __str__(self):
  class MoveExpression (line 247) | class MoveExpression(IRForm):
    method __init__ (line 248) | def __init__(self, lhs, rhs):
    method has_side_effect (line 255) | def has_side_effect(self):
    method is_call (line 258) | def is_call(self):
    method get_used_vars (line 261) | def get_used_vars(self):
    method get_rhs (line 264) | def get_rhs(self):
    method get_lhs (line 267) | def get_lhs(self):
    method visit (line 270) | def visit(self, visitor):
    method replace (line 274) | def replace(self, old, new):
    method replace_lhs (line 286) | def replace_lhs(self, new):
    method replace_var (line 292) | def replace_var(self, old, new):
    method __str__ (line 298) | def __str__(self):
  class MoveResultExpression (line 303) | class MoveResultExpression(MoveExpression):
    method __init__ (line 304) | def __init__(self, lhs, rhs):
    method is_propagable (line 307) | def is_propagable(self):
    method has_side_effect (line 310) | def has_side_effect(self):
    method visit (line 313) | def visit(self, visitor):
    method __str__ (line 317) | def __str__(self):
  class ArrayStoreInstruction (line 322) | class ArrayStoreInstruction(IRForm):
    method __init__ (line 323) | def __init__(self, rhs, array, index, _type):
    method has_side_effect (line 331) | def has_side_effect(self):
    method get_used_vars (line 334) | def get_used_vars(self):
    method visit (line 341) | def visit(self, visitor):
    method replace_var (line 347) | def replace_var(self, old, new):
    method replace (line 357) | def replace(self, old, new):
    method __str__ (line 379) | def __str__(self):
  class StaticInstruction (line 386) | class StaticInstruction(IRForm):
    method __init__ (line 387) | def __init__(self, rhs, klass, ftype, name):
    method has_side_effect (line 397) | def has_side_effect(self):
    method get_used_vars (line 400) | def get_used_vars(self):
    method get_lhs (line 403) | def get_lhs(self):
    method visit (line 406) | def visit(self, visitor):
    method replace_var (line 411) | def replace_var(self, old, new):
    method replace (line 416) | def replace(self, old, new):
    method __str__ (line 428) | def __str__(self):
  class InstanceInstruction (line 432) | class InstanceInstruction(IRForm):
    method __init__ (line 433) | def __init__(self, rhs, lhs, klass, atype, name):
    method has_side_effect (line 444) | def has_side_effect(self):
    method get_used_vars (line 447) | def get_used_vars(self):
    method get_lhs (line 453) | def get_lhs(self):
    method visit (line 456) | def visit(self, visitor):
    method replace_var (line 462) | def replace_var(self, old, new):
    method replace (line 470) | def replace(self, old, new):
    method __str__ (line 490) | def __str__(self):
  class NewInstance (line 495) | class NewInstance(IRForm):
    method __init__ (line 496) | def __init__(self, ins_type):
    method get_type (line 500) | def get_type(self):
    method get_used_vars (line 503) | def get_used_vars(self):
    method visit (line 506) | def visit(self, visitor):
    method replace (line 509) | def replace(self, old, new):
    method __str__ (line 512) | def __str__(self):
  class InvokeInstruction (line 516) | class InvokeInstruction(IRForm):
    method __init__ (line 517) | def __init__(self, clsname, name, base, rtype, ptype, args, triple):
    method get_type (line 532) | def get_type(self):
    method is_call (line 537) | def is_call(self):
    method has_side_effect (line 540) | def has_side_effect(self):
    method replace_var (line 543) | def replace_var(self, old, new):
    method replace (line 556) | def replace(self, old, new):
    method get_used_vars (line 585) | def get_used_vars(self):
    method visit (line 593) | def visit(self, visitor):
    method __str__ (line 600) | def __str__(self):
  class InvokeRangeInstruction (line 609) | class InvokeRangeInstruction(InvokeInstruction):
    method __init__ (line 610) | def __init__(self, clsname, name, rtype, ptype, args, triple):
  class InvokeDirectInstruction (line 615) | class InvokeDirectInstruction(InvokeInstruction):
    method __init__ (line 616) | def __init__(self, clsname, name, base, rtype, ptype, args, triple):
  class InvokeStaticInstruction (line 620) | class InvokeStaticInstruction(InvokeInstruction):
    method __init__ (line 621) | def __init__(self, clsname, name, base, rtype, ptype, args, triple):
    method get_used_vars (line 624) | def get_used_vars(self):
  class ReturnInstruction (line 632) | class ReturnInstruction(IRForm):
    method __init__ (line 633) | def __init__(self, arg):
    method get_used_vars (line 640) | def get_used_vars(self):
    method get_lhs (line 645) | def get_lhs(self):
    method visit (line 648) | def visit(self, visitor):
    method replace_var (line 654) | def replace_var(self, old, new):
    method replace (line 659) | def replace(self, old, new):
    method __str__ (line 671) | def __str__(self):
  class NopExpression (line 677) | class NopExpression(IRForm):
    method __init__ (line 678) | def __init__(self):
    method get_used_vars (line 681) | def get_used_vars(self):
    method get_lhs (line 684) | def get_lhs(self):
    method visit (line 687) | def visit(self, visitor):
  class SwitchExpression (line 691) | class SwitchExpression(IRForm):
    method __init__ (line 692) | def __init__(self, src, branch):
    method get_used_vars (line 698) | def get_used_vars(self):
    method visit (line 701) | def visit(self, visitor):
    method replace_var (line 704) | def replace_var(self, old, new):
    method replace (line 709) | def replace(self, old, new):
    method __str__ (line 721) | def __str__(self):
  class CheckCastExpression (line 725) | class CheckCastExpression(IRForm):
    method __init__ (line 726) | def __init__(self, arg, _type, descriptor=None):
    method is_const (line 734) | def is_const(self):
    method get_used_vars (line 737) | def get_used_vars(self):
    method visit (line 740) | def visit(self, visitor):
    method replace_var (line 745) | def replace_var(self, old, new):
    method replace (line 750) | def replace(self, old, new):
    method __str__ (line 762) | def __str__(self):
  class ArrayExpression (line 766) | class ArrayExpression(IRForm):
    method __init__ (line 767) | def __init__(self):
  class ArrayLoadExpression (line 771) | class ArrayLoadExpression(ArrayExpression):
    method __init__ (line 772) | def __init__(self, arg, index, _type):
    method get_used_vars (line 779) | def get_used_vars(self):
    method visit (line 785) | def visit(self, visitor):
    method get_type (line 789) | def get_type(self):
    method replace_var (line 792) | def replace_var(self, old, new):
    method replace (line 800) | def replace(self, old, new):
    method __str__ (line 821) | def __str__(self):
  class ArrayLengthExpression (line 826) | class ArrayLengthExpression(ArrayExpression):
    method __init__ (line 827) | def __init__(self, array):
    method get_type (line 832) | def get_type(self):
    method get_used_vars (line 835) | def get_used_vars(self):
    method visit (line 838) | def visit(self, visitor):
    method replace_var (line 841) | def replace_var(self, old, new):
    method replace (line 846) | def replace(self, old, new):
    method __str__ (line 858) | def __str__(self):
  class NewArrayExpression (line 862) | class NewArrayExpression(ArrayExpression):
    method __init__ (line 863) | def __init__(self, asize, atype):
    method is_propagable (line 869) | def is_propagable(self):
    method get_used_vars (line 872) | def get_used_vars(self):
    method visit (line 875) | def visit(self, visitor):
    method replace_var (line 878) | def replace_var(self, old, new):
    method replace (line 883) | def replace(self, old, new):
    method __str__ (line 895) | def __str__(self):
  class FilledArrayExpression (line 899) | class FilledArrayExpression(ArrayExpression):
    method __init__ (line 900) | def __init__(self, asize, atype, args):
    method get_used_vars (line 909) | def get_used_vars(self):
    method replace_var (line 915) | def replace_var(self, old, new):
    method replace (line 926) | def replace(self, old, new):
    method visit (line 950) | def visit(self, visitor):
  class FillArrayExpression (line 956) | class FillArrayExpression(ArrayExpression):
    method __init__ (line 957) | def __init__(self, reg, value):
    method is_propagable (line 963) | def is_propagable(self):
    method get_rhs (line 966) | def get_rhs(self):
    method replace_var (line 969) | def replace_var(self, old, new):
    method replace (line 974) | def replace(self, old, new):
    method get_used_vars (line 986) | def get_used_vars(self):
    method visit (line 989) | def visit(self, visitor):
  class RefExpression (line 993) | class RefExpression(IRForm):
    method __init__ (line 994) | def __init__(self, ref):
    method is_propagable (line 999) | def is_propagable(self):
    method get_used_vars (line 1002) | def get_used_vars(self):
    method replace_var (line 1005) | def replace_var(self, old, new):
    method replace (line 1010) | def replace(self, old, new):
  class MoveExceptionExpression (line 1023) | class MoveExceptionExpression(RefExpression):
    method __init__ (line 1024) | def __init__(self, ref, _type):
    method get_lhs (line 1029) | def get_lhs(self):
    method has_side_effect (line 1032) | def has_side_effect(self):
    method get_used_vars (line 1035) | def get_used_vars(self):
    method replace_lhs (line 1038) | def replace_lhs(self, new):
    method visit (line 1043) | def visit(self, visitor):
    method __str__ (line 1046) | def __str__(self):
  class MonitorEnterExpression (line 1050) | class MonitorEnterExpression(RefExpression):
    method __init__ (line 1051) | def __init__(self, ref):
    method visit (line 1054) | def visit(self, visitor):
  class MonitorExitExpression (line 1058) | class MonitorExitExpression(RefExpression):
    method __init__ (line 1059) | def __init__(self, ref):
    method visit (line 1062) | def visit(self, visitor):
  class ThrowExpression (line 1066) | class ThrowExpression(RefExpression):
    method __init__ (line 1067) | def __init__(self, ref):
    method visit (line 1070) | def visit(self, visitor):
    method __str__ (line 1073) | def __str__(self):
  class BinaryExpression (line 1077) | class BinaryExpression(IRForm):
    method __init__ (line 1078) | def __init__(self, op, arg1, arg2, _type):
    method has_side_effect (line 1086) | def has_side_effect(self):
    method get_used_vars (line 1093) | def get_used_vars(self):
    method visit (line 1099) | def visit(self, visitor):
    method replace_var (line 1105) | def replace_var(self, old, new):
    method replace (line 1113) | def replace(self, old, new):
    method __str__ (line 1133) | def __str__(self):
  class BinaryCompExpression (line 1138) | class BinaryCompExpression(BinaryExpression):
    method __init__ (line 1139) | def __init__(self, op, arg1, arg2, _type):
    method visit (line 1142) | def visit(self, visitor):
  class BinaryExpression2Addr (line 1149) | class BinaryExpression2Addr(BinaryExpression):
    method __init__ (line 1150) | def __init__(self, op, dest, arg, _type):
  class BinaryExpressionLit (line 1154) | class BinaryExpressionLit(BinaryExpression):
    method __init__ (line 1155) | def __init__(self, op, arg1, arg2):
  class UnaryExpression (line 1159) | class UnaryExpression(IRForm):
    method __init__ (line 1160) | def __init__(self, op, arg, _type):
    method get_type (line 1167) | def get_type(self):
    method get_used_vars (line 1170) | def get_used_vars(self):
    method visit (line 1173) | def visit(self, visitor):
    method replace_var (line 1176) | def replace_var(self, old, new):
    method replace (line 1181) | def replace(self, old, new):
    method __str__ (line 1193) | def __str__(self):
  class CastExpression (line 1197) | class CastExpression(UnaryExpression):
    method __init__ (line 1198) | def __init__(self, op, atype, arg):
    method is_const (line 1202) | def is_const(self):
    method get_type (line 1205) | def get_type(self):
    method get_used_vars (line 1208) | def get_used_vars(self):
    method visit (line 1211) | def visit(self, visitor):
    method __str__ (line 1214) | def __str__(self):
  class ConditionalExpression (line 1228) | class ConditionalExpression(IRForm):
    method __init__ (line 1229) | def __init__(self, op, arg1, arg2):
    method get_lhs (line 1236) | def get_lhs(self):
    method is_cond (line 1239) | def is_cond(self):
    method get_used_vars (line 1242) | def get_used_vars(self):
    method neg (line 1248) | def neg(self):
    method visit (line 1251) | def visit(self, visitor):
    method replace_var (line 1257) | def replace_var(self, old, new):
    method replace (line 1265) | def replace(self, old, new):
    method __str__ (line 1285) | def __str__(self):
  class ConditionalZExpression (line 1292) | class ConditionalZExpression(IRForm):
    method __init__ (line 1293) | def __init__(self, op, arg):
    method get_lhs (line 1299) | def get_lhs(self):
    method is_cond (line 1302) | def is_cond(self):
    method get_used_vars (line 1305) | def get_used_vars(self):
    method neg (line 1308) | def neg(self):
    method visit (line 1311) | def visit(self, visitor):
    method replace_var (line 1314) | def replace_var(self, old, new):
    method replace (line 1319) | def replace(self, old, new):
    method __str__ (line 1331) | def __str__(self):
  class InstanceExpression (line 1335) | class InstanceExpression(IRForm):
    method __init__ (line 1336) | def __init__(self, arg, klass, ftype, name):
    method get_type (line 1346) | def get_type(self):
    method get_used_vars (line 1349) | def get_used_vars(self):
    method visit (line 1352) | def visit(self, visitor):
    method replace_var (line 1357) | def replace_var(self, old, new):
    method replace (line 1362) | def replace(self, old, new):
    method __str__ (line 1374) | def __str__(self):
  class StaticExpression (line 1378) | class StaticExpression(IRForm):
    method __init__ (line 1379) | def __init__(self, cls_name, field_type, field_name):
    method get_type (line 1387) | def get_type(self):
    method visit (line 1390) | def visit(self, visitor):
    method replace (line 1393) | def replace(self, old, new):
    method __str__ (line 1396) | def __str__(self):

FILE: libs/androguard/decompiler/node.py
  class MakeProperties (line 19) | class MakeProperties(type):
    method __init__ (line 20) | def __init__(cls, name, bases, dct):
    method __call__ (line 53) | def __call__(cls, *args, **kwds):
  class LoopType (line 60) | class LoopType(metaclass=MakeProperties):
    method copy (line 64) | def copy(self):
  class NodeType (line 71) | class NodeType(metaclass=MakeProperties):
    method copy (line 77) | def copy(self):
  class Node (line 84) | class Node:
    method __init__ (line 85) | def __init__(self, name):
    method copy_from (line 97) | def copy_from(self, node):
    method update_attribute_with (line 108) | def update_attribute_with(self, n_map):
    method get_head (line 114) | def get_head(self):
    method get_end (line 117) | def get_end(self):
    method __repr__ (line 120) | def __repr__(self):
  class Interval (line 124) | class Interval:
    method __init__ (line 125) | def __init__(self, head):
    method __contains__ (line 133) | def __contains__(self, item):
    method add_node (line 142) | def add_node(self, node):
    method compute_end (line 149) | def compute_end(self, graph):
    method get_end (line 156) | def get_end(self):
    method get_head (line 159) | def get_head(self):
    method __len__ (line 162) | def __len__(self):
    method __repr__ (line 165) | def __repr__(self):

FILE: libs/androguard/decompiler/opcode_ins.py
  class Op (line 65) | class Op:
  function get_variables (line 89) | def get_variables(vmap, *variables):
  function assign_const (line 98) | def assign_const(dest_reg, cst, vmap):
  function assign_cmp (line 102) | def assign_cmp(val_a, val_b, val_c, cmp_type, vmap):
  function load_array_exp (line 108) | def load_array_exp(val_a, val_b, val_c, ar_type, vmap):
  function store_array_inst (line 113) | def store_array_inst(val_a, val_b, val_c, ar_type, vmap):
  function assign_cast_exp (line 118) | def assign_cast_exp(val_a, val_b, val_op, op_type, vmap):
  function assign_binary_exp (line 123) | def assign_binary_exp(ins, val_op, op_type, vmap):
  function assign_binary_2addr_exp (line 130) | def assign_binary_2addr_exp(ins, val_op, op_type, vmap):
  function assign_lit (line 137) | def assign_lit(op_type, val_cst, val_a, val_b, vmap):
  function nop (line 147) | def nop(ins, vmap):
  function move (line 152) | def move(ins, vmap):
  function movefrom16 (line 159) | def movefrom16(ins, vmap):
  function move16 (line 166) | def move16(ins, vmap):
  function movewide (line 173) | def movewide(ins, vmap):
  function movewidefrom16 (line 180) | def movewidefrom16(ins, vmap):
  function movewide16 (line 187) | def movewide16(ins, vmap):
  function moveobject (line 194) | def moveobject(ins, vmap):
  function moveobjectfrom16 (line 201) | def moveobjectfrom16(ins, vmap):
  function moveobject16 (line 208) | def moveobject16(ins, vmap):
  function moveresult (line 215) | def moveresult(ins, vmap, ret):
  function moveresultwide (line 221) | def moveresultwide(ins, vmap, ret):
  function moveresultobject (line 227) | def moveresultobject(ins, vmap, ret):
  function moveexception (line 233) | def moveexception(ins, vmap, _type):
  function returnvoid (line 239) | def returnvoid(ins, vmap):
  function return_reg (line 245) | def return_reg(ins, vmap):
  function returnwide (line 251) | def returnwide(ins, vmap):
  function returnobject (line 257) | def returnobject(ins, vmap):
  function const4 (line 263) | def const4(ins, vmap):
  function const16 (line 270) | def const16(ins, vmap):
  function const (line 277) | def const(ins, vmap):
  function consthigh16 (line 284) | def consthigh16(ins, vmap):
  function constwide16 (line 291) | def constwide16(ins, vmap):
  function constwide32 (line 298) | def constwide32(ins, vmap):
  function constwide (line 305) | def constwide(ins, vmap):
  function constwidehigh16 (line 312) | def constwidehigh16(ins, vmap):
  function conststring (line 319) | def conststring(ins, vmap):
  function conststringjumbo (line 326) | def conststringjumbo(ins, vmap):
  function constclass (line 333) | def constclass(ins, vmap):
  function monitorenter (line 344) | def monitorenter(ins, vmap):
  function monitorexit (line 350) | def monitorexit(ins, vmap):
  function checkcast (line 357) | def checkcast(ins, vmap):
  function instanceof (line 368) | def instanceof(ins, vmap):
  function arraylength (line 380) | def arraylength(ins, vmap):
  function newinstance (line 387) | def newinstance(ins, vmap):
  function newarray (line 395) | def newarray(ins, vmap):
  function fillednewarray (line 403) | def fillednewarray(ins, vmap, ret):
  function fillednewarrayrange (line 412) | def fillednewarrayrange(ins, vmap, ret):
  function fillarraydata (line 421) | def fillarraydata(ins, vmap, value):
  function fillarraydatapayload (line 427) | def fillarraydatapayload(ins, vmap):
  function throw (line 433) | def throw(ins, vmap):
  function goto (line 439) | def goto(ins, vmap):
  function goto16 (line 444) | def goto16(ins, vmap):
  function goto32 (line 449) | def goto32(ins, vmap):
  function packedswitch (line 454) | def packedswitch(ins, vmap):
  function sparseswitch (line 461) | def sparseswitch(ins, vmap):
  function cmplfloat (line 468) | def cmplfloat(ins, vmap):
  function cmpgfloat (line 474) | def cmpgfloat(ins, vmap):
  function cmpldouble (line 480) | def cmpldouble(ins, vmap):
  function cmpgdouble (line 486) | def cmpgdouble(ins, vmap):
  function cmplong (line 492) | def cmplong(ins, vmap):
  function ifeq (line 498) | def ifeq(ins, vmap):
  function ifne (line 505) | def ifne(ins, vmap):
  function iflt (line 512) | def iflt(ins, vmap):
  function ifge (line 519) | def ifge(ins, vmap):
  function ifgt (line 526) | def ifgt(ins, vmap):
  function ifle (line 533) | def ifle(ins, vmap):
  function ifeqz (line 540) | def ifeqz(ins, vmap):
  function ifnez (line 546) | def ifnez(ins, vmap):
  function ifltz (line 552) | def ifltz(ins, vmap):
  function ifgez (line 558) | def ifgez(ins, vmap):
  function ifgtz (line 564) | def ifgtz(ins, vmap):
  function iflez (line 570) | def iflez(ins, vmap):
  function aget (line 577) | def aget(ins, vmap):
  function agetwide (line 583) | def agetwide(ins, vmap):
  function agetobject (line 589) | def agetobject(ins, vmap):
  function agetboolean (line 595) | def agetboolean(ins, vmap):
  function agetbyte (line 601) | def agetbyte(ins, vmap):
  function agetchar (line 607) | def agetchar(ins, vmap):
  function agetshort (line 613) | def agetshort(ins, vmap):
  function aput (line 619) | def aput(ins, vmap):
  function aputwide (line 625) | def aputwide(ins, vmap):
  function aputobject (line 631) | def aputobject(ins, vmap):
  function aputboolean (line 637) | def aputboolean(ins, vmap):
  function aputbyte (line 643) | def aputbyte(ins, vmap):
  function aputchar (line 649) | def aputchar(ins, vmap):
  function aputshort (line 655) | def aputshort(ins, vmap):
  function iget (line 661) | def iget(ins, vmap):
  function igetwide (line 670) | def igetwide(ins, vmap):
  function igetobject (line 679) | def igetobject(ins, vmap):
  function igetboolean (line 688) | def igetboolean(ins, vmap):
  function igetbyte (line 697) | def igetbyte(ins, vmap):
  function igetchar (line 706) | def igetchar(ins, vmap):
  function igetshort (line 715) | def igetshort(ins, vmap):
  function iput (line 724) | def iput(ins, vmap):
  function iputwide (line 732) | def iputwide(ins, vmap):
  function iputobject (line 740) | def iputobject(ins, vmap):
  function iputboolean (line 748) | def iputboolean(ins, vmap):
  function iputbyte (line 756) | def iputbyte(ins, vmap):
  function iputchar (line 764) | def iputchar(ins, vmap):
  function iputshort (line 772) | def iputshort(ins, vmap):
  function sget (line 780) | def sget(ins, vmap):
  function sgetwide (line 789) | def sgetwide(ins, vmap):
  function sgetobject (line 798) | def sgetobject(ins, vmap):
  function sgetboolean (line 807) | def sgetboolean(ins, vmap):
  function sgetbyte (line 816) | def sgetbyte(ins, vmap):
  function sgetchar (line 825) | def sgetchar(ins, vmap):
  function sgetshort (line 834) | def sgetshort(ins, vmap):
  function sput (line 843) | def sput(ins, vmap):
  function sputwide (line 851) | def sputwide(ins, vmap):
  function sputobject (line 859) | def sputobject(ins, vmap):
  function sputboolean (line 867) | def sputboolean(ins, vmap):
  function sputbyte (line 875) | def sputbyte(ins, vmap):
  function sputchar (line 883) | def sputchar(ins, vmap):
  function sputshort (line 891) | def sputshort(ins, vmap):
  function get_args (line 898) | def get_args(vmap, param_type, largs):
  function invokevirtual (line 915) | def invokevirtual(ins, vmap, ret):
  function invokesuper (line 933) | def invokesuper(ins, vmap, ret):
  function invokedirect (line 957) | def invokedirect(ins, vmap, ret):
  function invokestatic (line 982) | def invokestatic(ins, vmap, ret):
  function invokeinterface (line 1000) | def invokeinterface(ins, vmap, ret):
  function invokevirtualrange (line 1018) | def invokevirtualrange(ins, vmap, ret):
  function invokesuperrange (line 1041) | def invokesuperrange(ins, vmap, ret):
  function invokedirectrange (line 1069) | def invokedirectrange(ins, vmap, ret):
  function invokestaticrange (line 1097) | def invokestaticrange(ins, vmap, ret):
  function invokeinterfacerange (line 1115) | def invokeinterfacerange(ins, vmap, ret):
  function negint (line 1138) | def negint(ins, vmap):
  function notint (line 1146) | def notint(ins, vmap):
  function neglong (line 1154) | def neglong(ins, vmap):
  function notlong (line 1162) | def notlong(ins, vmap):
  function negfloat (line 1170) | def negfloat(ins, vmap):
  function negdouble (line 1178) | def negdouble(ins, vmap):
  function inttolong (line 1186) | def inttolong(ins, vmap):
  function inttofloat (line 1192) | def inttofloat(ins, vmap):
  function inttodouble (line 1198) | def inttodouble(ins, vmap):
  function longtoint (line 1204) | def longtoint(ins, vmap):
  function longtofloat (line 1210) | def longtofloat(ins, vmap):
  function longtodouble (line 1216) | def longtodouble(ins, vmap):
  function floattoint (line 1222) | def floattoint(ins, vmap):
  function floattolong (line 1228) | def floattolong(ins, vmap):
  function floattodouble (line 1234) | def floattodouble(ins, vmap):
  function doubletoint (line 1240) | def doubletoint(ins, vmap):
  function doubletolong (line 1246) | def doubletolong(ins, vmap):
  function doubletofloat (line 1252) | def doubletofloat(ins, vmap):
  function inttobyte (line 1258) | def inttobyte(ins, vmap):
  function inttochar (line 1264) | def inttochar(ins, vmap):
  function inttoshort (line 1270) | def inttoshort(ins, vmap):
  function addint (line 1276) | def addint(ins, vmap):
  function subint (line 1282) | def subint(ins, vmap):
  function mulint (line 1288) | def mulint(ins, vmap):
  function divint (line 1294) | def divint(ins, vmap):
  function remint (line 1300) | def remint(ins, vmap):
  function andint (line 1306) | def andint(ins, vmap):
  function orint (line 1312) | def orint(ins, vmap):
  function xorint (line 1318) | def xorint(ins, vmap):
  function shlint (line 1324) | def shlint(ins, vmap):
  function shrint (line 1330) | def shrint(ins, vmap):
  function ushrint (line 1336) | def ushrint(ins, vmap):
  function addlong (line 1342) | def addlong(ins, vmap):
  function sublong (line 1348) | def sublong(ins, vmap):
  function mullong (line 1354) | def mullong(ins, vmap):
  function divlong (line 1360) | def divlong(ins, vmap):
  function remlong (line 1366) | def remlong(ins, vmap):
  function andlong (line 1372) | def andlong(ins, vmap):
  function orlong (line 1378) | def orlong(ins, vmap):
  function xorlong (line 1384) | def xorlong(ins, vmap):
  function shllong (line 1390) | def shllong(ins, vmap):
  function shrlong (line 1396) | def shrlong(ins, vmap):
  function ushrlong (line 1402) | def ushrlong(ins, vmap):
  function addfloat (line 1408) | def addfloat(ins, vmap):
  function subfloat (line 1414) | def subfloat(ins, vmap):
  function mulfloat (line 1420) | def mulfloat(ins, vmap):
  function divfloat (line 1426) | def divfloat(ins, vmap):
  function remfloat (line 1432) | def remfloat(ins, vmap):
  function adddouble (line 1438) | def adddouble(ins, vmap):
  function subdouble (line 1444) | def subdouble(ins, vmap):
  function muldouble (line 1450) | def muldouble(ins, vmap):
  function divdouble (line 1456) | def divdouble(ins, vmap):
  function remdouble (line 1462) | def remdouble(ins, vmap):
  function addint2addr (line 1468) | def addint2addr(ins, vmap):
  function subint2addr (line 1474) | def subint2addr(ins, vmap):
  function mulint2addr (line 1480) | def mulint2addr(ins, vmap):
  function divint2addr (line 1486) | def divint2addr(ins, vmap):
  function remint2addr (line 1492) | def remint2addr(ins, vmap):
  function andint2addr (line 1498) | def andint2addr(ins, vmap):
  function orint2addr (line 1504) | def orint2addr(ins, vmap):
  function xorint2addr (line 1510) | def xorint2addr(ins, vmap):
  function shlint2addr (line 1516) | def shlint2addr(ins, vmap):
  function shrint2addr (line 1522) | def shrint2addr(ins, vmap):
  function ushrint2addr (line 1528) | def ushrint2addr(ins, vmap):
  function addlong2addr (line 1534) | def addlong2addr(ins, vmap):
  function sublong2addr (line 1540) | def sublong2addr(ins, vmap):
  function mullong2addr (line 1546) | def mullong2addr(ins, vmap):
  function divlong2addr (line 1552) | def divlong2addr(ins, vmap):
  function remlong2addr (line 1558) | def remlong2addr(ins, vmap):
  function andlong2addr (line 1564) | def andlong2addr(ins, vmap):
  function orlong2addr (line 1570) | def orlong2addr(ins, vmap):
  function xorlong2addr (line 1576) | def xorlong2addr(ins, vmap):
  function shllong2addr (line 1582) | def shllong2addr(ins, vmap):
  function shrlong2addr (line 1588) | def shrlong2addr(ins, vmap):
  function ushrlong2addr (line 1594) | def ushrlong2addr(ins, vmap):
  function addfloat2addr (line 1600) | def addfloat2addr(ins, vmap):
  function subfloat2addr (line 1606) | def subfloat2addr(ins, vmap):
  function mulfloat2addr (line 1612) | def mulfloat2addr(ins, vmap):
  function divfloat2addr (line 1618) | def divfloat2addr(ins, vmap):
  function remfloat2addr (line 1624) | def remfloat2addr(ins, vmap):
  function adddouble2addr (line 1630) | def adddouble2addr(ins, vmap):
  function subdouble2addr (line 1636) | def subdouble2addr(ins, vmap):
  function muldouble2addr (line 1642) | def muldouble2addr(ins, vmap):
  function divdouble2addr (line 1648) | def divdouble2addr(ins, vmap):
  function remdouble2addr (line 1654) | def remdouble2addr(ins, vmap):
  function addintlit16 (line 1660) | def addintlit16(ins, vmap):
  function rsubint (line 1666) | def rsubint(ins, vmap):
  function mulintlit16 (line 1674) | def mulintlit16(ins, vmap):
  function divintlit16 (line 1680) | def divintlit16(ins, vmap):
  function remintlit16 (line 1686) | def remintlit16(ins, vmap):
  function andintlit16 (line 1692) | def andintlit16(ins, vmap):
  function orintlit16 (line 1698) | def orintlit16(ins, vmap):
  function xorintlit16 (line 1704) | def xorintlit16(ins, vmap):
  function addintlit8 (line 1710) | def addintlit8(ins, vmap):
  function rsubintlit8 (line 1717) | def rsubintlit8(ins, vmap):
  function mulintlit8 (line 1725) | def mulintlit8(ins, vmap):
  function divintlit8 (line 1731) | def divintlit8(ins, vmap):
  function remintlit8 (line 1737) | def remintlit8(ins, vmap):
  function andintlit8 (line 1743) | def andintlit8(ins, vmap):
  function orintlit8 (line 1749) | def orintlit8(ins, vmap):
  function xorintlit8 (line 1755) | def xorintlit8(ins, vmap):
  function shlintlit8 (line 1761) | def shlintlit8(ins, vmap):
  function shrintlit8 (line 1767) | def shrintlit8(ins, vmap):
  function ushrintlit8 (line 1773) | def ushrintlit8(ins, vmap):

FILE: libs/androguard/decompiler/util.py
  function get_access_class (line 110) | def get_access_class(access: int) -> list[str]:
  function get_access_method (line 118) | def get_access_method(access: int) -> list[str]:
  function get_access_field (line 126) | def get_access_field(access: int) -> list[str]:
  function build_path (line 134) | def build_path(graph, node1, node2, path=None):
  function common_dom (line 153) | def common_dom(idom, cur, pred):
  function merge_inner (line 164) | def merge_inner(clsdict):
  function get_type_size (line 198) | def get_type_size(param):
  function get_type (line 205) | def get_type(atype: str, size: int = None) -> str:
  function get_params_type (line 227) | def get_params_type(descriptor: str) -> list[str]:
  function create_png (line 237) | def create_png(

FILE: libs/androguard/decompiler/writer.py
  class Writer (line 37) | class Writer:
    method __init__ (line 43) | def __init__(self, graph, method):
    method __str__ (line 59) | def __str__(self):
    method str_ext (line 62) | def str_ext(self) -> list[tuple]:
    method inc_ind (line 65) | def inc_ind(self, i=1):
    method dec_ind (line 68) | def dec_ind(self, i=1):
    method space (line 71) | def space(self):
    method write_ind (line 77) | def write_ind(self):
    method write (line 84) | def write(self, s, data=None):
    method write_ext (line 96) | def write_ext(self, t):
    method end_ins (line 101) | def end_ins(self):
    method write_ind_visit_end (line 105) | def write_ind_visit_end(self, lhs, s, rhs=None, data=None):
    method write_ind_visit_end_ext (line 116) | def write_ind_visit_end_ext(
    method write_inplace_if_possible (line 136) | def write_inplace_if_possible(self, lhs, rhs):
    method visit_ins (line 150) | def visit_ins(self, ins):
    method write_method (line 153) | def write_method(self):
    method visit_node (line 219) | def visit_node(self, node):
    method visit_loop_node (line 236) | def visit_loop_node(self, loop):
    method visit_cond_node (line 283) | def visit_cond_node(self, cond):
    method visit_short_circuit_condition (line 357) | def visit_short_circuit_condition(self, nnot, aand, cond1, cond2):
    method visit_switch_node (line 366) | def visit_switch_node(self, switch):
    method visit_statement_node (line 410) | def visit_statement_node(self, stmt):
    method visit_try_node (line 422) | def visit_try_node(self, try_node):
    method visit_catch_node (line 434) | def visit_catch_node(self, catch_node):
    method visit_return_node (line 443) | def visit_return_node(self, ret):
    method visit_throw_node (line 448) | def visit_throw_node(self, throw):
    method visit_decl (line 452) | def visit_decl(self, var):
    method visit_constant (line 461) | def visit_constant(self, cst):
    method visit_base_class (line 468) | def visit_base_class(self, cls, data=None):
    method visit_variable (line 472) | def visit_variable(self, var):
    method visit_param (line 484) | def visit_param(self, param, data=None):
    method visit_this (line 488) | def visit_this(self):
    method visit_super (line 491) | def visit_super(self):
    method visit_assign (line 494) | def visit_assign(self, lhs, rhs):
    method visit_move_result (line 502) | def visit_move_result(self, lhs, rhs):
    method visit_move (line 505) | def visit_move(self, lhs, rhs):
    method visit_astore (line 509) | def visit_astore(self, array, index, rhs, data=None):
    method visit_put_static (line 518) | def visit_put_static(self, cls, name, rhs):
    method visit_put_instance (line 524) | def visit_put_instance(self, lhs, name, rhs, data=None):
    method visit_new (line 535) | def visit_new(self, atype, data=None):
    method visit_invoke (line 542) | def visit_invoke(self, name, base, ptype, rtype, args, invokeInstr):
    method visit_return_void (line 601) | def visit_return_void(self):
    method visit_return (line 606) | def visit_return(self, arg):
    method visit_nop (line 612) | def visit_nop(self):
    method visit_switch (line 615) | def visit_switch(self, arg):
    method visit_check_cast (line 618) | def visit_check_cast(self, arg, atype):
    method visit_aload (line 623) | def visit_aload(self, array, index):
    method visit_alength (line 629) | def visit_alength(self, array):
    method visit_new_array (line 633) | def visit_new_array(self, atype, size):
    method visit_filled_new_array (line 638) | def visit_filled_new_array(self, atype, size, args):
    method visit_fill_array (line 646) | def visit_fill_array(self, array, value):
    method visit_move_exception (line 675) | def visit_move_exception(self, var, data=None):
    method visit_monitor_enter (line 687) | def visit_monitor_enter(self, ref):
    method visit_monitor_exit (line 694) | def visit_monitor_exit(self, ref):
    method visit_throw (line 699) | def visit_throw(self, ref):
    method visit_binary_expression (line 705) | def visit_binary_expression(self, op, arg1, arg2):
    method visit_unary_expression (line 712) | def visit_unary_expression(self, op, arg):
    method visit_cast (line 717) | def visit_cast(self, op, arg):
    method visit_cond_expression (line 722) | def visit_cond_expression(self, op, arg1, arg2):
    method visit_condz_expression (line 727) | def visit_condz_expression(self, op, arg):
    method visit_get_instance (line 747) | def visit_get_instance(self, arg, name, data=None):
    method visit_get_static (line 753) | def visit_get_static(self, cls, name):
  function string (line 757) | def string(s):

FILE: libs/androguard/misc.py
  function get_default_session (line 19) | def get_default_session() -> Session:
  function AnalyzeAPK (line 31) | def AnalyzeAPK(
  function AnalyzeDex (line 83) | def AnalyzeDex(
  function clean_file_name (line 134) | def clean_file_name(

FILE: libs/androguard/pentest/__init__.py
  class Message (line 17) | class Message:
  class MessageEvent (line 21) | class MessageEvent(Message):
    method __init__ (line 22) | def __init__(
  class MessageSystem (line 32) | class MessageSystem(Message):
    method __init__ (line 33) | def __init__(
  class Pentest (line 43) | class Pentest:
    method __init__ (line 44) | def __init__(self):
    method is_detached (line 58) | def is_detached(self):
    method disconnect (line 61) | def disconnect(self):
    method print_devices (line 81) | def print_devices(self):
    method connect_default_usb (line 87) | def connect_default_usb(self):
    method _read_scripts (line 91) | def _read_scripts(self, scripts):
    method read_scripts (line 101) | def read_scripts(self, scripts):
    method install_apk (line 109) | def install_apk(self, filename):
    method attach_package (line 112) | def attach_package(self, package_name, list_file_scripts, pid=None):
    method load_scripts (line 148) | def load_scripts(self, current_session, scripts):
    method run_frida (line 159) | def run_frida(self):
    method androguard_message_handler (line 163) | def androguard_message_handler(self, message, payload):
    method dump (line 260) | def dump(self, package_name):
    method on_detached (line 302) | def on_detached(self, reason):
    method on_spawned (line 306) | def on_spawned(self, spawn):
    method spawn_added (line 311) | def spawn_added(self, spawn):
    method spawn_removed (line 324) | def spawn_removed(self, spawn):
    method child_added (line 328) | def child_added(self, spawn):
    method start_trace (line 331) | def start_trace(

FILE: libs/androguard/pentest/adb.py
  function adb (line 6) | def adb(device_id, cmd=None):

FILE: libs/androguard/pentest/internal/utils.js
  function getStackTrace (line 17) | function getStackTrace() {
  function flatten (line 27) | function flatten(obj) {
  method toString (line 39) | toString() {
  method send (line 43) | send() {
  function agPacket (line 49) | function agPacket(source) {
  function agSysPacket (line 62) | function agSysPacket(source) {
  function agBinderPacket (line 74) | function agBinderPacket(source, payload) {
  function dumpIntent (line 86) | function dumpIntent(intent) {
  function dumpReceiver (line 95) | function dumpReceiver(receiver) {
  function dumpFilter (line 103) | function dumpFilter(filter) {
  function dumpWebview (line 122) | function dumpWebview(wv) {
  function enumerateModules (line 158) | function enumerateModules() {
  function getApplicationContext (line 166) | function getApplicationContext() {
  function traceClass (line 172) | function traceClass(targetClass) {
  function uniqBy (line 203) | function uniqBy(array, key) {
  function traceMethod (line 211) | function traceMethod(targetClassMethod) {
  function describeJavaClass (line 294) | function describeJavaClass(className) {
  function readStreamToHex (line 499) | function readStreamToHex(stream) {
  function getJNIFunctionAdress (line 750) | function getJNIFunctionAdress(jnienv_addr, func_name) {
  function hook_all (line 759) | function hook_all(jnienv_addr) {
  function inspectObject (line 773) | function inspectObject(obj) {
  function classExists (line 792) | function classExists(className) {
  function methodInBeat (line 803) | function methodInBeat(invokeId, timestamp, methodName, executor) {
  function log (line 833) | function log(str) {
  function tryGetClass (line 837) | function tryGetClass(className) {
  function check (line 849) | function check(str) {
  function sendAppInfo (line 868) | function sendAppInfo() {
  function notifyNewSharedPreference (line 908) | function notifyNewSharedPreference(key, value) {

FILE: libs/androguard/pentest/modules/binder/intercept_binder.js
  constant BINDER_WRITER_READ (line 6) | const BINDER_WRITER_READ = 0xc0306201;
  constant BC_TRANSACTION (line 7) | const BC_TRANSACTION = 0x40406300;
  constant BC_REPLY (line 8) | const BC_REPLY = 0x40406301;
  method test (line 14) | test(i) { return false }
  method test (line 21) | test(i) { return false }
  function check_printable_descriptor (line 92) | function check_printable_descriptor(descriptor) {
  function binder_write_read (line 108) | function binder_write_read(ptr) {
  function interface_token (line 120) | function interface_token(ptr) {
  function parcel (line 143) | function parcel(ptr) {
  function print_transaction (line 177) | function print_transaction(p, code) {

FILE: libs/androguard/pentest/modules/code_loading/dyndex.js
  function dump (line 15) | function dump(filename) {

FILE: libs/androguard/pentest/modules/framework/flutter/disable_cert_chain_bypass_v7a.js
  function hook (line 10) | function hook() {

FILE: libs/androguard/pentest/modules/framework/flutter/disable_cert_chain_bypass_v8a.js
  function hook (line 7) | function hook(){

FILE: libs/androguard/pentest/modules/framework/flutter/disable_cert_chain_bypass_x86_64.js
  function hook (line 7) | function hook(){

FILE: libs/androguard/pentest/modules/helpers/antidebug/environment.js
  constant STRINGS_TO_REPLACE (line 29) | const STRINGS_TO_REPLACE = "frida";

FILE: libs/androguard/pentest/modules/helpers/dump/dexdump.js
  function verify_by_maps (line 14) | function verify_by_maps(dexptr, mapsptr) {
  function verify (line 29) | function verify(dexptr, range, enable_verify_maps) {

FILE: libs/androguard/pentest/modules/helpers/pinning/ssl.js
  function bypass_trustmanager_pinning (line 6) | function bypass_trustmanager_pinning() {
  function bypass_okhttp3_pinning (line 40) | function bypass_okhttp3_pinning() {
  function bypass_trustkit_pinning (line 89) | function bypass_trustkit_pinning() {
  function bypass_trustmanagerimpl_pinning (line 115) | function bypass_trustmanagerimpl_pinning(){
  function bypass_appcelerator_pinning (line 142) | function bypass_appcelerator_pinning() {
  function bypass_conscript_pinning (line 155) | function bypass_conscript_pinning() {
  function bypass_apacheharmony_pinning (line 191) | function bypass_apacheharmony_pinning() {
  function bypass_phonegapp_pinning (line 203) | function bypass_phonegapp_pinning() {
  function bypass_ibm_pinning (line 217) | function bypass_ibm_pinning() {
  function bypass_ibmworklight_pinning (line 238) | function bypass_ibmworklight_pinning() {
  function bypass_cwac_pinning (line 265) | function bypass_cwac_pinning() {
  function bypass_netty_pinning (line 279) | function bypass_netty_pinning() {
  function bypass_worklight_pinning (line 294) | function bypass_worklight_pinning() {
  function bypass_squareup_pinning (line 308) | function bypass_squareup_pinning() {
  function bypass_webview_pinning (line 342) | function bypass_webview_pinning() {
  function bypass_cordova_pinning (line 384) | function bypass_cordova_pinning() {
  function bypass_boye_pinning (line 397) | function bypass_boye_pinning() {
  function bypass_apache_pinning (line 409) | function bypass_apache_pinning() {
  function bypass_chromecronet_pinning (line 421) | function bypass_chromecronet_pinning() {
  function bypass_flutter_pinning (line 442) | function bypass_flutter_pinning() {
  function rudimentaryFix (line 467) | function rudimentaryFix(typeName) {
  function bypass_sslpeerunverifiedexception_pinning (line 483) | function bypass_sslpeerunverifiedexception_pinning() {

FILE: libs/androguard/session.py
  class Session (line 13) | class Session:
    method __init__ (line 25) | def __init__(
    method save (line 51) | def save(self, filename: Union[str, None] = None) -> None:
    method _setup_objects (line 58) | def _setup_objects(self):
    method reset (line 74) | def reset(self) -> None:
    method isOpen (line 80) | def isOpen(self) -> bool:
    method show (line 88) | def show(self) -> None:
    method insert_event (line 105) | def insert_event(self, call, callee, params, ret):
    method insert_system_event (line 116) | def insert_system_event(self, call, callee, information, params):
    method addAPK (line 127) | def addAPK(self, filename: str, data: bytes) -> tuple[str, apk.APK]:
    method addDEX (line 166) | def addDEX(
    method addODEX (line 223) | def addODEX(
    method add (line 272) | def add(
    method get_classes (line 315) | def get_classes(
    method get_analysis (line 329) | def get_analysis(self, current_class: dex.ClassDefItem) -> Analysis:
    method get_format (line 343) | def get_format(self, current_class: dex.ClassDefItem) -> dex.DEX:
    method get_filename_by_class (line 352) | def get_filename_by_class(
    method get_digest_by_class (line 370) | def get_digest_by_class(
    method get_strings (line 385) | def get_strings(
    method get_nb_strings (line 402) | def get_nb_strings(self) -> int:
    method get_all_apks (line 417) | def get_all_apks(self) -> Iterator[tuple[str, apk.APK]]:
    method get_objects_apk (line 427) | def get_objects_apk(
    method get_objects_dex (line 469) | def get_objects_dex(self) -> Iterator[tuple[str, dex.DEX, Analysis]]:

FILE: libs/androguard/ui/__init__.py
  class DummyControl (line 34) | class DummyControl(UIControl):
    method create_content (line 43) | def create_content(self, width: int, height: int) -> UIContent:
    method is_focusable (line 51) | def is_focusable(self) -> bool:
  class DynamicUI (line 55) | class DynamicUI:
    method __init__ (line 56) | def __init__(self, input_queue):
    method run (line 73) | def run(self):
    method check_resize (line 218) | def check_resize(self, _):
    method resize_components (line 223) | def resize_components(self, dimensions):
    method get_available_blocks (line 247) | def get_available_blocks(self):
    method process_data (line 257) | def process_data(self):

FILE: libs/androguard/ui/data_types.py
  class DisplayTransaction (line 6) | class DisplayTransaction:
    method __init__ (line 8) | def __init__(self, block: Message) -> None:
    method index (line 13) | def index(self) -> int:
    method unsupported_call (line 17) | def unsupported_call(self) -> bool:
    method to_method (line 21) | def to_method(self) -> str:
    method from_method (line 25) | def from_method(self) -> str:
    method params (line 29) | def params(self) -> str:
    method ret_value (line 33) | def ret_value(self) -> str:
    method fields (line 37) | def fields(self):  # -> Field | None:
    method direction_indicator (line 41) | def direction_indicator(self) -> str:
    method style (line 51) | def style(self) -> str:
    method type (line 78) | def type(self) -> str:

FILE: libs/androguard/ui/filter.py
  class Filter (line 5) | class Filter:
    method __init__ (line 14) | def __init__(
    method passes (line 28) | def passes(self):
    method toggle_inclusivity (line 47) | def toggle_inclusivity(self):
    method __str__ (line 50) | def __str__(self):
  class FilterSet (line 61) | class FilterSet(UserList[_T]):
    method passes (line 63) | def passes(self, interface=None, method=None, call_type=None):

FILE: libs/androguard/ui/selection.py
  class View (line 11) | class View:
    method size (line 15) | def size(self):
  class SelectionViewList (line 22) | class SelectionViewList(UserList[_T]):
    method __init__ (line 24) | def __init__(self, iterable=None, max_view_size=80, view_padding=5):
    method _reset_view (line 33) | def _reset_view(self):
    method selection_valid (line 40) | def selection_valid(self):
    method move_selection (line 43) | def move_selection(self, step: int):
    method selected (line 51) | def selected(self):
    method view_slice (line 57) | def view_slice(self):
    method resize_view (line 60) | def resize_view(self, view_size):
    method _update_view (line 71) | def _update_view(self, step: int):
    method __delitem__ (line 91) | def __delitem__(self, i: int):
    method _expand_view (line 95) | def _expand_view(self):
    method _delete_from_view (line 104) | def _delete_from_view(self, i: int):
    method append (line 124) | def append(self, item: _T):
    method insert (line 128) | def insert(self, i, item: _T):
    method pop (line 142) | def pop(self, i=-1):
    method remove (line 147) | def remove(self, item: _T):
    method clear (line 153) | def clear(self):
    method extend (line 157) | def extend(self, other: Iterable[_T]):
    method assign (line 161) | def assign(self, items: Iterable[_T]):

FILE: libs/androguard/ui/table.py
  class EmptyBorder (line 30) | class EmptyBorder:
  class SpaceBorder (line 47) | class SpaceBorder:
  class AsciiBorder (line 65) | class AsciiBorder:
  class ThinBorder (line 83) | class ThinBorder:
  class RoundedBorder (line 101) | class RoundedBorder(ThinBorder):
  class ThickBorder (line 109) | class ThickBorder:
  class DoubleBorder (line 127) | class DoubleBorder:
  class Merge (line 156) | class Merge:
    method __init__ (line 157) | def __init__(self, cell, merge=1):
    method __iter__ (line 161) | def __iter__(self):
  class Table (line 166) | class Table(HSplit):
    method __init__ (line 168) | def __init__(
    method add_row (line 221) | def add_row(self, row, style, cache_id):
    method columns (line 235) | def columns(self):
    method _all_children (line 239) | def _all_children(self):
    method preferred_dimensions (line 275) | def preferred_dimensions(self, width):
  class _VerticalBorder (line 302) | class _VerticalBorder(Window):
    method __init__ (line 303) | def __init__(self, borders):
  class _HorizontalBorder (line 307) | class _HorizontalBorder(Window):
    method __init__ (line 308) | def __init__(self, borders):
  class _UnitBorder (line 312) | class _UnitBorder(Window):
    method __init__ (line 313) | def __init__(self, char):
  class _BaseRow (line 317) | class _BaseRow(VSplit):
    method columns (line 319) | def columns(self):
    method _divide_widths (line 322) | def _divide_widths(self, width):
  class _Row (line 389) | class _Row(_BaseRow):
    method __init__ (line 390) | def __init__(
    method raw_columns (line 438) | def raw_columns(self):
    method _all_children (line 442) | def _all_children(self):
  class _Border (line 479) | class _Border(_BaseRow):
    method __init__ (line 480) | def __init__(
    method has_borders (line 521) | def has_borders(self, row):
    method _all_children (line 539) | def _all_children(self):
  class _Cell (line 598) | class _Cell(HSplit):
    method __init__ (line 599) | def __init__(
  function demo (line 660) | def demo():

FILE: libs/androguard/ui/util.py
  function clamp (line 1) | def clamp(range_min: int, range_max: int, value: int) -> int:

FILE: libs/androguard/ui/widget/details.py
  class DetailsFrame (line 21) | class DetailsFrame:
    method __init__ (line 22) | def __init__(
    method activated (line 40) | def activated(self) -> bool:
    method activated (line 44) | def activated(self, value: bool):
    method update_content (line 47) | def update_content(self, _, offset=0):
    method get_content (line 51) | def get_content(self) -> AnyContainer:
    method get_current_details (line 63) | def get_current_details(self):
    method __pt_container__ (line 72) | def __pt_container__(self) -> AnyContainer:

FILE: libs/androguard/ui/widget/filters.py
  class TypeCheckboxlist (line 12) | class TypeCheckboxlist(CheckboxList):
    method __init__ (line 14) | def __init__(self) -> None:
  class FiltersPanel (line 26) | class FiltersPanel:
    method __init__ (line 28) | def __init__(self) -> None:
    method filter (line 84) | def filter(self) -> Filter:
    method __pt_container__ (line 92) | def __pt_container__(self) -> AnyContainer:

FILE: libs/androguard/ui/widget/frame.py
  class SelectableFrame (line 20) | class SelectableFrame:
    method __init__ (line 32) | def __init__(
    method __pt_container__ (line 123) | def __pt_container__(self) -> Container:

FILE: libs/androguard/ui/widget/help.py
  class HelpPanel (line 5) | class HelpPanel:
    method __init__ (line 7) | def __init__(self) -> None:
    method __pt_container__ (line 39) | def __pt_container__(self) -> AnyContainer:

FILE: libs/androguard/ui/widget/toolbar.py
  class StatusToolbar (line 10) | class StatusToolbar:
    method __init__ (line 12) | def __init__(self, transactions: Sequence, filters: FiltersPanel) -> N...
    method toolbar_container (line 17) | def toolbar_container(self) -> AnyContainer:
    method toolbar_text (line 23) | def toolbar_text(self) -> AnyFormattedText:
    method __pt_container__ (line 33) | def __pt_container__(self) -> AnyContainer:

FILE: libs/androguard/ui/widget/transactions.py
  class TransactionFrame (line 18) | class TransactionFrame:
    method __init__ (line 20) | def __init__(
    method resize (line 53) | def resize(self, height):
    method get_content (line 58) | def get_content(self):
    method update_table (line 61) | def update_table(self, _):
    method pad_table (line 81) | def pad_table(self):
    method key_bindings (line 97) | def key_bindings(self) -> KeyBindings:
    method activated (line 129) | def activated(self):
    method activated (line 134) | def activated(self, value):
    method _to_row (line 150) | def _to_row(self, transaction):
    method __pt_container__ (line 159) | def __pt_container__(self) -> AnyContainer:

FILE: libs/androguard/util.py
  class MyFilter (line 14) | class MyFilter:
    method __init__ (line 15) | def __init__(self, level: str) -> None:
    method __call__ (line 18) | def __call__(self, record):
  function set_log (line 22) | def set_log(level:str) -> None:
  function read_at (line 45) | def read_at(buff: BinaryIO, offset: int, size: int = -1) -> bytes:
  function readFile (line 53) | def readFile(filename: str, binary: bool = True) -> bytes:
  function get_certificate_name_string (line 64) | def get_certificate_name_string(
  function parse_public (line 119) | def parse_public(data):
  function calculate_fingerprint (line 175) | def calculate_fingerprint(key_object):

FILE: libs/apkInspector/axml.py
  class ResChunkHeader (line 16) | class ResChunkHeader:
    method __init__ (line 23) | def __init__(self, header_type, header_size, total_size, data):
    method parse (line 30) | def parse(cls, file):
  class ResStringPoolHeader (line 47) | class ResStringPoolHeader:
    method __init__ (line 52) | def __init__(self, header: ResChunkHeader, string_count, style_count, ...
    method parse (line 63) | def parse(cls, file):
  class StringPoolType (line 79) | class StringPoolType:
    method __init__ (line 85) | def __init__(self, string_pool_header: ResStringPoolHeader, string_off...
    method read_string_offsets (line 92) | def read_string_offsets(cls, file, num_of_strings, end_absolute_offset):
    method read_string_offset (line 115) | def read_string_offset(cls, file, position):
    method decode_stringpool_mixed_string (line 125) | def decode_stringpool_mixed_string(cls, file, is_utf8, end_stringpool_...
    method read_strings (line 163) | def read_strings(cls, file, string_offsets, strings_start, is_utf8):
    method read_string (line 190) | def read_string(cls, file, string_offset, strings_start, is_utf8, end_...
    method get_string_from_pool (line 215) | def get_string_from_pool(cls, position, string_pool_data, end_stringpo...
    method parse_lite (line 243) | def parse_lite(cls, file):
    method parse (line 264) | def parse(cls, file):
  class XmlResourceMapType (line 303) | class XmlResourceMapType:
    method __init__ (line 308) | def __init__(self, header, resids, resids_data):
    method parse_lite (line 314) | def parse_lite(cls, file):
    method parse (line 328) | def parse(cls, file):
  class ResXMLHeader (line 346) | class ResXMLHeader:
    method __init__ (line 353) | def __init__(self, header: ResChunkHeader, data):
    method parse (line 360) | def parse(cls, file):
  class XmlStartNamespace (line 377) | class XmlStartNamespace:
    method __init__ (line 382) | def __init__(self, header: ResXMLHeader, ext, ext_data):
    method parse (line 388) | def parse(cls, file, header_t: ResXMLHeader):
  class XmlEndNamespace (line 405) | class XmlEndNamespace:
    method __init__ (line 410) | def __init__(self, header: ResXMLHeader, prefix_namespace_index, uri_i...
    method parse (line 417) | def parse(cls, file, header_t: ResXMLHeader):
  class XmlAttributeElement (line 433) | class XmlAttributeElement:
    method __init__ (line 438) | def __init__(self, full_namespace_index, name_index, raw_value_index, ...
    method parse (line 449) | def parse(cls, file, attr_count, attr_size):
  class XmlStartElement (line 489) | class XmlStartElement:
    method __init__ (line 495) | def __init__(self, header: ResXMLHeader, attrext, attributes, start_el...
    method parse (line 502) | def parse(cls, file, header_t: ResXMLHeader):
  class XmlEndElement (line 527) | class XmlEndElement:
    method __init__ (line 532) | def __init__(self, header: ResXMLHeader, attrext, attrext_data):
    method parse (line 538) | def parse(cls, file, header_t: ResXMLHeader):
  class XmlcDataElement (line 555) | class XmlcDataElement:
    method __init__ (line 561) | def __init__(self, header: ResXMLHeader, data_index, typed_value_size,...
    method parse (line 572) | def parse(cls, file, header_t: ResXMLHeader):
  class ManifestStruct (line 589) | class ManifestStruct:
    method __init__ (line 594) | def __init__(self, header: ResChunkHeader, string_pool: StringPoolType...
    method check_reached_element (line 601) | def check_reached_element(file: io.BytesIO):
    method parse_next_header (line 626) | def parse_next_header(file):
    method process_elements (line 646) | def process_elements(file, num_of_elements=None):
    method get_manifest (line 678) | def get_manifest(self):
    method parse_lite (line 689) | def parse_lite(manifest, num_of_elements=None):
    method parse (line 710) | def parse(cls, file):
  function handle_unknown_chunk (line 726) | def handle_unknown_chunk(file: io.BytesIO, header_t: ResXMLHeader):
  function read_remaining (line 750) | def read_remaining(file: io.BytesIO, header: ResChunkHeader):
  function process_attributes (line 764) | def process_attributes(attributes, string_list, ns_dict):
  function create_manifest (line 820) | def create_manifest(elements, string_list):
  function get_manifest (line 867) | def get_manifest(raw_manifest):
  function parse_apk_for_manifest (line 880) | def parse_apk_for_manifest(inc_apk, raw: bool = False, lite: bool = Fals...
  function get_manifest_lite (line 913) | def get_manifest_lite(manifest: io.BytesIO, num_of_elements: int):
  function get_attribute_value (line 946) | def get_attribute_value(attr_name, attribute, end_stringpool_offset, str...

FILE: libs/apkInspector/extract.py
  function extract_file_based_on_header_info (line 6) | def extract_file_based_on_header_info(apk_file, local_header_info, centr...
  function extract_all_files_from_central_directory (line 68) | def extract_all_files_from_central_directory(apk_file, central_directory...

FILE: libs/apkInspector/headers.py
  class EndOfCentralDirectoryRecord (line 11) | class EndOfCentralDirectoryRecord:
    method __init__ (line 15) | def __init__(self, signature, number_of_this_disk, disk_where_central_...
    method parse (line 30) | def parse(cls, apk_file):
    method to_dict (line 84) | def to_dict(self):
    method from_dict (line 104) | def from_dict(cls, entry_dict):
  class CentralDirectoryEntry (line 116) | class CentralDirectoryEntry:
    method __init__ (line 120) | def __init__(self, version_made_by, version_needed_to_extract, general...
    method to_dict (line 147) | def to_dict(self):
    method from_dict (line 178) | def from_dict(cls, entry_dict):
  class CentralDirectory (line 190) | class CentralDirectory:
    method __init__ (line 195) | def __init__(self, entries):
    method parse (line 199) | def parse(cls, apk_file, eocd: EndOfCentralDirectoryRecord = None):
    method to_dict (line 257) | def to_dict(self):
    method from_dict (line 267) | def from_dict(cls, entry_dict):
  class LocalHeaderRecord (line 283) | class LocalHeaderRecord:
    method __init__ (line 287) | def __init__(self, version_needed_to_extract, general_purpose_bit_flag,
    method parse (line 306) | def parse(cls, apk_file, entry_of_interest: CentralDirectoryEntry):
    method to_dict (line 346) | def to_dict(self):
    method from_dict (line 369) | def from_dict(cls, entry_dict):
  class ZipEntry (line 381) | class ZipEntry:
    method __init__ (line 385) | def __init__(self, zip_bytes, eocd: EndOfCentralDirectoryRecord, centr...
    method parse (line 393) | def parse(cls, inc_apk, raw: bool = True):
    method parse_single (line 419) | def parse_single(cls, apk_file, filename, eocd: EndOfCentralDirectoryR...
    method to_dict (line 441) | def to_dict(self):
    method get_central_directory_entry_dict (line 454) | def get_central_directory_entry_dict(self, filename):
    method get_local_header_dict (line 468) | def get_local_header_dict(self, filename):
    method read (line 482) | def read(self, name, save: bool = False):
    method infolist (line 499) | def infolist(self) -> Dict[str, CentralDirectoryEntry]:
    method namelist (line 508) | def namelist(self):
    method extract_all (line 517) | def extract_all(self, extract_path, apk_name):
  function print_headers_of_filename (line 532) | def print_headers_of_filename(cd_h_of_file, local_header_of_file):
  function show_and_save_info_of_headers (line 555) | def show_and_save_info_of_headers(entries, apk_name, header_type: str, e...

FILE
Condensed preview — 258 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (9,689K chars).
[
  {
    "path": ".gitignore",
    "chars": 276,
    "preview": "# Python\n__pycache__/\n*.py[cod]\n*$py.class\n\n# Distribution / Packaging\nbuild/\ndist/\n*.egg-info/\n.eggs/\n\n# Unit test / co"
  },
  {
    "path": "AnalysisCSN/CSN.py",
    "chars": 1443,
    "preview": "# -*- coding: utf-8 -*-\n__author__ = 'Andy'\n\nclass CSN:\n    def __init__(self, apk_obj):\n        self.apk = apk_obj\n    "
  },
  {
    "path": "AnalysisCSN/__init__.py",
    "chars": 20,
    "preview": "__author__ = 'Andy'\n"
  },
  {
    "path": "AnalysisDEX/InitDEX.py",
    "chars": 3113,
    "preview": "# -*- coding: utf-8 -*-\n__author__ = 'Andy'\n\nfrom androguard.core.dex import DEX\n\nclass InitDEX:\n    def __init__(self, "
  },
  {
    "path": "AnalysisDEX/__init__.py",
    "chars": 20,
    "preview": "__author__ = 'Andy'\n"
  },
  {
    "path": "AnalysisXML/AXML.py",
    "chars": 2919,
    "preview": "# -*- coding: utf-8 -*-\n__author__ = 'Andy'\n\nMIN_SDK_VERSION = {\n    \"1\": \"Android 1.0\",\n    \"2\": \"Android 1.1\",\n    \"3\""
  },
  {
    "path": "AnalysisXML/__init__.py",
    "chars": 20,
    "preview": "__author__ = 'Andy'\n"
  },
  {
    "path": "ApkDetecter.py",
    "chars": 6810,
    "preview": "# -*- coding: utf-8 -*-\n__author__ = 'Andy'\n\nimport sys\nimport os\nimport platform\nimport ctypes\n\n# === FIX FOR PYINSTALL"
  },
  {
    "path": "ApkDetecter.pyw",
    "chars": 503,
    "preview": "# -*- coding: utf-8 -*-\n__author__ = 'Andy'\n\nimport sys\nimport os\n\n# Add libs to path\nsys.path.insert(0, os.path.join(os"
  },
  {
    "path": "ApkDetecter.spec",
    "chars": 1694,
    "preview": "# -*- mode: python ; coding: utf-8 -*-\n\nblock_cipher = None\n\nimport os\nimport sys\n\n# Ensure libs path is included\nsys.pa"
  },
  {
    "path": "CheckProtect.py",
    "chars": 3804,
    "preview": "# -*- coding: utf-8 -*-\n__author__ = 'Andy'\n\nimport json\nimport os\nfrom androguard.core.apk import APK\n\nclass CheckProte"
  },
  {
    "path": "GUI/AppInfoWidget.py",
    "chars": 9964,
    "preview": "\nfrom PyQt5 import QtWidgets, QtCore, QtGui\nimport os\nimport platform\n\nclass AppInfoWidget(QtWidgets.QWidget):\n    def _"
  },
  {
    "path": "GUI/MainForm.py",
    "chars": 25772,
    "preview": "\nfrom PyQt5 import QtWidgets, QtCore, QtGui\nimport sys\nimport os\nimport platform\n\nfrom GUI.AppInfoWidget import AppInfoW"
  },
  {
    "path": "GUI/StyleSheet.py",
    "chars": 3194,
    "preview": "\n# Modern Dark Theme for ApkDetecter\nimport platform\n\nQSS_COMMON = \"\"\"\n/* General Window */\nQMainWindow, QDialog, QWidge"
  },
  {
    "path": "GUI/__init__.py",
    "chars": 20,
    "preview": "__author__ = 'Andy'\n"
  },
  {
    "path": "GUI/apkdetecter_ui.ui",
    "chars": 10820,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>APKDetecter</class>\n <widget class=\"QWidget\" name=\"APK"
  },
  {
    "path": "GUI/apkinfo_ui.ui",
    "chars": 11082,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ApkInfo</class>\n <widget class=\"QWidget\" name=\"ApkInfo"
  },
  {
    "path": "GUI/dexinfor_ui.ui",
    "chars": 19432,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>DexInfo</class>\n <widget class=\"QWidget\" name=\"DexInfo"
  },
  {
    "path": "LICENSE.txt",
    "chars": 26443,
    "preview": "                  GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 2.1, February 1999\n\n Copyright (C) 19"
  },
  {
    "path": "README.md",
    "chars": 2823,
    "preview": "# ApkDetecter - APK/IPA 查壳分析工具\n\nApkDetecter 是一款功能强大的跨平台工具,用于分析 Android (APK) 和 iOS (IPA) 应用程序。它提供了一个图形界面,用于查看应用信息、检查是否加壳"
  },
  {
    "path": "Resources/signatures.json",
    "chars": 3409,
    "preview": "{\n  \"signatures\": [\n    {\n      \"name\": \"360加固 (Qihoo 360)\",\n      \"rules\": [\n        { \"type\": \"file\", \"pattern\": \"libj"
  },
  {
    "path": "__init__.py",
    "chars": 20,
    "preview": "__author__ = 'Andy'\n"
  },
  {
    "path": "build_mac.sh",
    "chars": 670,
    "preview": "#!/bin/bash\n\necho \"Detected macOS system build request.\"\nSPEC_FILE=\"ApkDetecter.spec\"\n\nif [ ! -f \"$SPEC_FILE\" ]; then\n  "
  },
  {
    "path": "build_windows.bat",
    "chars": 873,
    "preview": "@echo off\necho Building ApkDetecter for Windows...\npip install -r requirements.txt\npip install pyinstaller Pillow\n\necho "
  },
  {
    "path": "core/ApkAnalyzer.py",
    "chars": 14429,
    "preview": "\nimport os\nimport hashlib\nimport sys\nimport zipfile\nimport re\nimport logging\nfrom datetime import datetime\n\n# Import exi"
  },
  {
    "path": "core/DeepScanner.py",
    "chars": 12552,
    "preview": "# -*- coding: utf-8 -*-\nimport re\nimport logging\nimport zipfile\nimport string\n\ntry:\n    from androguard.core.dex import "
  },
  {
    "path": "core/IpaAnalyzer.py",
    "chars": 18472,
    "preview": "\nimport zipfile\nimport plistlib\nimport os\nimport hashlib\nimport sys\nimport struct\nfrom datetime import datetime\n\n# Ensur"
  },
  {
    "path": "core/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "libs/androguard/__init__.py",
    "chars": 156,
    "preview": "# The current version of Androguard\n# Please use only this variable in any scripts,\n# to keep the version number the sam"
  },
  {
    "path": "libs/androguard/cli/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "libs/androguard/cli/cli.py",
    "chars": 17499,
    "preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n\"\"\"Androguard is a full Python tool to reverse Android Applications.\"\"\"\n"
  },
  {
    "path": "libs/androguard/cli/main.py",
    "chars": 19205,
    "preview": "# core modules\nimport os\nimport re\nimport shutil\nimport sys\nfrom typing import Union\n\nfrom loguru import logger\n\n# 3rd p"
  },
  {
    "path": "libs/androguard/core/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "libs/androguard/core/analysis/__init__.py",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "libs/androguard/core/analysis/analysis.py",
    "chars": 90208,
    "preview": "# Allows type hinting of types not-yet-declared\n# in Python >= 3.7\n# see https://peps.python.org/pep-0563/\nfrom __future"
  },
  {
    "path": "libs/androguard/core/androconf.py",
    "chars": 7872,
    "preview": "# Allows type hinting of types not-yet-declared\n# in Python >= 3.7\n# see https://peps.python.org/pep-0563/\nfrom __future"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/__init__.py",
    "chars": 3639,
    "preview": "import json\nimport os\nimport re\nfrom typing import Union\n\nfrom loguru import logger\n\n\nclass APILevelNotFoundError(Except"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_10.json",
    "chars": 72874,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCOUNTS\": {\n      \"description\": \"Access the available accounts.\",\n      "
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_13.json",
    "chars": 74153,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCOUNTS\": {\n      \"description\": \"Access the available accounts.\",\n      "
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_14.json",
    "chars": 83838,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCOUNTS\": {\n      \"description\": \"Access the available accounts.\",\n      "
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_15.json",
    "chars": 85210,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCOUNTS\": {\n      \"description\": \"Access the available accounts.\",\n      "
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_16.json",
    "chars": 92149,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCOUNTS\": {\n      \"description\": \"Access the available accounts.\",\n      "
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_17.json",
    "chars": 107091,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCOUNTS\": {\n      \"description\": \"Access the available accounts.\",\n      "
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_18.json",
    "chars": 111302,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCESSIBILITY_FEATURES\": {\n      \"description\": \"Features that assistive t"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_19.json",
    "chars": 121871,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCESSIBILITY_FEATURES\": {\n      \"description\": \"Features that assistive t"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_21.json",
    "chars": 138880,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCESSIBILITY_FEATURES\": {\n      \"description\": \"Features that assistive t"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_22.json",
    "chars": 142552,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCESSIBILITY_FEATURES\": {\n      \"description\": \"Features that assistive t"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_23.json",
    "chars": 109896,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.CALENDAR\": {\n      \"description\": \"access your calendar\",\n      \"descripti"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_24.json",
    "chars": 120102,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.CALENDAR\": {\n      \"description\": \"access your calendar\",\n      \"descripti"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_25.json",
    "chars": 120261,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.CALENDAR\": {\n      \"description\": \"access your calendar\",\n      \"descripti"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_26.json",
    "chars": 130585,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.CALENDAR\": {\n      \"description\": \"access your calendar\",\n      \"descripti"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_27.json",
    "chars": 136413,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.CALENDAR\": {\n      \"description\": \"access your calendar\",\n      \"descripti"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_28.json",
    "chars": 152916,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.CALENDAR\": {\n      \"description\": \"access your calendar\",\n      \"descripti"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_29.json",
    "chars": 179247,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACTIVITY_RECOGNITION\": {\n      \"description\": \"access your physical activi"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_30.json",
    "chars": 195808,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACTIVITY_RECOGNITION\": {\n      \"description\": \"access your physical activi"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_31.json",
    "chars": 227446,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACTIVITY_RECOGNITION\": {\n      \"description\": \"access your physical activi"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_32.json",
    "chars": 228655,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACTIVITY_RECOGNITION\": {\n      \"description\": \"access your physical activi"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_33.json",
    "chars": 254150,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACTIVITY_RECOGNITION\": {\n      \"description\": \"access your physical activi"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_34.json",
    "chars": 303365,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACTIVITY_RECOGNITION\": {\n      \"description\": \"access your physical activi"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_4.json",
    "chars": 61160,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCOUNTS\": {\n      \"description\": \"Access the available Google accounts.\","
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_5.json",
    "chars": 64832,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCOUNTS\": {\n      \"description\": \"Access the available accounts.\",\n      "
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_6.json",
    "chars": 64832,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCOUNTS\": {\n      \"description\": \"Access the available accounts.\",\n      "
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_7.json",
    "chars": 64832,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCOUNTS\": {\n      \"description\": \"Access the available accounts.\",\n      "
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_8.json",
    "chars": 70158,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCOUNTS\": {\n      \"description\": \"Access the available accounts.\",\n      "
  },
  {
    "path": "libs/androguard/core/api_specific_resources/aosp_permissions/permissions_9.json",
    "chars": 71331,
    "preview": "{\n  \"groups\": {\n    \"android.permission-group.ACCOUNTS\": {\n      \"description\": \"Access the available accounts.\",\n      "
  },
  {
    "path": "libs/androguard/core/api_specific_resources/api_permission_mappings/permissions_16.json",
    "chars": 179196,
    "preview": "{\n    \"Landroid/accounts/AbstractAccountAuthenticator$Transport;-addAccount-(Landroid/accounts/IAccountAuthenticatorResp"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/api_permission_mappings/permissions_17.json",
    "chars": 214407,
    "preview": "{\n    \"Landroid/accounts/AbstractAccountAuthenticator$Transport;-addAccount-(Landroid/accounts/IAccountAuthenticatorResp"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/api_permission_mappings/permissions_18.json",
    "chars": 224135,
    "preview": "{\n    \"Landroid/accounts/AbstractAccountAuthenticator$Transport;-addAccount-(Landroid/accounts/IAccountAuthenticatorResp"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/api_permission_mappings/permissions_19.json",
    "chars": 220470,
    "preview": "{\n    \"Landroid/accounts/AbstractAccountAuthenticator$Transport;-addAccount-(Landroid/accounts/IAccountAuthenticatorResp"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/api_permission_mappings/permissions_21.json",
    "chars": 334121,
    "preview": "{\n    \"Landroid/accounts/AbstractAccountAuthenticator$Transport;-addAccount-(Landroid/accounts/IAccountAuthenticatorResp"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/api_permission_mappings/permissions_22.json",
    "chars": 310636,
    "preview": "{\n    \"Landroid/accounts/AbstractAccountAuthenticator$Transport;-addAccount-(Landroid/accounts/IAccountAuthenticatorResp"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/api_permission_mappings/permissions_23.json",
    "chars": 246635,
    "preview": "{\n    \"Landroid/accounts/AbstractAccountAuthenticator$Transport;-addAccount-(Landroid/accounts/IAccountAuthenticatorResp"
  },
  {
    "path": "libs/androguard/core/api_specific_resources/api_permission_mappings/permissions_24.json",
    "chars": 369549,
    "preview": "{\n    \"Landroid/hardware/location/ActivityRecognitionHardware;-disableActivityEvent-(Ljava/lang/String; I)Z\": [\n        "
  },
  {
    "path": "libs/androguard/core/api_specific_resources/api_permission_mappings/permissions_25.json",
    "chars": 377172,
    "preview": "{\n    \"Landroid/hardware/location/ActivityRecognitionHardware;-disableActivityEvent-(Ljava/lang/String; I)Z\": [\n        "
  },
  {
    "path": "libs/androguard/core/apk/__init__.py",
    "chars": 108455,
    "preview": "# Allows type hinting of types not-yet-declared\n# in Python >= 3.7\n# see https://peps.python.org/pep-0563/\nfrom __future"
  },
  {
    "path": "libs/androguard/core/axml/__init__.py",
    "chars": 136645,
    "preview": "# Allows type hinting of types not-yet-declared\n# in Python >= 3.7\n# see https://peps.python.org/pep-0563/\nfrom __future"
  },
  {
    "path": "libs/androguard/core/axml/types.py",
    "chars": 1979,
    "preview": "# Type definiton for (type, data) tuples representing a value\n# See http://androidxref.com/9.0.0_r3/xref/frameworks/base"
  },
  {
    "path": "libs/androguard/core/bytecode.py",
    "chars": 32031,
    "preview": "# Allows type hinting of types not-yet-declared\n# in Python >= 3.7\n# see https://peps.python.org/pep-0563/\nfrom __future"
  },
  {
    "path": "libs/androguard/core/dex/__init__.py",
    "chars": 288497,
    "preview": "# Allows type hinting of types not-yet-declared\n# in Python >= 3.7\n# see https://peps.python.org/pep-0563/\nfrom __future"
  },
  {
    "path": "libs/androguard/core/dex/dex_types.py",
    "chars": 7689,
    "preview": "from collections import OrderedDict\nfrom enum import IntEnum\n\n# This file contains dictionaries used in the Dalvik Forma"
  },
  {
    "path": "libs/androguard/core/mutf8/__init__.py",
    "chars": 122,
    "preview": "from mutf8 import decode_modified_utf8, encode_modified_utf8\n\ndecode = decode_modified_utf8\nencode = encode_modified_utf"
  },
  {
    "path": "libs/androguard/core/resources/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "libs/androguard/core/resources/public.json",
    "chars": 106820,
    "preview": "{\n    \"attr\": {\n        \"theme\": 16842752,\n        \"label\": 16842753,\n        \"icon\": 16842754,\n        \"name\": 16842755"
  },
  {
    "path": "libs/androguard/core/resources/public.py",
    "chars": 2092,
    "preview": "import os\nfrom xml.dom import minidom\n\n_public_res = None\n# copy the newest sdk/platforms/android-?/data/res/values/publ"
  },
  {
    "path": "libs/androguard/core/resources/public.xml",
    "chars": 191207,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This file defines the base public resources exported by the\n     platform, w"
  },
  {
    "path": "libs/androguard/decompiler/__init__.py",
    "chars": 40,
    "preview": "import sys\n\nsys.setrecursionlimit(5000)\n"
  },
  {
    "path": "libs/androguard/decompiler/basic_blocks.py",
    "chars": 10941,
    "preview": "# This file is part of Androguard.\n#\n# Copyright (c) 2012 Geoffroy Gueguen <geoffroy.gueguen@gmail.com>\n# All Rights Res"
  },
  {
    "path": "libs/androguard/decompiler/control_flow.py",
    "chars": 15165,
    "preview": "# This file is part of Androguard.\n#\n# Copyright (c) 2012 Geoffroy Gueguen <geoffroy.gueguen@gmail.com>\n# All Rights Res"
  },
  {
    "path": "libs/androguard/decompiler/dast.py",
    "chars": 27086,
    "preview": "# This file is part of Androguard.\n#\n# Copyright (C) 2014 Google Inc. All rights reserved.\n#\n# Licensed under the Apache"
  },
  {
    "path": "libs/androguard/decompiler/dataflow.py",
    "chars": 20340,
    "preview": "# This file is part of Androguard.\n#\n# Copyright (c) 2012 Geoffroy Gueguen <geoffroy.gueguen@gmail.com>\n# All Rights Res"
  },
  {
    "path": "libs/androguard/decompiler/decompile.py",
    "chars": 22393,
    "preview": "# This file is part of Androguard.\n#\n# Copyright (c) 2012 Geoffroy Gueguen <geoffroy.gueguen@gmail.com>\n# All Rights Res"
  },
  {
    "path": "libs/androguard/decompiler/decompiler.py",
    "chars": 3336,
    "preview": "# This file is part of Androguard.\n#\n# Copyright (C) 2013, Anthony Desnos <desnos at t0t0.fr>\n# All rights reserved.\n#\n#"
  },
  {
    "path": "libs/androguard/decompiler/graph.py",
    "chars": 18630,
    "preview": "# This file is part of Androguard.\n#\n# Copyright (c) 2012 Geoffroy Gueguen <geoffroy.gueguen@gmail.com>\n# All Rights Res"
  },
  {
    "path": "libs/androguard/decompiler/instruction.py",
    "chars": 37806,
    "preview": "# This file is part of Androguard.\n#\n# Copyright (C) 2012, Geoffroy Gueguen <geoffroy.gueguen@gmail.com>\n# All rights re"
  },
  {
    "path": "libs/androguard/decompiler/node.py",
    "chars": 4875,
    "preview": "# This file is part of Androguard.\n#\n# Copyright (c) 2012 Geoffroy Gueguen <geoffroy.gueguen@gmail.com>\n# All Rights Res"
  },
  {
    "path": "libs/androguard/decompiler/opcode_ins.py",
    "chars": 61407,
    "preview": "# This file is part of Androguard.\n#\n# Copyright (C) 2012, Geoffroy Gueguen <geoffroy.gueguen@gmail.com>\n# All rights re"
  },
  {
    "path": "libs/androguard/decompiler/util.py",
    "chars": 6566,
    "preview": "# This file is part of Androguard.\n#\n# Copyright (c) 2012 Geoffroy Gueguen <geoffroy.gueguen@gmail.com>\n# All Rights Res"
  },
  {
    "path": "libs/androguard/decompiler/writer.py",
    "chars": 26919,
    "preview": "# This file is part of Androguard.\n#\n# Copyright (c) 2012 Geoffroy Gueguen <geoffroy.gueguen@gmail.com>\n# All Rights Res"
  },
  {
    "path": "libs/androguard/misc.py",
    "chars": 7348,
    "preview": "# Allows type hinting of types not-yet-declared\n# in Python >= 3.7\n# see https://peps.python.org/pep-0563/\nfrom __future"
  },
  {
    "path": "libs/androguard/pentest/__init__.py",
    "chars": 12185,
    "preview": "import glob\nimport hashlib\nimport json\nimport os\nimport queue\nimport threading\n\nimport frida\n\nfrom . import adb\n\nmd5 = l"
  },
  {
    "path": "libs/androguard/pentest/adb.py",
    "chars": 211,
    "preview": "import subprocess\n\nfrom loguru import logger\n\n\ndef adb(device_id, cmd=None):\n    logger.info(\"ADB: Running on {}:{}\".for"
  },
  {
    "path": "libs/androguard/pentest/internal/utils.js",
    "chars": 25374,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\nconsole.log(\"[+] LOADING INTERN"
  },
  {
    "path": "libs/androguard/pentest/modules/binder/intercept_binder.js",
    "chars": 8549,
    "preview": "// Ripped from https://github.com/foundryzero/binder-trace and modified to fit Androguard packets\n\ncolorLog('[+] LOADING"
  },
  {
    "path": "libs/androguard/pentest/modules/code_loading/dex.js",
    "chars": 2857,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING CODE_LOAD"
  },
  {
    "path": "libs/androguard/pentest/modules/code_loading/dyndex.js",
    "chars": 4153,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING CODE_LOAD"
  },
  {
    "path": "libs/androguard/pentest/modules/code_loading/load_class.js",
    "chars": 841,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING CODE_LOAD"
  },
  {
    "path": "libs/androguard/pentest/modules/code_loading/native.js",
    "chars": 723,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING CODE_LOAD"
  },
  {
    "path": "libs/androguard/pentest/modules/compression/gzip.js",
    "chars": 1011,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING COMPRESSI"
  },
  {
    "path": "libs/androguard/pentest/modules/encoding/base64.js",
    "chars": 1076,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING ENCODING/"
  },
  {
    "path": "libs/androguard/pentest/modules/encryption/cipher.js",
    "chars": 3653,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog(\"[+] LOADING ENCRYPTIO"
  },
  {
    "path": "libs/androguard/pentest/modules/encryption/keystore.js",
    "chars": 1386,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog(\"[+] LOADING ENCRYPTIO"
  },
  {
    "path": "libs/androguard/pentest/modules/file_system/shared_preferences.js",
    "chars": 2945,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING FILE_SYST"
  },
  {
    "path": "libs/androguard/pentest/modules/framework/cordova.js",
    "chars": 432,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING FRAMEWORK"
  },
  {
    "path": "libs/androguard/pentest/modules/framework/flutter/disable_cert_chain_bypass_v7a.js",
    "chars": 1768,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING FRAMEWORK"
  },
  {
    "path": "libs/androguard/pentest/modules/framework/flutter/disable_cert_chain_bypass_v8a.js",
    "chars": 1749,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING FRAMEWORK"
  },
  {
    "path": "libs/androguard/pentest/modules/framework/flutter/disable_cert_chain_bypass_x86_64.js",
    "chars": 1786,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING FRAMEWORK"
  },
  {
    "path": "libs/androguard/pentest/modules/helpers/antidebug/binaries.js",
    "chars": 2351,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING HELPER/AN"
  },
  {
    "path": "libs/androguard/pentest/modules/helpers/antidebug/debug.js",
    "chars": 358,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING HELPER/AN"
  },
  {
    "path": "libs/androguard/pentest/modules/helpers/antidebug/environment.js",
    "chars": 3976,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING HELPER/AN"
  },
  {
    "path": "libs/androguard/pentest/modules/helpers/antidebug/package.js",
    "chars": 2752,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING HELPER/AN"
  },
  {
    "path": "libs/androguard/pentest/modules/helpers/antidebug/process.js",
    "chars": 9174,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING HELPER/AN"
  },
  {
    "path": "libs/androguard/pentest/modules/helpers/dump/dexdump.js",
    "chars": 4317,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\n/*\n* Author: hluwa <hluwa888@gm"
  },
  {
    "path": "libs/androguard/pentest/modules/helpers/pinning/ssl.js",
    "chars": 30140,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING HELPERS/P"
  },
  {
    "path": "libs/androguard/pentest/modules/http_communications/uri.js",
    "chars": 1816,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING HTTP_COMM"
  },
  {
    "path": "libs/androguard/pentest/modules/intents/intents.js",
    "chars": 5507,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING INTENTS/I"
  },
  {
    "path": "libs/androguard/pentest/modules/intents/intents_creation.js",
    "chars": 6236,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING INTENTS/I"
  },
  {
    "path": "libs/androguard/pentest/modules/intents/pending_intents.js",
    "chars": 1892,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING INTENTS/P"
  },
  {
    "path": "libs/androguard/pentest/modules/ipc/ipc.js",
    "chars": 5888,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING IPC/IPC.J"
  },
  {
    "path": "libs/androguard/pentest/modules/preferences/preferences.js",
    "chars": 523,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog(\"[+] LOADING PREFERENC"
  },
  {
    "path": "libs/androguard/pentest/modules/sockets/sockets.js",
    "chars": 4216,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING SOCKETS/S"
  },
  {
    "path": "libs/androguard/pentest/modules/webviews/webviews.js",
    "chars": 3281,
    "preview": "// Ripped from https://github.com/Ch0pin/medusa/ and modified to fit Androguard packets\n\ncolorLog('[+] LOADING WEBVIEWS/"
  },
  {
    "path": "libs/androguard/session.py",
    "chars": 16162,
    "preview": "import collections\nimport hashlib\nfrom typing import Iterator, Union\n\nimport dataset\nfrom loguru import logger\n\nfrom and"
  },
  {
    "path": "libs/androguard/ui/__init__.py",
    "chars": 9128,
    "preview": "import os\nimport queue\n\nfrom loguru import logger\nfrom prompt_toolkit import Application\nfrom prompt_toolkit.application"
  },
  {
    "path": "libs/androguard/ui/data_types.py",
    "chars": 2797,
    "preview": "import datetime\n\nfrom androguard.pentest import Message, MessageEvent, MessageSystem\n\n\nclass DisplayTransaction:\n\n    de"
  },
  {
    "path": "libs/androguard/ui/filter.py",
    "chars": 2139,
    "preview": "from collections import UserList\nfrom typing import Optional, TypeVar\n\n\nclass Filter:\n    \"\"\"\n    CLASS Filter\n        B"
  },
  {
    "path": "libs/androguard/ui/selection.py",
    "chars": 5331,
    "preview": "from collections import UserList\r\nfrom dataclasses import dataclass\r\nfrom typing import Iterable, TypeVar\r\n\r\nfrom prompt"
  },
  {
    "path": "libs/androguard/ui/table.py",
    "chars": 24810,
    "preview": "#!/usr/bin/env python3\n\nfrom typing import Type, Union\n\nfrom prompt_toolkit import Application\nfrom prompt_toolkit.cache"
  },
  {
    "path": "libs/androguard/ui/util.py",
    "chars": 205,
    "preview": "def clamp(range_min: int, range_max: int, value: int) -> int:\n    \"\"\"Return value if its is within range_min and range_m"
  },
  {
    "path": "libs/androguard/ui/widget/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "libs/androguard/ui/widget/details.py",
    "chars": 2092,
    "preview": "import json\nfrom typing import Optional\n\nfrom prompt_toolkit.filters import Condition\nfrom prompt_toolkit.formatted_text"
  },
  {
    "path": "libs/androguard/ui/widget/filters.py",
    "chars": 2629,
    "preview": "from prompt_toolkit.key_binding import KeyBindings\nfrom prompt_toolkit.key_binding.bindings.focus import (\n    focus_nex"
  },
  {
    "path": "libs/androguard/ui/widget/frame.py",
    "chars": 4075,
    "preview": "from functools import partial\nfrom typing import Optional\n\nfrom prompt_toolkit.filters import Condition\nfrom prompt_tool"
  },
  {
    "path": "libs/androguard/ui/widget/help.py",
    "chars": 1322,
    "preview": "from prompt_toolkit.layout import AnyContainer, HSplit\nfrom prompt_toolkit.widgets import Box, Frame, Label\n\n\nclass Help"
  },
  {
    "path": "libs/androguard/ui/widget/toolbar.py",
    "chars": 1071,
    "preview": "from typing import Sequence\n\nfrom prompt_toolkit.formatted_text import AnyFormattedText, FormattedText\nfrom prompt_toolk"
  },
  {
    "path": "libs/androguard/ui/widget/transactions.py",
    "chars": 4907,
    "preview": "import csv\nimport io\n\nfrom prompt_toolkit.filters import Condition\nfrom prompt_toolkit.key_binding import KeyBindings\nfr"
  },
  {
    "path": "libs/androguard/util.py",
    "chars": 6974,
    "preview": "import binascii\nimport hashlib\nimport sys\nfrom typing import BinaryIO, Union\n\nfrom asn1crypto import keys, x509\n\n#  Exte"
  },
  {
    "path": "libs/apkInspector/__init__.py",
    "chars": 22,
    "preview": "__version__ = \"1.3.6\"\n"
  },
  {
    "path": "libs/apkInspector/axml.py",
    "chars": 42979,
    "preview": "import io\nimport logging\nimport struct\nimport random\n\nfrom .extract import extract_file_based_on_header_info\nfrom .heade"
  },
  {
    "path": "libs/apkInspector/extract.py",
    "chars": 5525,
    "preview": "import logging\nimport zlib\nimport os\n\n\ndef extract_file_based_on_header_info(apk_file, local_header_info, central_direct"
  },
  {
    "path": "libs/apkInspector/headers.py",
    "chars": 27490,
    "preview": "import io\nimport logging\nimport os\nimport struct\nfrom typing import Dict\n\nfrom .extract import extract_file_based_on_hea"
  },
  {
    "path": "libs/apkInspector/helpers.py",
    "chars": 1717,
    "preview": "import json\n\n\ndef pretty_print_header(header_text, width=50, char='-'):\n    \"\"\"\n    Formatting output used for the CLI\n\n"
  },
  {
    "path": "libs/apkInspector/indicators.py",
    "chars": 9776,
    "preview": "import io\nimport logging\nimport struct\n\nfrom .extract import extract_file_based_on_header_info\nfrom .headers import ZipE"
  },
  {
    "path": "libs/apkInspectorCLI/__init__.py",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "libs/apkInspectorCLI/main.py",
    "chars": 9647,
    "preview": "import argparse\nimport io\nimport os\n\nfrom apkInspector import __version__ as version\nfrom apkInspector.extract import ex"
  },
  {
    "path": "libs/apkinspector-1.3.6.dist-info/METADATA",
    "chars": 6972,
    "preview": "Metadata-Version: 2.4\nName: apkInspector\nVersion: 1.3.6\nSummary: apkInspector is a tool designed to provide detailed ins"
  },
  {
    "path": "libs/apkinspector-1.3.6.dist-info/RECORD",
    "chars": 1066,
    "preview": "apkInspector/__init__.py,sha256=5ZbAQtod5QalTI1C2N07edlxplzG_Q2XvGOSyOok4uA,22\napkInspector/axml.py,sha256=H3lCARrjCG1qX"
  },
  {
    "path": "libs/apkinspector-1.3.6.dist-info/WHEEL",
    "chars": 88,
    "preview": "Wheel-Version: 1.0\nGenerator: poetry-core 2.2.1\nRoot-Is-Purelib: true\nTag: py3-none-any\n"
  },
  {
    "path": "libs/apkinspector-1.3.6.dist-info/entry_points.txt",
    "chars": 58,
    "preview": "[console_scripts]\napkInspector=apkInspectorCLI.main:main\n\n"
  },
  {
    "path": "libs/apkinspector-1.3.6.dist-info/licenses/LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "libs/asn1crypto/__init__.py",
    "chars": 1219,
    "preview": "# coding: utf-8\nfrom __future__ import unicode_literals, division, absolute_import, print_function\n\nfrom .version import"
  },
  {
    "path": "libs/asn1crypto/_errors.py",
    "chars": 1070,
    "preview": "# coding: utf-8\n\n\"\"\"\nExports the following items:\n\n - unwrap()\n - APIException()\n\"\"\"\n\nfrom __future__ import unicode_lit"
  },
  {
    "path": "libs/asn1crypto/_inet.py",
    "chars": 4661,
    "preview": "# coding: utf-8\nfrom __future__ import unicode_literals, division, absolute_import, print_function\n\nimport socket\nimport"
  },
  {
    "path": "libs/asn1crypto/_int.py",
    "chars": 494,
    "preview": "# coding: utf-8\nfrom __future__ import unicode_literals, division, absolute_import, print_function\n\n\ndef fill_width(byte"
  },
  {
    "path": "libs/asn1crypto/_iri.py",
    "chars": 8733,
    "preview": "# coding: utf-8\n\n\"\"\"\nFunctions to convert unicode IRIs into ASCII byte string URIs and back. Exports\nthe following items"
  },
  {
    "path": "libs/asn1crypto/_ordereddict.py",
    "chars": 4533,
    "preview": "# Copyright (c) 2009 Raymond Hettinger\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a cop"
  },
  {
    "path": "libs/asn1crypto/_teletex_codec.py",
    "chars": 5053,
    "preview": "# coding: utf-8\n\n\"\"\"\nImplementation of the teletex T.61 codec. Exports the following items:\n\n - register()\n\"\"\"\n\nfrom __f"
  },
  {
    "path": "libs/asn1crypto/_types.py",
    "chars": 939,
    "preview": "# coding: utf-8\nfrom __future__ import unicode_literals, division, absolute_import, print_function\n\nimport inspect\nimpor"
  },
  {
    "path": "libs/asn1crypto/algos.py",
    "chars": 35867,
    "preview": "# coding: utf-8\n\n\"\"\"\nASN.1 type classes for various algorithms using in various aspects of public\nkey cryptography. Expo"
  },
  {
    "path": "libs/asn1crypto/cms.py",
    "chars": 27776,
    "preview": "# coding: utf-8\n\n\"\"\"\nASN.1 type classes for cryptographic message syntax (CMS). Structures are also\ncompatible with PKCS"
  },
  {
    "path": "libs/asn1crypto/core.py",
    "chars": 170709,
    "preview": "# coding: utf-8\n\n\"\"\"\nASN.1 type classes for universal types. Exports the following items:\n\n - load()\n - Any()\n - Asn1Val"
  },
  {
    "path": "libs/asn1crypto/crl.py",
    "chars": 16104,
    "preview": "# coding: utf-8\n\n\"\"\"\nASN.1 type classes for certificate revocation lists (CRL). Exports the\nfollowing items:\n\n - Certifi"
  },
  {
    "path": "libs/asn1crypto/csr.py",
    "chars": 3542,
    "preview": "# coding: utf-8\n\n\"\"\"\nASN.1 type classes for certificate signing requests (CSR). Exports the\nfollowing items:\n\n - Certifi"
  },
  {
    "path": "libs/asn1crypto/keys.py",
    "chars": 37863,
    "preview": "# coding: utf-8\n\n\"\"\"\nASN.1 type classes for public and private keys. Exports the following items:\n\n - DSAPrivateKey()\n -"
  },
  {
    "path": "libs/asn1crypto/ocsp.py",
    "chars": 19024,
    "preview": "# coding: utf-8\n\n\"\"\"\nASN.1 type classes for the online certificate status protocol (OCSP). Exports\nthe following items:\n"
  },
  {
    "path": "libs/asn1crypto/parser.py",
    "chars": 9171,
    "preview": "# coding: utf-8\n\n\"\"\"\nFunctions for parsing and dumping using the ASN.1 DER encoding. Exports the\nfollowing items:\n\n - em"
  },
  {
    "path": "libs/asn1crypto/pdf.py",
    "chars": 2250,
    "preview": "# coding: utf-8\n\n\"\"\"\nASN.1 type classes for PDF signature structures. Adds extra oid mapping and\nvalue parsing to asn1cr"
  },
  {
    "path": "libs/asn1crypto/pem.py",
    "chars": 6145,
    "preview": "# coding: utf-8\n\n\"\"\"\nEncoding DER to PEM and decoding PEM to DER. Exports the following items:\n\n - armor()\n - detect()\n "
  },
  {
    "path": "libs/asn1crypto/pkcs12.py",
    "chars": 4566,
    "preview": "# coding: utf-8\n\n\"\"\"\nASN.1 type classes for PKCS#12 files. Exports the following items:\n\n - CertBag()\n - CrlBag()\n - Pfx"
  },
  {
    "path": "libs/asn1crypto/tsp.py",
    "chars": 7825,
    "preview": "# coding: utf-8\n\n\"\"\"\nASN.1 type classes for the time stamp protocol (TSP). Exports the following\nitems:\n\n - TimeStampReq"
  },
  {
    "path": "libs/asn1crypto/util.py",
    "chars": 21873,
    "preview": "# coding: utf-8\n\n\"\"\"\nMiscellaneous data helpers, including functions for converting integers to and\nfrom bytes and UTC t"
  },
  {
    "path": "libs/asn1crypto/version.py",
    "chars": 152,
    "preview": "# coding: utf-8\nfrom __future__ import unicode_literals, division, absolute_import, print_function\n\n\n__version__ = '1.5."
  },
  {
    "path": "libs/asn1crypto/x509.py",
    "chars": 93778,
    "preview": "# coding: utf-8\n\n\"\"\"\nASN.1 type classes for X.509 certificates. Exports the following items:\n\n - Attributes()\n - Certifi"
  },
  {
    "path": "libs/asn1crypto-1.5.1.dist-info/LICENSE",
    "chars": 1075,
    "preview": "Copyright (c) 2015-2022 Will Bond <will@wbond.net>\n\nPermission is hereby granted, free of charge, to any person obtainin"
  },
  {
    "path": "libs/asn1crypto-1.5.1.dist-info/METADATA",
    "chars": 13184,
    "preview": "Metadata-Version: 2.1\nName: asn1crypto\nVersion: 1.5.1\nSummary: Fast ASN.1 parser and serializer with definitions for pri"
  },
  {
    "path": "libs/asn1crypto-1.5.1.dist-info/RECORD",
    "chars": 2164,
    "preview": "asn1crypto/__init__.py,sha256=a-8VLJazcxfecOBlxWH1IX4Crm6NvR-Lhko9GTpvnP0,1219\nasn1crypto/_errors.py,sha256=v1vyVWdO49tL"
  },
  {
    "path": "libs/asn1crypto-1.5.1.dist-info/WHEEL",
    "chars": 110,
    "preview": "Wheel-Version: 1.0\nGenerator: bdist_wheel (0.37.1)\nRoot-Is-Purelib: true\nTag: py2-none-any\nTag: py3-none-any\n\n"
  },
  {
    "path": "libs/asn1crypto-1.5.1.dist-info/top_level.txt",
    "chars": 11,
    "preview": "asn1crypto\n"
  },
  {
    "path": "libs/click/__init__.py",
    "chars": 3188,
    "preview": "\"\"\"\nClick is a simple Python module inspired by the stdlib optparse to make\nwriting command line scripts fun. Unlike oth"
  },
  {
    "path": "libs/click/_compat.py",
    "chars": 18730,
    "preview": "import codecs\nimport io\nimport os\nimport re\nimport sys\nimport typing as t\nfrom weakref import WeakKeyDictionary\n\nCYGWIN "
  },
  {
    "path": "libs/click/_termui_impl.py",
    "chars": 24783,
    "preview": "\"\"\"\nThis module contains implementations for the termui module. To keep the\nimport time of Click down, some infrequently"
  },
  {
    "path": "libs/click/_textwrap.py",
    "chars": 1353,
    "preview": "import textwrap\nimport typing as t\nfrom contextlib import contextmanager\n\n\nclass TextWrapper(textwrap.TextWrapper):\n    "
  },
  {
    "path": "libs/click/_winconsole.py",
    "chars": 7859,
    "preview": "# This module is based on the excellent work by Adam Bartoš who\n# provided a lot of what went into the implementation he"
  },
  {
    "path": "libs/click/core.py",
    "chars": 114748,
    "preview": "import enum\nimport errno\nimport inspect\nimport os\nimport sys\nimport typing as t\nfrom collections import abc\nfrom context"
  },
  {
    "path": "libs/click/decorators.py",
    "chars": 18925,
    "preview": "import inspect\nimport types\nimport typing as t\nfrom functools import update_wrapper\nfrom gettext import gettext as _\n\nfr"
  },
  {
    "path": "libs/click/exceptions.py",
    "chars": 9600,
    "preview": "import typing as t\nfrom gettext import gettext as _\nfrom gettext import ngettext\n\nfrom ._compat import get_text_stderr\nf"
  },
  {
    "path": "libs/click/formatting.py",
    "chars": 9706,
    "preview": "import typing as t\nfrom contextlib import contextmanager\nfrom gettext import gettext as _\n\nfrom ._compat import term_len"
  },
  {
    "path": "libs/click/globals.py",
    "chars": 1954,
    "preview": "import typing as t\nfrom threading import local\n\nif t.TYPE_CHECKING:\n    import typing_extensions as te\n\n    from .core i"
  },
  {
    "path": "libs/click/parser.py",
    "chars": 19067,
    "preview": "\"\"\"\nThis module started out as largely a copy paste from the stdlib's\noptparse module with the features removed that we "
  },
  {
    "path": "libs/click/py.typed",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "libs/click/shell_completion.py",
    "chars": 18636,
    "preview": "import os\nimport re\nimport typing as t\nfrom gettext import gettext as _\n\nfrom .core import Argument\nfrom .core import Ba"
  }
]

// ... and 58 more files (download for full content)

About this extraction

This page contains the full source code of the Andy10101/ApkDetecter GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 258 files (8.6 MB), approximately 2.3M tokens, and a symbol index with 4750 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!