mirror of
https://github.com/pentoo/pentoo-overlay
synced 2025-12-06 08:25:01 +01:00
130 lines
3.6 KiB
Python
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")
|