pentoo-overlay/dev-util/lief/files/lief_apk_injection.py
2024-01-25 13:05:21 +08:00

130 lines
3.6 KiB
Python

#!/usr/bin/env python
import lief
import zipfile
import shutil
import subprocess
import tempfile
import os
import pathlib
import requests
import re
from xtract import xtract
def inject(libdir, arch, selected_library):
# Get latests frida-gadgets
latest = requests.get(url = "https://github.com/frida/frida/releases/latest")
# Get stable frida-gadgets
#latest = requests.get(url = "https://github.com/frida/frida/releases/tag/12.5.4")
response = latest.content.decode('utf-8')
latestArch = re.findall(r'\/frida\/frida\/releases\/download\/.*\/frida-gadget.*\-android\-.*xz',response)
url_gadget = ""
for i in latestArch:
if gadget_architecture[arch] in i:
url_gadget = i
print("[+] Downloading and extracting frida gadget for: " + arch )
url = 'https://github.com'+str(url_gadget)
r = requests.get(url)
filename = "frida-gadget"+str(arch)+".so.xz"
with open(libdir / arch / filename , 'wb') as f:
f.write(r.content)
xtract(str(libdir / arch / filename))
gadget_name = "libgdgt.so"
os.rename(libdir / arch / filename[:-3], libdir / arch / gadget_name)
os.remove (libdir / arch / filename)
print(f"[+] Injecting {gadget_name} into {arch}/{selected_library} \n")
libcheck_path = libdir / arch / selected_library
libcheck = lief.parse(libcheck_path.as_posix())
libcheck.add_library(gadget_name)
libcheck.write(libcheck_path.as_posix())
# Get file
apk = input("[+] Enter the path of your APK: ")
try:
f = open(apk,'r+')
except:
print("[+] I did not find the file at, "+str(apk))
exit()
f = open(apk,'r+')
#stuff you do with the file goes here
f.close()
# Unzip
workingdir = tempfile.mkdtemp(suffix='_lief_frida')
print(f"[+] Unzip the {apk} in {workingdir}")
zip_ref = zipfile.ZipFile(apk, 'r')
zip_ref.extractall(workingdir)
zip_ref.close()
libdir = pathlib.Path(workingdir) / "lib"
gadget_architecture = {
"arm64" : "android-arm64.so",
"arm64-v8a" : "android-arm64.so",
"armeabi" : "android-arm.so",
"armeabi-v7a" : "android-arm.so",
"x86" : "android-x86.so",
"x86_64" : "android-x86_64.so"
}
print("[+] Select the architecture of your system: ")
print("If you don't know run: adb shell getprop ro.product.cpu.abi\n")
architectures = os.listdir(libdir)
counter_lib = 0
final_architectures = []
for i in architectures:
if i in gadget_architecture:
counter_lib+=1
final_architectures.append(i)
print(f"{counter_lib}) {i}")
print(f"{(counter_lib+1)}) I don't know. Inject frida-gadget for all architectures (slower)\n")
selected_arch = input("> ")
print("\n[+] In with library do you want to inject?: \n ")
if int(selected_arch) == (counter_lib+1):
libraries = os.listdir(libdir/final_architectures[0])
else:
libraries = os.listdir(libdir/final_architectures[int(selected_arch)-1])
counter = 0
for lib in libraries:
counter += 1
print(str(counter) + ") "+lib)
print("\n[+] Enter the number of the desired library: ")
library = input("> ")
selected_library = libraries[int(library)-1]
if int(selected_arch) == (counter_lib+1):
for arch in final_architectures:
inject(libdir, arch, libraries[int(library)-1])
else:
inject(libdir,final_architectures[int(selected_arch)-1],libraries[int(library)-1])
print ("[*] Removing old signature ")
# Remove old signature
shutil.rmtree(os.path.join(workingdir, "META-INF"))
# Zip
print("[+] APK Building...")
apk_name = "my_app.apk"
shutil.make_archive("new", 'zip', workingdir)
shutil.move("new.zip", apk_name)
print(f"[+] SUCCESS!! Your new apk is : {apk_name}. Now you should sign it.\n")