add hidden
This commit is contained in:
parent
6c1fb309bd
commit
d0bf33375b
3 changed files with 81 additions and 12 deletions
|
|
@ -56,6 +56,16 @@ def main():
|
|||
help="The directory where to output results, when no set results are printed to stdout",
|
||||
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(
|
||||
"--json",
|
||||
help="Print the results in json format with additionnal data",
|
||||
|
|
@ -95,6 +105,18 @@ def main():
|
|||
raise RuntimeError("--output-dir must be a directory")
|
||||
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
|
||||
apks = []
|
||||
if args.apk:
|
||||
|
|
@ -121,7 +143,13 @@ def main():
|
|||
json_out = json_data[sha256]
|
||||
else:
|
||||
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:
|
||||
log = f"[{datetime.today().strftime('%Y-%m-%d %H:%M:%S')}] Failed to analyzed {sha256}: {e}, abort"
|
||||
if logfile:
|
||||
|
|
@ -186,7 +214,13 @@ def main():
|
|||
json_out = json_data[sha256]
|
||||
else:
|
||||
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:
|
||||
log = f"[{datetime.today().strftime('%Y-%m-%d %H:%M:%S')}] Failed to analyzed {sha256}: {e}, abort"
|
||||
if logfile:
|
||||
|
|
@ -307,13 +341,14 @@ def check_smali():
|
|||
if not api_key:
|
||||
api_key = getpass(prompt="Androzoo API key: ").strip()
|
||||
|
||||
with sqlite3.connect(args.db) as conn:
|
||||
apks = list(
|
||||
map(
|
||||
lambda t: t[0],
|
||||
conn.execute("SELECT sha256 FROM data WHERE nb_duplicate_classes >= 1"),
|
||||
)
|
||||
)
|
||||
# with sqlite3.connect(args.db) as conn:
|
||||
# apks = list(
|
||||
# map(
|
||||
# lambda t: t[0],
|
||||
# conn.execute("SELECT sha256 FROM data WHERE nb_duplicate_classes >= 1"),
|
||||
# )
|
||||
# )
|
||||
apks = ["E0467A3E79C344216EEEC9691E43C49DCE3230EB312979F7DC37AAC829077249"]
|
||||
data = {}
|
||||
for sha256 in apks:
|
||||
with tempfile.TemporaryDirectory() as tmpdirname:
|
||||
|
|
@ -356,6 +391,7 @@ def check_smali():
|
|||
smali = None
|
||||
for cdir in smalli_dirs:
|
||||
if (cdir / cl_f).exists():
|
||||
print((cdir / cl_f))
|
||||
with (cdir / cl_f).open() as file:
|
||||
smali_new = file.read()
|
||||
if smali is None:
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import io
|
|||
|
||||
from dataclasses import dataclass, asdict
|
||||
from enum import IntEnum
|
||||
from pathlib import Path
|
||||
|
||||
import androguard.core.dex # type: ignore
|
||||
from androguard.core.dex import DEX # type: ignore
|
||||
|
|
@ -78,7 +79,11 @@ class PlatformClassesData:
|
|||
|
||||
|
||||
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:
|
||||
all_classes = set()
|
||||
duplicated_classes = set()
|
||||
|
|
@ -175,10 +180,22 @@ def scan_classes(
|
|||
data["sdk_34_classes"] = list(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)
|
||||
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
|
||||
|
||||
|
||||
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(
|
||||
filter(
|
||||
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
|
||||
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(
|
||||
sha256=sha256,
|
||||
|
|
|
|||
|
|
@ -17,6 +17,8 @@ D8_CLASSES = {
|
|||
"Ldalvik/annotation/EnclosingClass;",
|
||||
"Ldalvik/annotation/Throws;",
|
||||
"Ldalvik/annotation/MemberClasses;",
|
||||
"Ldalvik/annotation/AnnotationDefault;",
|
||||
"Ldalvik/annotation/MethodParameters;",
|
||||
}
|
||||
|
||||
with (local_dir / "android-32" / "classes.txt").open() as file:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue