add hidden

This commit is contained in:
Jean-Marie Mineau 2024-11-12 17:17:48 +01:00
parent 6c1fb309bd
commit d0bf33375b
3 changed files with 81 additions and 12 deletions

View file

@ -56,6 +56,16 @@ def main():
help="The directory where to output results, when no set results are printed to stdout", help="The directory where to output results, when no set results are printed to stdout",
type=Path, type=Path,
) )
parser.add_argument(
"--output-dir-sdk34-classes",
help="SDK 34 redefinition",
type=Path,
)
parser.add_argument(
"--output-dir-hidden-api",
help="Reference to hidden api",
type=Path,
)
parser.add_argument( parser.add_argument(
"--json", "--json",
help="Print the results in json format with additionnal data", help="Print the results in json format with additionnal data",
@ -95,6 +105,18 @@ def main():
raise RuntimeError("--output-dir must be a directory") raise RuntimeError("--output-dir must be a directory")
args.output_dir.mkdir(parents=True, exist_ok=True) args.output_dir.mkdir(parents=True, exist_ok=True)
if args.output_dir_sdk34_classes:
if not args.output_dir_sdk34_classes.exists():
args.output_dir_sdk34_classes.mkdir(parents=True)
if not args.output_dir_sdk34_classes.is_dir():
raise RuntimeError("--output-dir-sdk34-classes must be a directory")
if args.output_dir_hidden_api:
if not args.output_dir_hidden_api.exists():
args.output_dir_hidden_api.mkdir(parents=True)
if not args.output_dir_hidden_api.is_dir():
raise RuntimeError("--output-dir-hidden-api must be a directory")
# Case 1: apk from file # Case 1: apk from file
apks = [] apks = []
if args.apk: if args.apk:
@ -121,7 +143,13 @@ def main():
json_out = json_data[sha256] json_out = json_data[sha256]
else: else:
json_out = None json_out = None
entry = analyze(apk, sha256, json_out=json_out) entry = analyze(
apk,
sha256,
json_out=json_out,
sdk34_dir=args.output_dir_sdk34_classes,
hidden_dir=args.output_dir_hidden_api,
)
except Exception as e: except Exception as e:
log = f"[{datetime.today().strftime('%Y-%m-%d %H:%M:%S')}] Failed to analyzed {sha256}: {e}, abort" log = f"[{datetime.today().strftime('%Y-%m-%d %H:%M:%S')}] Failed to analyzed {sha256}: {e}, abort"
if logfile: if logfile:
@ -186,7 +214,13 @@ def main():
json_out = json_data[sha256] json_out = json_data[sha256]
else: else:
json_out = None json_out = None
entry = analyze(apk, sha256, json_out=json_out) entry = analyze(
apk,
sha256,
json_out=json_out,
sdk34_dir=args.output_dir_sdk34_classes,
hidden_dir=args.output_dir_hidden_api,
)
except Exception as e: except Exception as e:
log = f"[{datetime.today().strftime('%Y-%m-%d %H:%M:%S')}] Failed to analyzed {sha256}: {e}, abort" log = f"[{datetime.today().strftime('%Y-%m-%d %H:%M:%S')}] Failed to analyzed {sha256}: {e}, abort"
if logfile: if logfile:
@ -307,13 +341,14 @@ def check_smali():
if not api_key: if not api_key:
api_key = getpass(prompt="Androzoo API key: ").strip() api_key = getpass(prompt="Androzoo API key: ").strip()
with sqlite3.connect(args.db) as conn: # with sqlite3.connect(args.db) as conn:
apks = list( # apks = list(
map( # map(
lambda t: t[0], # lambda t: t[0],
conn.execute("SELECT sha256 FROM data WHERE nb_duplicate_classes >= 1"), # conn.execute("SELECT sha256 FROM data WHERE nb_duplicate_classes >= 1"),
) # )
) # )
apks = ["E0467A3E79C344216EEEC9691E43C49DCE3230EB312979F7DC37AAC829077249"]
data = {} data = {}
for sha256 in apks: for sha256 in apks:
with tempfile.TemporaryDirectory() as tmpdirname: with tempfile.TemporaryDirectory() as tmpdirname:
@ -356,6 +391,7 @@ def check_smali():
smali = None smali = None
for cdir in smalli_dirs: for cdir in smalli_dirs:
if (cdir / cl_f).exists(): if (cdir / cl_f).exists():
print((cdir / cl_f))
with (cdir / cl_f).open() as file: with (cdir / cl_f).open() as file:
smali_new = file.read() smali_new = file.read()
if smali is None: if smali is None:

View file

@ -3,6 +3,7 @@ import io
from dataclasses import dataclass, asdict from dataclasses import dataclass, asdict
from enum import IntEnum from enum import IntEnum
from pathlib import Path
import androguard.core.dex # type: ignore import androguard.core.dex # type: ignore
from androguard.core.dex import DEX # type: ignore from androguard.core.dex import DEX # type: ignore
@ -78,7 +79,11 @@ class PlatformClassesData:
def scan_classes( def scan_classes(
apk: zipfile.ZipFile, file_names: set[str], json_out: dict | None = None apk: zipfile.ZipFile,
file_names: set[str],
json_out: dict | None = None,
sdk34_classes_file: Path | None = None,
hidden_file: Path | None = None,
) -> PlatformClassesData: ) -> PlatformClassesData:
all_classes = set() all_classes = set()
duplicated_classes = set() duplicated_classes = set()
@ -175,10 +180,22 @@ def scan_classes(
data["sdk_34_classes"] = list(sdk_34_classes) data["sdk_34_classes"] = list(sdk_34_classes)
data["platform_non_sdk_34_classes"] = list(platform_non_sdk_34_classes) data["platform_non_sdk_34_classes"] = list(platform_non_sdk_34_classes)
data["ref_platform_non_sdk_34_classes"] = list(ref_platform_non_sdk_34_classes) data["ref_platform_non_sdk_34_classes"] = list(ref_platform_non_sdk_34_classes)
if sdk34_classes_file is not None:
with sdk34_classes_file.open("w") as file:
file.writelines(sorted(sdk_34_classes))
if hidden_file is not None:
with hidden_file.open("w") as file:
file.writelines(sorted(ref_platform_non_sdk_34_classes))
return entry return entry
def analyze(apk: zipfile.ZipFile, sha256: str, json_out: dict | None = None) -> ApkData: def analyze(
apk: zipfile.ZipFile,
sha256: str,
json_out: dict | None = None,
sdk34_dir: Path | None = None,
hidden_dir: Path | None = None,
) -> ApkData:
classes_dex = set( classes_dex = set(
filter( filter(
lambda name: name.startswith("classes") and name.endswith(".dex"), lambda name: name.startswith("classes") and name.endswith(".dex"),
@ -226,7 +243,21 @@ def analyze(apk: zipfile.ZipFile, sha256: str, json_out: dict | None = None) ->
has_non_consecutive_classes_dex = True has_non_consecutive_classes_dex = True
break break
platform_classes_data = scan_classes(apk, classes_dex, json_out=json_out) if sdk34_dir:
sdk34_classes_file = sdk34_dir / sha256
else:
sdk34_classes_file = None
if hidden_dir:
hidden_file = hidden_dir / sha256
else:
hidden_file = None
platform_classes_data = scan_classes(
apk,
classes_dex,
json_out=json_out,
sdk34_classes_file=sdk34_classes_file,
hidden_file=hidden_file,
)
entry = ApkData( entry = ApkData(
sha256=sha256, sha256=sha256,

View file

@ -17,6 +17,8 @@ D8_CLASSES = {
"Ldalvik/annotation/EnclosingClass;", "Ldalvik/annotation/EnclosingClass;",
"Ldalvik/annotation/Throws;", "Ldalvik/annotation/Throws;",
"Ldalvik/annotation/MemberClasses;", "Ldalvik/annotation/MemberClasses;",
"Ldalvik/annotation/AnnotationDefault;",
"Ldalvik/annotation/MethodParameters;",
} }
with (local_dir / "android-32" / "classes.txt").open() as file: with (local_dir / "android-32" / "classes.txt").open() as file: