-
-
Save goofwear/564b8f14bd7167814497118a070d69af to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
import gzip | |
import os | |
import shutil | |
import subprocess | |
import tarfile | |
import zipfile | |
from defusedxml import ElementTree | |
import yaml | |
""" | |
READ THIS FIRST: | |
*Run this on Linux, first of all | |
*Python 3.5+ is needed | |
*It will ask you for your sudo password, if you have a password set for it | |
*Have simg2img, abootimg, cpio, lz4 and Java (8 or 9) in your path (apt install simg2img abootimg cpio liblz4-tool on *buntu) | |
*Have pyyaml and defusedxml installed via pip (pip3/pip install pyyaml defusedxml) | |
*Have the apktool jar as ~/apktool_2.3.3.jar (change in script as needed) | |
*Run this script from same folder as the OS dump zip (blablabla.zip) | |
*Make sure only the download zip from SamFirm/Updato/whatever is in the folder | |
*Comment out the main#() functions in the bottom block if necessary | |
Currently tested on: | |
*S9 Oreo (USA, Canada, International, Korea) | |
*S8 Oreo (International) | |
*S8 Nougat (USA, Canada, International, Korea, China, Japan) | |
*S7 (USA, Korea, Japan) | |
*S6 (India) | |
*Note 8 Oreo (Canada) | |
*Note 8 Nougat (USA, Canada, International, Korea, China, Japan) | |
*Note FE (Korea) | |
*A8 2018 (International) | |
*A7 2017 (International, Korea) | |
*A5 2017 (Canada, International, Korea) | |
*A3 2017 (International) | |
*A5 2016 (International) | |
*C7 (China) | |
*J7 Prime (International) | |
*Tab S3 (WiFi, LTE) | |
""" | |
def md5out(indir): | |
files = [x for x in os.listdir(indir) if x.endswith(".tar.md5")] | |
fnames = [x.split("_")[0].replace("HOME", "HOME_CSC") for x in files] | |
fdict = {y:z for y, z in zip(fnames, files)} | |
for folder, name in fdict.items(): | |
print("DECOMPRESSING: {0}".format(name)) | |
with tarfile.open(name) as tarf: | |
tarf.extractall(os.path.join(indir, folder)) | |
def lz4out(indir): | |
dirs = [x for x in os.listdir(indir) if os.path.isdir(x)] | |
for dirx in dirs: | |
files = [os.path.join(indir, dirx, x) for x in os.listdir(dirx) if x.endswith(".lz4")] | |
for lzfile in files: | |
print("DECOMPRESSING: {0}".format(lzfile.replace(indir, ""))) | |
subprocess.run(["lz4", "-d", lzfile, lzfile.replace(".lz4", "")]) | |
def simg2img(indir, excepts=None): | |
if excepts is None: | |
excepts = ["dummy.nevergonnahappen"] | |
exts = [os.path.join(indir, x) for x in os.listdir(indir) if x.endswith(".img.ext4") and x not in excepts] | |
if not exts: | |
exts = [os.path.join(indir, x) for x in os.listdir(indir) if x.endswith(".img") and ".raw" not in x and x not in excepts] | |
for ext in exts: | |
print("DECOMPRESSING: {0}".format(os.path.basename(ext))) | |
subprocess.run(["simg2img", ext, ext.replace(".ext4", "").replace(".img", ".raw.img")]) | |
def indiv_abootimg(imgfile): | |
imgdir = os.path.dirname(imgfile) | |
imgname = os.path.basename(imgfile).split(".")[0] | |
outdir = os.path.join(imgdir, "output", imgname) | |
here = os.getcwd() | |
os.chdir(outdir) | |
with open(os.devnull, "wb") as dnull: | |
subprocess.run(["abootimg", "-x", imgfile], stdout=dnull, stderr=subprocess.STDOUT) | |
for image in ["initrd.img", "stage2.img"]: | |
imagepath = os.path.join(outdir, image) | |
if not os.path.exists(imagepath): | |
pass | |
else: | |
imagedir = os.path.join(outdir, image.split(".")[0]) | |
if not os.path.exists(imagedir): | |
os.makedirs(imagedir) | |
os.chdir(imagedir) | |
try: | |
gzdata = gunzip(imagepath) | |
except OSError: | |
continue | |
else: | |
with open(os.devnull, "wb") as dnull: | |
subprocess.run(["cpio", "-id"], input=gzdata, stdout=dnull, stderr=subprocess.STDOUT) | |
os.chdir(here) | |
def gunzip(gzfile): | |
with gzip.open(gzfile) as gunfile: | |
data = gunfile.read() | |
return data | |
def boot_recovery_extract(indir): | |
prep_output_dirs(indir, ["boot", "recovery"]) | |
for img in ["boot.img", "recovery.img"]: | |
indiv_abootimg(os.path.join(indir, img)) | |
def prep_output_dirs(indir, dirlist): | |
for dir in dirlist: | |
if not os.path.exists(dir): | |
os.makedirs(os.path.join(indir, "output", dir)) | |
def prep_dirs(indir): | |
loopdir = os.path.join(indir, "loop") | |
outdir = os.path.join(indir, "output") | |
for dir in (loopdir, outdir): | |
if not os.path.exists(dir): | |
os.makedirs(dir) | |
def remove_loop(indir): | |
os.rmdir(os.path.join(indir, "loop")) | |
def remove_empty_dirs(indir): | |
for root, dirs, files in os.walk(indir): | |
if not dirs and not files: | |
os.removedirs(root) | |
def indiv_imgextract(imgfile, fstype): | |
imgdir = os.path.dirname(imgfile) | |
imgname = os.path.basename(imgfile).split(".")[0] | |
subprocess.run(["sudo", "mount", "-t", fstype, "-o", "loop", os.path.join(imgdir, imgfile), os.path.join(imgdir, "loop")]) | |
with open(os.devnull, "wb") as dnull: | |
subprocess.run(["sudo", "cp", "-r", os.path.join(imgdir, "loop"), os.path.join(imgdir, "output")], stdout=dnull, stderr=subprocess.STDOUT) | |
subprocess.run(["sudo", "mv", os.path.join(imgdir, "output", "loop"), os.path.join(imgdir, "output", imgname)]) | |
subprocess.run(["sudo", "umount", os.path.join(imgdir, "loop")]) | |
def imgextract(indir, excepts=None): | |
images = [x for x in os.listdir(indir) if x.endswith(".raw.img")] | |
if excepts is not None: | |
images = [x for x in images if x not in excepts and ".raw" in x] | |
for img in images: | |
print("EXTRACTING IMAGE: {0}".format(img)) | |
indiv_imgextract(os.path.join(indir, img), "ext4") | |
def csc_zip_extract(indir): | |
zipdir = os.path.join(indir, "output", "cache", "recovery") | |
try: | |
zipf = [x for x in os.listdir(zipdir) if x.endswith(".zip")][0] | |
except IndexError: | |
pass | |
else: | |
print("EXTRACTING: {0}".format(zipf)) | |
with zipfile.ZipFile(os.path.join(zipdir, zipf)) as zipx: | |
try: | |
zipx.extractall(os.path.join(zipdir, os.path.basename(zipf).split(".")[0])) | |
except PermissionError: | |
pass | |
def non_hlos_extract(indir): | |
print("EXTRACTING: NON-HLOS.bin") | |
indiv_imgextract(os.path.join(indir, "NON-HLOS.bin"), "vfat") | |
def tar_param_extract(indir): | |
files = ["param.bin", "up_param.bin"] | |
for filex in files: | |
if os.path.exists(os.path.join(indir, filex)): | |
print("EXTRACTING: {0}".format(filex)) | |
with tarfile.open(os.path.join(indir, filex)) as tarf: | |
tarf.extractall(os.path.join(indir, "output", filex.replace(".bin", ""))) | |
def fota_extract(indir): | |
zipdir = os.path.join(indir, "meta-data") | |
zipf = os.path.join(zipdir, "fota.zip") | |
print("EXTRACTING: fota.zip") | |
with zipfile.ZipFile(zipf) as zipx: | |
zipx.extractall(zipf.replace(".zip", ""), pwd=b"fotatest1234") | |
def apktool(apkdir, basedir, apktoolpath=None, framedir=None, carrier_s8b=False): | |
if apktoolpath is None: | |
apktoolversion = "2.3.3" | |
apktoolpath = os.path.join(os.path.expanduser("~"), "apktool_{0}.jar".format(apktoolversion)) | |
apkname = "{0}.apk".format(apkdir.split(os.sep)[-1]) | |
if carrier_s8b: | |
apkname = apkname.replace(".apk", "", 1) | |
apkdir = os.path.dirname(apkdir).replace(".apk", "", 1) | |
if framedir is None: | |
framedir = os.path.join(basedir, "system", "framework", "samsung-framework-res") | |
framedir2 = os.path.basename(framedir) | |
framedir3 = os.path.join(framedir2, "arm64") | |
with open(os.devnull, "wb") as dnull: | |
subprocess.run(["java", "-jar", apktoolpath, "d", os.path.join(apkdir, apkname), "-s", "-f", "-p", framedir, "-p", framedir2, "-p", framedir3, "-o", os.path.join(apkdir, apkname).replace(".apk", "")], stdout=dnull, stderr=subprocess.STDOUT) | |
#subprocess.run(["java", "-jar", apktoolpath, "d", os.path.join(apkdir, apkname), "-s", "-f", "-p", framedir, "-p", framedir2, "-p", framedir3, "-o", os.path.join(apkdir, apkname).replace(".apk", "")]) | |
def get_yml_info(yamlfile): | |
with open(yamlfile, "r") as afile: | |
skiptag = next(afile) | |
ydata = yaml.load(afile.read()) | |
sdkinfo = ydata["sdkInfo"] | |
if sdkinfo is None: | |
sdkinfo = {"minSdkVersion": "unknown"} | |
elif "minSdkVersion" not in sdkinfo.keys(): | |
sdkinfo = {"minSdkVersion": "unknown"} | |
return sdkinfo, ydata["versionInfo"] | |
def get_xml_info(xmlfile): | |
tree = ElementTree.parse(xmlfile) | |
root = tree.getroot() | |
return root.attrib["package"] | |
def is_odexed(apkdir): | |
status = "deodexed" if "classes.dex" in os.listdir(apkdir) else "odexed" | |
return status | |
def get_apk_filename(apkdir, carrier_s8b=False): | |
if carrier_s8b: | |
apkdir = os.path.dirname(apkdir).replace(".apk", "", 1) | |
sdkinfo, versioninfo = get_yml_info(os.path.join(apkdir, "apktool.yml")) | |
packname = get_xml_info(os.path.join(apkdir, "AndroidManifest.xml")) | |
status = is_odexed(apkdir) | |
filename = "{0}_{1}-{2}_minAPI{3}_{4}.apk".format(packname, versioninfo["versionName"], versioninfo["versionCode"], sdkinfo["minSdkVersion"], status) | |
return filename | |
def indiv_apkextract(basedir, outdir, apkdir, apktoolpath=None, framedir=None, carrier_s8a=False, carrier_s8b=False, carrier_n8a=False, carrier_n8b=False, carrier_s9a=False): | |
apktool(apkdir, basedir, apktoolpath, framedir, carrier_s8b) | |
apkname = apkdir.split(os.sep)[-1] | |
try: | |
fname = get_apk_filename(os.path.join(apkdir, apkname), carrier_s8b) | |
except FileNotFoundError: | |
pass | |
else: | |
newdir = apkdir.replace(basedir, outdir).replace(apkname, "", 1) | |
if carrier_s8a: | |
apptype = newdir.split(os.sep)[-2] | |
carrname = apkdir.split(os.sep)[-4] | |
newdir = os.path.join(outdir, "csc", carrname, apptype) | |
if carrier_s8b: | |
apkname = apkname.replace(".apk", "", 1) | |
apkdir = os.path.dirname(apkdir).replace(".apk", "", 1) | |
if carrier_n8a: | |
carrname = apkdir.split(os.sep)[-3] | |
newdir = os.path.join(outdir, carrname) | |
if carrier_n8b: | |
carrname = apkdir.split(os.sep)[-3] | |
newdir = os.path.join(outdir, "omc", carrname) | |
if carrier_s9a: | |
newdir = outdir | |
if not os.path.exists(newdir): | |
os.makedirs(newdir) | |
shutil.copy(os.path.join(apkdir, "{0}.apk".format(apkname)), os.path.join(newdir, fname)) | |
shutil.rmtree(os.path.join(apkdir, apkname), ignore_errors=True) | |
def filter_apkfolders(apkfolders): | |
excludes = ("mcRegistry",) | |
return [j for j in apkfolders if j not in excludes] | |
def apkextract_base(indir, outdir, tips, apktoolpath=None, framedir=None): | |
for root in tips: | |
olddir = os.path.join(indir, root[0], root[1]) | |
if are_there_apks(olddir): | |
newddir = os.path.join(outdir, root[0], root[1]) | |
rawfolders = filter_apkfolders(os.listdir(olddir)) | |
apkfolders = [os.path.join(olddir, x) for x in rawfolders if os.path.isdir(os.path.join(olddir, x))] | |
for folder in apkfolders: | |
bname = os.path.basename(folder) | |
if os.path.exists(folder) and are_there_apks(folder): | |
print("COPYING APK: {0}.apk".format(os.path.join(root[0], root[1], bname))) | |
indiv_apkextract(indir, outdir, folder, apktoolpath, framedir) | |
else: | |
continue | |
def apkextract(indir, outdir, tips=None, apktoolpath=None, framedir=None): | |
if tips is None: | |
tips = [("system", "app"), ("system", "priv-app"), ("system", "container"), ("userdata", "app"), ("vendor", "app")] | |
apkextract_base(indir, outdir, tips, apktoolpath, framedir) | |
def prep_apks(indir, tips=None): | |
if tips is None: | |
tips = [("system", "app"), ("system", "priv-app"), ("system", "container"), ("userdata", "app"), ("vendor", "app")] | |
for root in tips: | |
if not os.path.exists(os.path.join(indir, "apks", root[0], root[1])): | |
os.makedirs(os.path.join(indir, "apks", root[0], root[1])) | |
def generic_extension_search(indir, ending): | |
for root, dirs, files in os.walk(indir): | |
for file in files: | |
if file.lower().endswith(ending): | |
return True | |
return False | |
def are_there_apks(indir): | |
return generic_extension_search(indir, ".apk") | |
def are_there_lz4s(indir): | |
return generic_extension_search(indir, ".lz4") | |
def carrierapk_note8a(indir, outdir, basedir, apktoolpath=None): | |
if are_there_apks(indir): | |
print("COPYING CARRIER APPS") | |
framedir = os.path.join(basedir, "system", "framework", "samsung-framework-res") | |
goodcarriers = [x for x in os.listdir(indir) if len(os.listdir(os.path.join(indir, x))) > 1] | |
for carrier in goodcarriers: | |
print("COPYING APPS FOR CSC: {0}".format(carrier)) | |
olddir = os.path.join(indir, carrier) | |
newdir = os.path.join(outdir, carrier) | |
if not os.path.exists(newdir): | |
os.makedirs(newdir) | |
typefolders = [os.path.join(olddir, x) for x in os.listdir(olddir) if os.path.isdir(os.path.join(olddir, x))] | |
for app in typefolders: | |
apkfolders = [os.path.join(app, x) for x in os.listdir(app) if os.path.isdir(os.path.join(app, x))] | |
for folder in apkfolders: | |
bname = os.path.basename(folder) | |
findir = os.path.join(newdir, os.path.basename(bname)) | |
print("COPYING APK: {0}.apk".format(bname)) | |
try: | |
indiv_apkextract(indir, outdir, folder, apktoolpath, framedir, carrier_n8a=True) | |
except FileNotFoundError: | |
continue | |
print("") | |
else: | |
pass | |
def carrierapk_s9a(indir, outdir, apktoolpath=None, framedir=None): | |
if are_there_apks(indir): | |
print("COPYING CARRIER APPS") | |
goodcarriers = ["app", "priv-app"] | |
for carrier in goodcarriers: | |
olddir = os.path.join(indir, carrier) | |
newdir = os.path.join(outdir, "odm", carrier) | |
if os.path.exists(olddir): | |
if not os.path.exists(newdir): | |
os.makedirs(newdir) | |
apkfolders = [os.path.join(olddir, x) for x in os.listdir(olddir) if os.path.isdir(os.path.join(olddir, x))] | |
for folder in apkfolders: | |
bname = os.path.basename(folder) | |
if os.path.exists(os.path.join(olddir, bname, "{0}.apk".format(bname))): | |
if os.path.getsize(os.path.join(olddir, bname, "{0}.apk".format(bname))) > 0: | |
print("COPYING APK: {0}.apk".format(bname)) | |
try: | |
indiv_apkextract(olddir, newdir, folder, apktoolpath=apktoolpath, framedir=framedir, carrier_s9a=True) | |
except FileNotFoundError: | |
pass | |
else: | |
pass | |
def carrierapk_s8a(indir, outdir, apktoolpath=None, framedir=None): | |
if are_there_apks(indir): | |
print("COPYING CARRIER APPS") | |
carrs = [x for x in os.listdir(indir) if os.path.isdir(os.path.join(indir, x))] | |
tips = [("system", "app"), ("system", "priv-app")] | |
carriers = {carr: [os.path.join(tip[0], tip[1]) for tip in tips] for carr in carrs} | |
maybecarriers = [] | |
for carr in carriers.keys(): | |
maybecarriers.append(os.path.join(carr, carriers[carr][0])) | |
maybecarriers.append(os.path.join(carr, carriers[carr][1])) | |
goodcarriers = [x for x in maybecarriers if os.path.exists(os.path.join(indir, x)) and len(os.listdir(os.path.join(indir, x))) > 1] | |
for carrier in goodcarriers: | |
olddir = os.path.join(indir, carrier) | |
newtag = os.sep.join(carrier.split(os.sep)[::2]) | |
newdir = os.path.join(outdir, "csc", newtag) | |
if not os.path.exists(newdir): | |
os.makedirs(newdir) | |
apkfolders = [os.path.join(olddir, x) for x in os.listdir(olddir) if os.path.isdir(os.path.join(olddir, x))] | |
for folder in apkfolders: | |
bname = os.path.basename(folder) | |
findir = os.path.join(newdir, os.path.basename(bname)) | |
if os.path.exists(os.path.join(olddir, bname, "{0}.apk".format(bname))): | |
if os.path.getsize(os.path.join(olddir, bname, "{0}.apk".format(bname))) > 0: | |
print("COPYING APK: {0}.apk".format(bname)) | |
try: | |
indiv_apkextract(indir, outdir, folder, apktoolpath=apktoolpath, framedir=framedir, carrier_s8a=True) | |
except FileNotFoundError: | |
pass | |
else: | |
pass | |
def carrierapk_s8b(indir, outdir, apktoolpath=None, framedir=None): | |
if are_there_apks(indir): | |
print("COPYING CARRIER APPS") | |
carrs = [x for x in os.listdir(indir) if os.path.isdir(os.path.join(indir, x)) and are_there_apks(os.path.join(indir, x))] | |
goodcarrs = [x.replace("Common_app", "common_app") for x in carrs] | |
for incarr, outcarr in zip(carrs, goodcarrs): | |
olddir = os.path.join(indir, incarr) | |
if "hidden_app" in os.listdir(olddir): | |
olddir = os.path.join(indir, incarr, "hidden_app") | |
newdir = os.path.join(outdir, "csc") | |
if not os.path.exists(newdir): | |
os.makedirs(newdir) | |
oldapps = [os.path.join(olddir, x) for x in os.listdir(olddir) if x.endswith(".apk")] | |
for app in oldapps: | |
bname = os.path.basename(app) | |
print("COPYING APK: {0}".format(bname)) | |
try: | |
indiv_apkextract(olddir, newdir, app, apktoolpath=apktoolpath, framedir=framedir, carrier_s8b=True) | |
except FileNotFoundError: | |
pass | |
else: | |
pass | |
def carrierapk_note8b(indir, outdir, apktoolpath=None, framedir=None): | |
if are_there_apks(indir): | |
print("COPYING CARRIER APPS") | |
goodcarriers = [os.path.join("common_app", "app"), os.path.join("common_app", "priv-app")] | |
for carrier in goodcarriers: | |
olddir = os.path.join(indir, carrier) | |
newtag = os.sep.join(carrier.split(os.sep)[::2]) | |
newdir = os.path.join(outdir, "omc", newtag) | |
if os.path.exists(olddir): | |
if not os.path.exists(newdir): | |
os.makedirs(newdir) | |
apkfolders = [os.path.join(olddir, x) for x in os.listdir(olddir) if os.path.isdir(os.path.join(olddir, x))] | |
for folder in apkfolders: | |
bname = os.path.basename(folder) | |
findir = os.path.join(newdir, os.path.basename(bname)) | |
if os.path.exists(os.path.join(olddir, bname, "{0}.apk".format(bname))): | |
if os.path.getsize(os.path.join(olddir, bname, "{0}.apk".format(bname))) > 0: | |
print("COPYING APK: {0}.apk".format(bname)) | |
try: | |
indiv_apkextract(indir, outdir, folder, apktoolpath=apktoolpath, framedir=framedir, carrier_n8b=True) | |
except FileNotFoundError: | |
pass | |
else: | |
pass | |
def preloadapk(indir, basedir): | |
print("COPYING PRELOAD APKS") | |
tips = [("system", "preload")] | |
if os.path.exists(os.path.join(basedir, "system", "preloadFactoryResetOnly")): | |
tips.append(("system", "preloadFactoryResetOnly")) | |
prep_apks(indir, tips) | |
apkextract(basedir, os.path.join(indir, "apks"), tips) | |
def trim_path_carrier(indir, outdir): | |
if os.path.exists(outdir): | |
shutil.rmtree(outdir, ignore_errors=True) | |
shutil.copytree(indir, outdir) | |
def main_zip_extract(indir): | |
zipf = [x for x in os.listdir(indir) if x.endswith(".zip")][0] | |
with zipfile.ZipFile(os.path.join(indir, zipf), allowZip64=True) as zipx: | |
zipx.extractall(indir) | |
def main0(indir): | |
fzip = [x for x in os.listdir(indir) if x.endswith(".zip")][0] | |
print("EXTRACTING: {0}".format(fzip)) | |
main_zip_extract(indir) | |
print("FULL ZIP EXTRACTION COMPLETE!\n") | |
def main1(indir): | |
md5out(indir) | |
print("MD5 EXTRACTION COMPLETE!\n") | |
if are_there_lz4s(indir): | |
lz4out(indir) | |
print("LZ4 EXTRACTION COMPLETE!\n") | |
def main2(indir): | |
cscout = ["CSC"] | |
if any("HOME_CSC" in x for x in os.listdir(indir)): | |
cscout.append("HOME_CSC") | |
for outdir in (cscout): | |
main2_csc(indir, outdir) | |
for outdir in ("BL",): | |
main2_bl(indir, outdir) | |
for outdir in ("AP",): | |
main2_ap(indir, outdir) | |
if "USERDATA" in os.listdir(indir): | |
for outdir in ("USERDATA",): | |
main2_userdata(indir, outdir) | |
def main2_csc(indir, outdir): | |
print("EXTRACTING: {0}".format(outdir)) | |
simg2img(os.path.join(indir, outdir)) | |
prep_dirs(os.path.join(indir, outdir)) | |
imgextract(os.path.join(indir, outdir)) | |
csc_zip_extract(os.path.join(indir, outdir)) | |
remove_loop(os.path.join(indir, outdir)) | |
print("{0} EXTRACTION COMPLETE!\n".format(outdir)) | |
def main2_bl(indir, outdir): | |
print("EXTRACTING: {0}".format(outdir)) | |
prep_dirs(os.path.join(indir, outdir)) | |
if "NON-HLOS.bin" in os.listdir(os.path.join(indir, outdir)): | |
non_hlos_extract(os.path.join(indir, outdir)) | |
if "param.bin" in os.listdir(os.path.join(indir, outdir)): | |
tar_param_extract(os.path.join(indir, outdir)) | |
remove_loop(os.path.join(indir, outdir)) | |
print("{0} EXTRACTION COMPLETE!\n".format(outdir)) | |
def main2_ap(indir, outdir): | |
print("EXTRACTING: {0}".format(outdir)) | |
simg2img(os.path.join(indir, outdir), ("boot.img", "recovery.img")) | |
prep_dirs(os.path.join(indir, outdir)) | |
imgextract(os.path.join(indir, outdir), ("boot.img", "recovery.img")) | |
fota_extract(os.path.join(indir, outdir)) | |
remove_loop(os.path.join(indir, outdir)) | |
boot_recovery_extract(os.path.join(indir, outdir)) | |
print("{0} EXTRACTION COMPLETE!\n".format(outdir)) | |
def main2_userdata(indir, outdir): | |
for outdir in ("USERDATA",): | |
print("EXTRACTING: {0}".format(outdir)) | |
simg2img(os.path.join(indir, outdir)) | |
prep_dirs(os.path.join(indir, outdir)) | |
imgextract(os.path.join(indir, outdir)) | |
remove_loop(os.path.join(indir, outdir)) | |
print("{0} EXTRACTION COMPLETE!\n".format(outdir)) | |
def main3(indir): | |
prep_apks(indir) | |
basedir = os.path.join(indir, "AP", "output") | |
preloaddir = os.path.join(basedir, "system", "preload") | |
if os.path.exists(preloaddir) and are_there_apks(preloaddir): | |
preloadapk(indir, basedir) | |
if any(odm in os.listdir(os.path.join(indir, "CSC")) for odm in ["odm.img", "odm.img.ext4"]) and are_there_apks(os.path.join(indir, "CSC")): | |
main3_s9a(indir, basedir) | |
#print("S9A") | |
elif "USERDATA" in os.listdir(indir) and are_there_apks(os.path.join(indir, "USERDATA")): | |
main3_note8a(indir, basedir) | |
#print("N8A") | |
elif "omr.img" in os.listdir(os.path.join(indir, "CSC")) and are_there_apks(os.path.join(indir, "CSC")): | |
main3_note8b(indir, basedir) | |
#print("N8B") | |
elif "hidden" in os.listdir(os.path.join(indir, "CSC", "output")) and are_there_apks(os.path.join(indir, "CSC", "output", "hidden")): | |
main3_s8b(indir, basedir) | |
#print("S8B") | |
elif not are_there_apks(os.path.join(indir, "CSC")): | |
main3_nocarrier(indir, basedir) | |
#print("NOAPKS") | |
else: | |
main3_s8a(indir, basedir) | |
#print("S8A") | |
remove_empty_dirs(os.path.join(indir, "apks")) | |
print("APP EXTRACTION COMPLETE!\n") | |
def main3_s9a(indir, basedir): | |
basedir2 = basedir.replace(os.path.join("AP", "output"), os.path.join("CSC", "output")) | |
if are_there_apks(os.path.join(basedir2, "odm")): | |
if not os.path.exists(os.path.join(indir, "apks", "odm")): | |
os.makedirs(os.path.join(indir, "apks", "odm")) | |
framedir = os.path.join(basedir, "system", "framework", "samsung-framework-res") | |
carrierapk_s9a(os.path.join(basedir2, "odm"), os.path.join(indir, "apks"), framedir=framedir) | |
print("COPYING SYSTEM APPS") | |
apkextract(basedir, os.path.join(indir, "apks")) | |
def main3_s8a(indir, basedir): | |
basedir2 = basedir.replace(os.path.join("AP", "output"), os.path.join("CSC", "output")) | |
tryomc = os.path.join(basedir2, "cache", "recovery", "sec_omc", "system", "omc") | |
if os.path.exists(tryomc) and are_there_apks(tryomc): | |
secondpath = tryomc | |
else: | |
secondpath = tryomc.replace("omc", "csc") | |
trim_path_carrier(secondpath, os.path.join(basedir2, "csc")) | |
if are_there_apks(os.path.join(basedir2, "csc")): | |
if not os.path.exists(os.path.join(indir, "apks", "csc")): | |
os.makedirs(os.path.join(indir, "apks", "csc")) | |
framedir = os.path.join(basedir, "system", "framework", "samsung-framework-res") | |
carrierapk_s8a(os.path.join(basedir2, "csc"), os.path.join(indir, "apks"), framedir=framedir) | |
shutil.rmtree(os.path.join(basedir2, "csc"), ignore_errors=True) | |
print("COPYING SYSTEM APPS") | |
apkextract(basedir, os.path.join(indir, "apks")) | |
def main3_s8b(indir, basedir): | |
basedir2 = basedir.replace(os.path.join("AP", "output"), os.path.join("CSC", "output")) | |
if are_there_apks(os.path.join(basedir2, "hidden")): | |
for potdir in os.listdir(os.path.join(basedir2, "hidden")): | |
if are_there_apks(os.path.join(basedir2, "hidden", potdir)): | |
if not os.path.exists(os.path.join(indir, "apks", potdir)): | |
os.makedirs(os.path.join(indir, "apks", potdir)) | |
framedir = os.path.join(basedir, "system", "framework", "samsung-framework-res") | |
carrierapk_s8b(os.path.join(basedir2, "hidden"), os.path.join(indir, "apks"), framedir=framedir) | |
print("COPYING SYSTEM APPS") | |
apkextract(basedir, os.path.join(indir, "apks")) | |
def main3_note8a(indir, basedir): | |
basedir2 = basedir.replace(os.path.join("AP", "output"), os.path.join("USERDATA", "output")) | |
tips = [("system", "app"), ("system", "priv-app"), ("system", "container")] | |
tips2 = [("userdata", "app")] | |
if are_there_apks(os.path.join(basedir, "system", "carrier")): | |
prep_apks(indir, [("system", "carrier")]) | |
carrierapk_note8a(os.path.join(basedir, "system", "carrier"), os.path.join(indir, "apks", "system", "carrier"), basedir) | |
print("COPYING SYSTEM APPS") | |
apkextract(basedir, os.path.join(indir, "apks"), tips) | |
apkextract(basedir2, os.path.join(indir, "apks"), tips2) | |
def main3_note8b(indir, basedir): | |
basedir2 = basedir.replace(os.path.join("AP", "output"), os.path.join("CSC", "output")) | |
trim_path_carrier(os.path.join(basedir2, "cache", "recovery", "sec_omc", "system", "omc"), os.path.join(basedir2, "omc")) | |
if are_there_apks(os.path.join(basedir2, "omc")): | |
if not os.path.exists(os.path.join(indir, "apks", "omc")): | |
os.makedirs(os.path.join(indir, "apks", "omc")) | |
framedir = os.path.join(basedir, "system", "framework", "samsung-framework-res") | |
carrierapk_note8b(os.path.join(basedir2, "omc"), os.path.join(indir, "apks"), framedir=framedir) | |
shutil.rmtree(os.path.join(basedir2, "omc"), ignore_errors=True) | |
print("COPYING SYSTEM APPS") | |
apkextract(basedir, os.path.join(indir, "apks")) | |
def main3_nocarrier(indir, basedir): | |
print("COPYING SYSTEM APPS") | |
apkextract(basedir, os.path.join(indir, "apks")) | |
if __name__ == "__main__": | |
indir = os.path.abspath(os.getcwd()) | |
main0(indir) | |
main1(indir) | |
main2(indir) | |
main3(indir) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment