42 lines
1.1 KiB
Python
42 lines
1.1 KiB
Python
import logging
|
|
|
|
FORMAT = "[%(levelname)s] %(name)s %(filename)s:%(lineno)d: %(message)s"
|
|
logging.basicConfig(format=FORMAT)
|
|
logging.getLogger().setLevel(logging.DEBUG)
|
|
|
|
import json
|
|
import zipfile as z
|
|
import re
|
|
from pathlib import Path
|
|
import argparse
|
|
|
|
from androscalpel import Apk, IdType, IdMethodType, ins, DexString, IdMethod, Code, utils # type: ignore
|
|
|
|
RE_CHECK_DEXFILE = re.compile(r"classes\d*.dex")
|
|
|
|
|
|
def is_dexfile(filename: str) -> bool:
|
|
return bool(RE_CHECK_DEXFILE.fullmatch(filename))
|
|
|
|
|
|
def load_apk(path_apk: Path) -> Apk:
|
|
print(f"[+] Load bytecode ")
|
|
apk = Apk()
|
|
with z.ZipFile(path_apk) as zipf:
|
|
for file in filter(is_dexfile, zipf.namelist()):
|
|
print(f"[-] {file}")
|
|
with zipf.open(file, "r") as dex_f:
|
|
dex = dex_f.read()
|
|
apk.add_dex_file(dex)
|
|
return apk
|
|
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser("Dump the name of classes defined in an apk")
|
|
parser.add_argument("apk", type=Path)
|
|
args = parser.parse_args()
|
|
apk = load_apk(args.apk)
|
|
cls = list(map(str, apk.classes.keys()))
|
|
cls.sort()
|
|
for cl in cls:
|
|
print(str(cl))
|