#!/usr/bin/python3 import os import xml.etree.ElementTree as ET def get_main_activity() -> str: root = ET.parse("app/AndroidManifest.xml").getroot() for activity in root.iter("activity"): for action in activity.iter("action"): if action.attrib.get("{http://schemas.android.com/apk/res/android}name") == "android.intent.action.MAIN": return str(activity.attrib.get("{http://schemas.android.com/apk/res/android}name")) raise Exception("No main activity found") def find_main_activity(classname: str) -> str: classname = classname.replace(".", "/") + ".smali" if classname.startswith("/"): raise Exception("Invalid classname") for path, _, files in os.walk("."): for file in files: result = os.path.join(path,file) if result.endswith(classname): return result raise Exception("No file with classname found") def patch_class(path: str) -> None: with open(path, "r") as file: lines = file.readlines() patched = False with open(path, "w") as file: matched = False for line in lines: if ".method public constructor ()V" in line: matched = True if matched and "return-void" in line: file.write("const-string v0, \"frida-gadget\"\n") file.write("invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V\n") matched = False patched = True file.write(line) if not patched: raise Exception("Failed to patch class") main_activity = get_main_activity() path = find_main_activity(main_activity) patch_class(path)