diff --git a/ApkPatcher/ANSI_COLORS.py b/ApkPatcher/ANSI_COLORS.py new file mode 100644 index 0000000..a1d0afa --- /dev/null +++ b/ApkPatcher/ANSI_COLORS.py @@ -0,0 +1,56 @@ +# ————— 𝐀𝐍𝐒𝐈 𝐂𝐎𝐋𝐎𝐑𝐒 ————— + +class ANSI: + def __init__(self): + + # =====🔸𝐀𝐍𝐒𝐈 𝐂𝐎𝐋𝐎𝐑𝐒🔸===== + + self.ESC = '\033' # ( Octal ) + + # 𝐀𝐍𝐒𝐈 𝐂𝐎𝐋𝐎𝐑 ( 𝐁𝐎𝐋𝐃 = 𝟏𝐦 | 𝐃𝐀𝐑𝐊 = 𝟐𝐦 ) + + self.R = self.ESC + '[31;1m' # RED + self.G = self.ESC + '[32;1m' # GREEN + self.Y = self.ESC + '[33;1m' # YELLOW + self.B = self.ESC + '[34;1m' # BLUE + self.P = self.ESC + '[35;1m' # PURPLE + self.C = self.ESC + '[36;1m' # CYAN + self.W = self.ESC + '[37;1m' # WHITE + + # 𝐁𝐑𝐈𝐆𝐇𝐓 𝐂𝐎𝐋𝐎𝐑 + + self.BR = self.ESC + '[91;1m' # BRIGHT RED + self.BG = self.ESC + '[92;1m' # BRIGHT GREEN + self.BY = self.ESC + '[93;1m' # BRIGHT YELLOW + self.BB = self.ESC + '[94;1m' # BRIGHT BLUE + self.BP = self.ESC + '[95;1m' # BRIGHT PURPLE + self.BC = self.ESC + '[96;1m' # BRIGHT CYAN + self.BW = self.ESC + '[97;1m' # BRIGHT WHITE + + # 𝐎𝐓𝐇𝐄𝐑 𝐂𝐎𝐋𝐎𝐑 + + self.DG = self.ESC + '[32;2m' # DARK GREEN + self.GR = self.ESC + '[90;1m' # GRAY + + # 𝟐𝟓𝟔 𝐂𝐨𝐥𝐨𝐫𝐬 ( 𝐄𝐒𝐂 + '[𝟑𝟖;𝟓;{𝐈𝐃}𝐦' ) [ 𝐈𝐃 - https://user-images.githubusercontent.com/995050/47952855-ecb12480-df75-11e8-89d4-ac26c50e80b9.png ] + + self.PN = self.ESC + '[38;5;213;1m' # PINK + self.OG = self.ESC + '[38;5;202;1m' # ORANGE + + # 𝐂𝐋𝐄𝐀𝐑 𝐂𝐎𝐃𝐄𝐒 + + self.CL = self.ESC + '[2K' # CLEAR LINE + self.CC = self.ESC + '[0m' # CLEAR COLOR + + # 𝐌𝐎𝐑𝐄 𝐈𝐍𝐅𝐎 [ 𝐋𝐈𝐍𝐊 - https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797 ] + + # =====🔹𝐓𝐀𝐆🔹===== + + self.S = f'{self.B}[{self.C}' + self.E = f'{self.B}]' + self.X = f'{self.B}[ {self.P}* {self.B}]' + self.FYI = f'{self.B}[ {self.P}FYI {self.B}]' + self.INFO = f'{self.B}[ {self.Y}INFO {self.B}]{self.C}' + self.WARN = f'{self.B}[ {self.Y}WARN {self.B}]{self.B}' + self.ERROR = f'{self.B}[ {self.R}ERROR {self.B}]{self.R}' + self.SUGGEST = f'{self.B}[ {self.Y}SUGGEST {self.B}]{self.C}' \ No newline at end of file diff --git a/ApkPatcher/APK_PATCHER.py b/ApkPatcher/APK_PATCHER.py new file mode 100644 index 0000000..77ac22c --- /dev/null +++ b/ApkPatcher/APK_PATCHER.py @@ -0,0 +1,241 @@ +from .CLI import parse_arguments +from .ANSI_COLORS import ANSI; C = ANSI() +from .MODULES import IMPORT; M = IMPORT() + +from ApkPatcher.Utils.CRC import CRC_Fix +from ApkPatcher.Utils.Credits import Credits +from ApkPatcher.Utils.Scan import Scan_Apk +from ApkPatcher.Utils.Anti_Splits import Anti_Split +from ApkPatcher.Utils.Files_Check import FileCheck, __version__ +from ApkPatcher.Utils.Decompile_Compile import Decompile_Apk, Recompile_Apk, FixSigBlock, Sign_APK + +from ApkPatcher.Patch.AES import Copy_AES_Smali +from ApkPatcher.Patch.CERT_NSC import Write_NSC +from ApkPatcher.Patch.Smali_Patch import Smali_Patch +from ApkPatcher.Patch.TG_Patch import TG_Smali_Patch +from ApkPatcher.Patch.Ads_Patch import Ads_Smali_Patch +from ApkPatcher.Patch.Pine_Hook import Pine_Hook_Patch +from ApkPatcher.Patch.Spoof_Patch import Patch_Random_Info +from ApkPatcher.Patch.Flutter_SSL_Patch import Patch_Flutter_SSL +from ApkPatcher.Patch.Pairip_CoreX import Check_CoreX, Hook_Core +from ApkPatcher.Patch.Manifest_Patch import Fix_Manifest, Patch_Manifest, Permission_Manifest + + +def Clear(): + M.os.system('cls' if M.os.name == 'nt' else 'clear') +Clear() + + +# ---------------- Install Require Module --------------- +required_modules = ['requests', 'r2pipe', 'asn1crypto', 'multiprocess'] +for module in required_modules: + try: + __import__(module) + except ImportError: + print(f"{C.S} Installing {C.E} {C.OG}➸❥ {C.G}{module}...\n") + try: + M.subprocess.check_call([M.sys.executable, "-m", "pip", "install", module]) + Clear() + except (M.subprocess.CalledProcessError, Exception): + exit( + f"\n{C.ERROR} No Internet Connection. ✘\n" + f"\n{C.INFO} Internet Connection is Required to Install {C.G} pip install {module}\n" + ) + + +# ---------------- Check Dependencies --------------- +def check_dependencies(): + try: + M.subprocess.run(['java', '-version'], stdout=M.subprocess.PIPE, stderr=M.subprocess.PIPE, check=True, text=True) + except (M.subprocess.CalledProcessError, FileNotFoundError): + if M.os.name == 'posix': + install_package('openjdk-17') + else: + exit( + f'\n\n{C.ERROR} Java is not installed on Your System. ✘\n' + f'\n{C.INFO} Install Java & Run Script Again in New CMD. ✘\n' + f'\n{C.INFO} Verify Java Installation {C.G} java --version\n' + ) + + if M.os.name == 'posix': install_package('aapt') + + +# ---------------- Install Package --------------- +def install_package(pkg): + try: + result = M.subprocess.run(['pkg', 'list-installed'], stdout=M.subprocess.PIPE, stderr=M.subprocess.PIPE, text=True) + if pkg not in result.stdout: + print(f"{C.S} Installing {C.E} {C.OG}➸❥ {C.G}{pkg}...\n") + M.subprocess.check_call(['pkg', 'install', '-y', pkg]) + Clear() + except (M.subprocess.CalledProcessError, Exception): + exit( + f"\n\n{C.ERROR} No Internet Connection. ✘\n" + f"\n{C.INFO} Internet Connection is Required to Installation {C.G}pkg install {pkg}\n" + ) + +check_dependencies() + +F = FileCheck(); F.Set_Path(); F.F_D() + +Date = M.datetime.now().strftime('%d/%m/%y') +print(f"{C.OG}{f'v{__version__}':>22}") + +# Logo ( 🙏 ) +b64 = """eJzVlc9LAkEUx8/Ov9DlMXgNzLAfeMlUSAQLETx4ELGlJEehnEPgQSrqUlFYdIroHNShixDRP1DQn1DaqUv+Cc3MzszOrFtUt96u+2O+n/fmvTe7LoCwsdIEGStNzsRj8WgkSoYXe9fsdwtFp15tEsfSp8n8phyYjZKCU11tNCHTWK5V2GhE+yIUCgF1DYFplIY9s0RLGdG56EsU5PTjRgLcyfIJMk1IQNcDiaUsLCUKyYV0XoUL4H8QErNLbJxNBCtA4FSOikGdOufBj/DYAQS1L72WYreH7CB5ak+iUzPTtHSvZH32LWcYGxsX2Yp7KdIwyI2KJNx1ZpgIZ5TCURqm3qAAkNKona5qn3pkkP1QCZSbnM5QkXDG2MQpWA+fq7IuyAA8lh2e3TPNbASfBHxRkVwZI7QPkpqqUs2OjcAWLqbERv0j5uIqt685UM9bKFjUb8Swu7MFr4eX71fn/Z1jGHZ3j+CjdzfY3uufHr31OvDycAbPN4/3T90sP/B7/uKgfuckcG9/JXy//8XtFz4WiqweTJFchTi8Jtmbtq0WnLqzsl4hmmj73BeLuXTe56/FVKXl/Pt++f6XB51988Mw6ByI6tvqQxIjc+trLUHUONDYGNHz2XIhnVzILZYzuVQmITr0CawgFWQ=""" +print(f"{M.zlib.decompress(M.base64.b64decode(b64)).decode('utf-8').rstrip('\n')} | {C.B}{Date}{C.CC}") +print("————————|——————————————————|—————————————————|——————————————|————") + + +# ---------------- Target All Classes Folder --------------- +def Find_Smali_Folders(decompile_dir, isAPKEditor, isPine_Hook): + + dex_path = M.os.path.join(decompile_dir, "dex") if isAPKEditor else decompile_dir + + smali_path = M.os.path.join(decompile_dir, "smali") if isAPKEditor else decompile_dir + + if isPine_Hook: + + classes_files = [file for file in M.os.listdir(dex_path) if file.startswith("classes") and file.endswith(".dex")] + + return f"classes{len(classes_files) + 1}.dex" + + else: + + prefix = "classes" if isAPKEditor else "smali_classes" + + folders = sorted([folder for folder in M.os.listdir(smali_path) if folder == "smali" or folder.startswith(prefix)], key=lambda x: int(x.split(prefix)[-1]) if x.split(prefix)[-1].isdigit() else 0) + + return [M.os.path.join(smali_path, folder) for folder in folders] + + +# ---------------- Execute Main Function --------------- +def RK_Techno_IND(): + args = parse_arguments() + isCoreX = args.Hook_CoreX + isFlutter = args.Flutter; isPairip = args.Pairip + Skip_Patch = args.Skip_Patch if args.Skip_Patch else [] + isAPKEditor = args.APKEditor; isEmulator = args.For_Emulator + + if isEmulator: + F.isEmulator() + F.F_D_A() + + if args.Credits: + Credits() + + apk_path = args.input or args.Merge + + if not M.os.path.isfile(apk_path): + exit( + f"\n{C.ERROR} APK file '{apk_path}' not found. ✘\n\n" + f"\n{C.FYI}{C.G} Make Sure There Is 'No Extra Space' In The Folder/Apk Name In The Input Text. If Yes, Then Remove Extra Space & Correct It By Renaming It.\n" + ) + + if args.CA_Certificate: + isCert = [Cert for Cert in args.CA_Certificate if not M.os.path.isfile(Cert)] + + if isCert: + exit(f"\n{C.ERROR} Not exist: {', '.join(isCert)}\n") + + apk_path = Anti_Split(apk_path, args.Merge, isCoreX) + + # ---------------- Set All Paths Directory ---------------- + decompile_dir = M.os.path.join(M.os.path.expanduser("~"), f"{M.os.path.splitext(M.os.path.basename(apk_path))[0]}_decompiled") + + build_dir = M.os.path.abspath(M.os.path.join(M.os.path.dirname(apk_path), f"{M.os.path.splitext(M.os.path.basename(apk_path))[0]}_Patched.apk")) + + rebuild_dir = build_dir.replace('_Patched.apk', '_Patch.apk') + + manifest_path = M.os.path.join(decompile_dir, 'AndroidManifest.xml') + + if M.os.name == 'posix': + M.subprocess.run(['termux-wake-lock']) + print(f"\n{C.X}{C.C} Acquiring Wake Lock...\r") + + start_time = M.time.time() + + # ---------------- Scan & Decompile APK --------------- + Package_Name, isFlutter_lib, isPairip_lib = Scan_Apk(apk_path, isFlutter, isPairip) + + Decompile_Apk(apk_path, decompile_dir, isEmulator, isAPKEditor, args.AES_Logs, args.Pine_Hook, Package_Name) + + smali_folders = Find_Smali_Folders(decompile_dir, isAPKEditor, args.Pine_Hook) + + # ---------------- Pine Hook ---------------- + if args.Pine_Hook: + Pine_Hook_Patch(decompile_dir, isAPKEditor, args.Load_Modules, smali_folders) + else: + # ---------------- AES Logs Inject ---------------- + if args.AES_Logs: + Copy_AES_Smali(decompile_dir, smali_folders, manifest_path, args.AES_S, isAPKEditor) + + Permission_Manifest(decompile_dir, manifest_path, isAPKEditor) + + # ---------------- Remove Ads ---------------- + if args.Remove_Ads: + Ads_Smali_Patch(smali_folders) + + # ---------------- Fake / Spoof Device Info ---------------- + if args.Random_Info: + Patch_Random_Info(smali_folders, args.Android_ID) + + # ---------------- TG Patch ---------------- + if args.TG_Patch: + TG_Smali_Patch(decompile_dir, smali_folders, isAPKEditor) + + + # ---------------- Other Patch ---------------- + if args.AES_Logs or args.Remove_Ads or args.Random_Info or args.Pine_Hook or args.TG_Patch: + Fix_Manifest(manifest_path, args.Spoof_PKG, args.Pine_Hook, Package_Name) + else: + if isFlutter and isFlutter_lib: + Patch_Flutter_SSL(decompile_dir, isAPKEditor) + + # ---------------- Smali Patching / Hook CoreX ---------------- + if isCoreX and isPairip and isPairip_lib and Check_CoreX(decompile_dir, isAPKEditor): + M.shutil.rmtree(decompile_dir) + exit(1) + + Smali_Patch(decompile_dir, smali_folders, isAPKEditor, args.CA_Certificate, args.Android_ID, isPairip, isPairip_lib, args.Spoof_PKG, args.Purchase, args.Remove_SS, Skip_Patch, args.Remove_USB, isCoreX) + + if isCoreX and isPairip and isPairip_lib: + Hook_Core(args.input, decompile_dir, isAPKEditor, Package_Name) + + # ---------------- Patch Manifest & Write Network Config ---------------- + Fix_Manifest(manifest_path, args.Spoof_PKG, args.Pine_Hook, Package_Name) + + Patch_Manifest(decompile_dir, manifest_path) + + Write_NSC(decompile_dir, isAPKEditor, args.CA_Certificate) + + # ---------------- Recompile APK ---------------- + Recompile_Apk(decompile_dir, apk_path, build_dir, isEmulator, isAPKEditor, Package_Name) + + # ---------------- Fix CRC / Sign APK ---------------- + if not isCoreX and isPairip and isPairip_lib or args.unsigned_apk: + + if not isAPKEditor: + FixSigBlock(decompile_dir, apk_path, build_dir, rebuild_dir); + + CRC_Fix(apk_path, build_dir, ["AndroidManifest.xml", ".dex"]) + + else: + Sign_APK(build_dir) + + if M.os.path.exists(build_dir): + print(f'{C.S} Final APK {C.E} {C.G}︻デ═一 {C.Y}{build_dir} {C.G} ✔') + + print(f"\n{C.CC}{'_' * 61}\n") + + if not isCoreX and isPairip and isPairip_lib: + print(f'\n{C.FYI}{C.C} This is Pairip Apk So U Install {C.G}( Keep Apk Without Sign ) {C.C}in VM / Multi_App\n') + + print(f'\n{C.S} Time Spent {C.E} {C.G}︻デ═一 {C.PN}{M.time.time() - start_time:.2f} {C.CC}Seconds {C.G} ✔\n') + + print(f'\n🚩 {C.CC}࿗ {C.OG}Jai Shree Ram {C.CC}࿗ 🚩\n 🛕🛕🙏🙏🙏🛕🛕\n') + + if M.os.name == 'posix': + M.subprocess.run(['termux-wake-unlock']) + exit(f"\n{C.X}{C.C} Releasing Wake Lock...\n") + exit(0) \ No newline at end of file diff --git a/ApkPatcher/CLI.py b/ApkPatcher/CLI.py new file mode 100644 index 0000000..0e10023 --- /dev/null +++ b/ApkPatcher/CLI.py @@ -0,0 +1,337 @@ +from .ANSI_COLORS import ANSI; C = ANSI() +from .MODULES import IMPORT; M = IMPORT() + +from ApkPatcher.Utils.Files_Check import __version__ + + +Tag = f"\n{C.CC}————|———————|————{C.G}•❀ {C.OG}Tag {C.G}❀•{C.CC}————|———————|————\n" + +FE = f"{C.P}\n |\n ╰{C.CC}┈{C.OG}➢ {C.G}ApkPatcher" + +EX = f"{FE} -i Your_Apk_Path.apk {C.OG}" + + +class CustomArgumentParser(M.argparse.ArgumentParser): + # ---------------- Error Handling ---------------- + def error(self, message): + suggestion = "" + for action in self._actions: + if action.option_strings and any(option in message for option in action.option_strings): + if action.dest == 'input': + suggestion = ( + f'\n{C.FYI}{C.G} Make Sure There Is "No Extra Space" In The Folder / APK Name In The Input Text. If Yes, Then Remove Extra Space & Correct It By Renaming It.\n\n' + f'\n{C.INFO} With Your Certificate Flag: {C.OG}-c {C.P}( Input Your pem/crt/cert Path ){EX}-c {C.Y}certificate.cert\n\n' + f'\n{C.INFO} If you are using an Emulator in PC Then Use Flag: {C.OG}-e{EX}-c {C.Y}certificate.cert {C.OG}-e\n' + ) + + elif action.dest == 'Merge': + suggestion = ( + f'\n{C.INFO} Only Merge APK\n\n' + f'\n{C.INFO} Merge Extension {C.Y}( .apks/.xapk/.apkm )' + f'\n{FE}{C.OG} -m {C.G}Your_Apk_Path.apks\n' + ) + + break + + exit( + f'\n{C.ERROR} {message}\n' + f'\n{suggestion}' + ) + + # ---------------- Print Help ---------------- + def print_help(self): + + super().print_help() + + print(f"\n{C.INFO} ApkPatcher Default Patch is VPN & SSL Bypass, Show Other Patch Flags List with: {C.G}ApkPatcher -O{C.C}\n") + + # ---------------- Other Patch ---------------- + def Other_Patch(self): + print( + f"""\n{C.X}{C.C} Other Patch Flags Help ( Keep Sequence in Mind ) + + {C.G}─•❀•❀ {C.C}Info Patch {C.G}❀•❀•─ {C.OG} + + -A, {C.C}--AES_Logs {C.Y} ➸ {C.G}AES Logs Inject {C.OG} + -D, {C.C}--Android_ID {C.Y} ➸ {C.G}Hook Android ID for One Device Login Bypass {C.OG} + -f, {C.C}--Flutter {C.Y} ➸ {C.G}Flutter SSL Bypass {C.OG} + -l, {C.C}--Load_Modules {C.Y} ➸ {C.G}Path of Xposed & LSP Module {C.P}( Currently Not Supported XSharedPreferences Module ) {C.OG} + -p, {C.C}--Pairip {C.Y} ➸ {C.G}Pairip CERT SSL Bypass {C.OG} + -P, {C.C}--Purchase {C.Y} ➸ {C.G}Purchase / Paid / Price {C.OG} + -r, {C.C}--Random_Info {C.Y} ➸ {C.G}Fake Device Info {C.OG} + -rmads, {C.C}--Remove_Ads {C.Y} ➸ {C.G}Bypass Ads {C.OG} + -rmss, {C.C}--Remove_SS {C.Y} ➸ {C.G}Bypass Screenshot Restriction {C.OG} + -rmusb, {C.C}--Remove_USB {C.Y} ➸ {C.G}Bypass USB Debugging {C.OG} + -pkg, {C.C}--Spoof_PKG {C.Y} ➸ {C.G}Spoof Package Detection {C.OG} + -pine, {C.C}--Pine_Hook {C.Y} ➸ {C.G}Pine Hook {C.OG} + -skip {C.C}[Skip_Patch ...]{C.Y} ➸ {C.G}Skip Specific Patches {C.P}( e.g. getAcceptedIssuers ) {C.OG} + -s, {C.C}--AES_S {C.Y} ➸ {C.G}Do U Want Separate AES.smali Dex {C.OG} + -t, {C.C}--TG_Patch {C.Y} ➸ {C.G}Telegram / Plus Patcher {C.OG} + -x, {C.C}--Hook_CoreX {C.Y} ➸ {C.G}Hook CoreX Flag: {C.OG}-p -x {C.P}( Only For [ arm64 ] )""" + ) + + user_input = input(f"\n\n{C.B}[ {C.P}* {C.B}] {C.C} Do See Example\n{C.G} |\n └──── {C.CC}~ y / Exit to Enter {C.G}$ : {C.Y}") + + if user_input.lower() == "y": + print( + f"""\n{Tag.replace("Tag", "AES Logs Inject")} + +{C.INFO} AES MT Logs Inject Flag: {C.OG}-A{EX}-A + + +{C.INFO} Do U Want Separate AES.smali Dex Use Flag: {C.OG}-A -s{EX}-A -s + +{Tag.replace("Tag", "Hook Android ID")} + +{C.INFO} Hook Android ID For One Device Login Bypass Use Flag: {C.OG}-D {C.P}( Input Your Original 16 Digit Android ID ){EX}-D {C.Y}7e9f51f096bd5c83 + +{Tag.replace("Tag", "isFlutter / isPairip")} + +{C.INFO} If APK is Flutter Then Use Additional Flag: {C.OG}-f{EX}-f + + +{C.INFO} If APK is Pairip Then Use Additional Flag: {C.OG}-p {C.P}( Without Sign APK Use Only in VM / Multi_App ){EX}-p + + +{C.INFO} If APK is Pairip Then Hook CoreX Use Additional Flag: {C.OG}-p -x {C.P}( Install Directly Only For [ arm64 ] ){EX}-p -x + +{Tag.replace("Tag", "Spoof PKG / Device Info")} + +{C.INFO} Spoof Package Detection Flag: {C.OG}-pkg {C.P}( Dex / Manifest / Res ){EX}-pkg + +{C.INFO} Fake Device Info Flag: {C.OG}-r{EX}-r + + +{C.INFO} With Your Android ID Flag: {C.OG}-r -D {C.P}( Input Your Custom 16 Digit Android ID ){EX}-r -D {C.Y}7e9f51f096bd5c83 + +{Tag.replace("Tag", "Pine Hook")} + +{C.INFO} Pine Hook Flag: {C.OG}-pine -l {C.P}( Input Path of Xposed & LSP Module ){EX}-pine -l {C.Y}NoVPNDetect.apk just.trust.me.apk + +{Tag.replace("Tag", "Bypass Ads / SS / USB")} + +{C.INFO} Bypass Ads Flag: {C.OG}-rmads{EX}-rmads + + +{C.INFO} Bypass Screenshot Restriction Flag: {C.OG}-rmss{EX}-rmss + + +{C.INFO} Bypass USB Debugging Flag: {C.OG}-rmusb{EX}-rmusb + +{Tag.replace("Tag", "isPurchase / Skip Patch")} + +{C.INFO} Purchase / Paid / Price Flag: {C.OG}-P{EX}-P + + +{C.INFO} Skip Patch Flag: {C.OG}-skip{EX}-skip {C.Y}getAcceptedIssuers + +{Tag.replace("Tag", "Telegram / Plus Patch")} + +{C.INFO} Telegram / Plus Patch Flag: {C.OG}-t{EX}-t\n""" + ) + + else: + return + + +# ---------------- Parse Arguments ---------------- +def parse_arguments(): + + args = M.sys.argv[1:] + + if '-O' in args: + exit(CustomArgumentParser().Other_Patch()) + + if any(arg.startswith('-') for arg in args): + parser = CustomArgumentParser(description=f'{C.C}ApkPatcher v{__version__}') + else: + parser = M.argparse.ArgumentParser() + + group = parser.add_mutually_exclusive_group(required=True) + + group.add_argument( + '-i', + dest='input', + help=f'{C.Y}➸{C.G} Input APK Path...{C.C}' + ) + + group.add_argument( + '-m', + dest='Merge', + help=f'{C.Y}➸{C.G} Anti-Split ( Only Merge APK ){C.C}' + ) + + group.add_argument( + '-C', + dest='Credits', + action='store_true', + help=f'{C.Y}➸{C.G} Show Credits{C.C}' + ) + + additional = parser.add_argument_group(f'{C.OG}[ * ] Additional Flags{C.C}') + + additional.add_argument( + '-a', + '--APKEditor', + action='store_true', + help=f'{C.Y}➸ {C.G}APKEditor ( Default APKTool ){C.C}' + ) + + additional.add_argument( + '-e', + '--For_Emulator', + action='store_true', + help=f'{C.Y}➸{C.G} If using emulator on PC then use -e flag{C.C}' + ) + + additional.add_argument( + '-c', + dest='CA_Certificate', + type=str, + nargs='*', + help=f"{C.Y}➸{C.G} Input Your HttpCanary / Reqable / ProxyPin etc. Capture APK's CA-Certificate{C.C}" + ) + + additional.add_argument( + '-u', + dest='unsigned_apk', + action='store_true', + help=f"{C.Y}➸{C.G} Keep Unsigned APK{C.C}" + ) + + + # ---------------- Other Patch Flags ---------------- + parser.add_argument( + '-A', + '--AES_Logs', + action='store_true', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-D', + '--Android_ID', + type=str, + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-f', + '--Flutter', + action='store_true', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-l', + '--Load_Modules', + type=str, + nargs='*', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-p', + '--Pairip', + action='store_true', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-P', + '--Purchase', + action='store_true', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-r', + '--Random_Info', + action='store_true', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-rmads', + '--Remove_Ads', + action='store_true', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-rmss', + '--Remove_SS', + action='store_true', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-rmusb', + '--Remove_USB', + action='store_true', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-pkg', + '--Spoof_PKG', + action='store_true', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-pine', + '--Pine_Hook', + action='store_true', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-skip', + dest='Skip_Patch', + nargs='*', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-s', + '--AES_S', + action='store_true', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-t', + '--TG_Patch', + action='store_true', + help=M.argparse.SUPPRESS + ) + + parser.add_argument( + '-x', + '--Hook_CoreX', + action='store_true', + help=M.argparse.SUPPRESS + ) + + + Ext = ('.apk', '.apks', '.apkm', '.xapk') + + fixed = []; start = None; Valid_Ext = False + + for index, option in enumerate(args): + if option in ['-i', '-m', '-C']: + start, fixed = index + 1, fixed + [option] + elif start and (option.endswith(Ext) or M.os.path.isdir(option)): + fixed, start = fixed + [' '.join(args[start:index+1])], None + Valid_Ext = True + elif not start: + fixed.append(option) + + + if not Valid_Ext and M.sys.argv[1:2] != ['-C']: + print(f"\n{C.X}{C.C} Only Supported Extensions {C.G}{Ext}\n") + + print(f"\n{C.S} Input Path {C.E} {C.OG}➸❥{C.Y}", *fixed, f"{C.CC}\n") + + return parser.parse_args(fixed) \ No newline at end of file diff --git a/ApkPatcher/MODULES.py b/ApkPatcher/MODULES.py new file mode 100644 index 0000000..1060ab5 --- /dev/null +++ b/ApkPatcher/MODULES.py @@ -0,0 +1,34 @@ +# ————— 𝐈𝐌𝐏𝐎𝐑𝐓 𝐌𝐎𝐃𝐔𝐋𝐄𝐒 ————— + +class IMPORT: + def __init__(self): + + # ---------------- 𝐌𝐮𝐥𝐭𝐢𝐏𝐫𝐨𝐜𝐞𝐬𝐬 / 𝐌𝐮𝐥𝐭𝐢𝐏𝐫𝐨𝐜𝐞𝐬𝐬𝐢𝐧𝐠 ---------------- + try: + mp = __import__('multiprocess') + except ImportError: + mp = __import__('multiprocessing') + + # ————— 𝐋𝐢𝐛𝐫𝐚𝐫𝐢𝐞𝐬 𝐈𝐦𝐩𝐨𝐫𝐭 ————— + self.re = __import__('re') + self.os = __import__('os') + self.sys = __import__('sys') + self.zlib = __import__('zlib') + self.json = __import__('json') + self.time = __import__('time') + self.shutil = __import__('shutil') + self.string = __import__('string') + self.zipfile = __import__('zipfile') + self.hashlib = __import__('hashlib') + self.base64 = __import__('base64') + self.binascii = __import__('binascii') + self.random = __import__('random') + self.argparse = __import__('argparse') + self.subprocess = __import__('subprocess') + + # ————— 𝐄𝐱𝐭𝐫𝐚 𝐋𝐢𝐛𝐫𝐚𝐫𝐢𝐞𝐬 ————— + self.Pool = mp.Pool + self.Manager = mp.Manager + self.cpu_count = mp.cpu_count + self.datetime = __import__('datetime').datetime + \ No newline at end of file diff --git a/ApkPatcher/Patch/AES.py b/ApkPatcher/Patch/AES.py new file mode 100644 index 0000000..65c086a --- /dev/null +++ b/ApkPatcher/Patch/AES.py @@ -0,0 +1,214 @@ +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + +from collections import defaultdict +from ApkPatcher.Utils.Files_Check import FileCheck + +F = FileCheck(); F.Set_Path() +C_Line = f"{C.CC}{'_' * 61}" + + +# ---------------- Regex Scan ---------------- +def R_S_F(smali_folders): + for smali_folder in smali_folders: + for root, _, files in M.os.walk(smali_folder): + for file in files: + file_path = M.os.path.join(root, file) + yield file_path, open(file_path, 'r', encoding='utf-8', errors='ignore').read() + + +# ---------------- AES Logs Inject ---------------- +def AES_Logs_Inject(decompile_dir, smali_folders): + reg = M.re.compile(r'"AES/[^/]+/[^"]+"') + Class_P = M.re.compile(r'\.class[^;]* (L[^;]+;)') + Met_P = M.re.compile(r'\.method.*?\s([a-zA-Z0-9_<>\$]+)\((.*?)\)(.*)') + + Match_F = defaultdict(list) + + matched_files = [] + + total_files = 0 + + for file_path, content in R_S_F(smali_folders): + if "Ljavax/crypto/Cipher;->doFinal([B)[B" in content and "Ljavax/crypto/spec/SecretKeySpec;" in content and "Ljavax/crypto/spec/IvParameterSpec;" in content: + + Class_N = Class_P.search(content)[1] + + for block in content.split('.method')[1:]: + + if reg.search(block): + Met_M = Met_P.search(".method" + block.split('\n', 1)[0]) + + if Met_M: + total_files += 1 + + Met_Sig = f"{Met_M[1]}({Met_M[2]}){Met_M[3]}" + + match = f"{Class_N}->{Met_Sig}" + + Match_F[match].append(file_path) + + print(f"\r{C.S} Total Method Signature {C.E} {C.OG}➸❥ {C.PN}{total_files}", end='', flush=True) + + if total_files == 0: + M.shutil.rmtree(decompile_dir) + + exit( + f"{C.ERROR} No Matching Patterns found ! ✘\n" + f"\n{C.INFO} Sorry Bro Your Bad Luck !, Not Working MT Logs Method in This Apk, Try Another Method.\n" + ) + + print(f" {C.G} ✔\n\n", flush=True) + + for file_path, content in R_S_F(smali_folders): + if any(match in content for match in Match_F): + total_files += 1 + + matched_files.append(file_path) + + print(f"\r{C.S} Find Target Smali {C.E} {C.OG}➸❥ {C.PN}{total_files}", end='', flush=True) + + print(f" {C.G} ✔", flush=True) + + print(f'\n{C_Line}\n') + + Inject_A = r"invoke-static (\{[pv]\d+\}), Ljavax/crypto/Cipher;->getInstance\(Ljava/lang/String;\)Ljavax/crypto/Cipher;[^>]*?move-result-object ([pv]\d+)" + + Inject_A_matches = defaultdict(list) + + for match, file_paths in Match_F.items(): + for file_path in file_paths: + content = open(file_path, 'r', encoding='utf-8', errors='ignore').read() + matches = list(M.re.finditer(Inject_A, content)) + + if matches: + Inject_A_matches[Inject_A].append(M.os.path.basename(file_path)) + + updated_content = content + + for m in matches: + invoke_pv, result_pv = m[1], m[2] + + if f"invoke-static {invoke_pv}, LRK_TECHNO_INDIA/AES;->getInstance(Ljava/lang/Object;)V" not in updated_content: + injected_lines = [ + f"invoke-static {invoke_pv}, LRK_TECHNO_INDIA/AES;->getInstance(Ljava/lang/Object;)V", + f"invoke-static {invoke_pv}, Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;", + f"move-result-object {result_pv}", + f"invoke-static {{{result_pv}}}, LRK_TECHNO_INDIA/AES;->getInstance(Ljava/lang/Object;)V", + ] + match_text = m[0] + replacement_text = "\n ".join(injected_lines) + + if match_text in updated_content: + updated_content = updated_content.replace(match_text, replacement_text) + + open(file_path, 'w', encoding='utf-8', errors='ignore').write(updated_content) + + for pattern, file_paths in Inject_A_matches.items(): + print(f"\n{C.S} Cipher {C.E} {C.C}Method Signature {C.OG}➸❥ {C.P}{pattern}\n") + for file_name in file_paths: + print(f"{C.G} |\n └──── {C.CC}~{C.G}$ {C.Y}{file_name} {C.G} ✔") + + print( + f"\n{C.S} Pattern Applied {C.E} {C.OG}➸❥ {C.PN}{len(file_paths)} {C.C}Time/Smali {C.G} ✔\n" + f"\n{C_Line}\n" + ) + + print(f'{C_Line}\n') + + for match in Match_F: + regex = M.re.escape(match) + matching_files, T_P = [], 0 + + Inject_R = rf"invoke-static \{{(.*?)\}}, {regex}[^>]*?move-result-object ([pv]\d+)" + + for file_path in matched_files: + content = open(file_path, 'r', encoding='utf-8', errors='ignore').read() + + matches = list(M.re.finditer(Inject_R, content)) + + if matches: + T_P += 1 + matching_files.append(M.os.path.basename(file_path)) + + if T_P > 0: + print(f"\n{C.S} Method Signature {C.E} {C.OG}➸❥ {C.P}{match}\n") + for file_name in matching_files: + print(f"{C.G} |\n └──── {C.CC}~{C.G}$ {C.Y}{M.os.path.basename(file_name)} {C.G} ✔") + print( + f"\n{C.S} Pattern Applied {C.E} {C.OG}➸❥ {C.PN}{len(matching_files)} {C.C}Time/Smali {C.G} ✔\n" + f"\n{C_Line}\n" + ) + + for file_path in matched_files: + content = open(file_path, 'r', encoding='utf-8', errors='ignore').read() + matches = list(M.re.finditer(Inject_R, content)) + + if matches: + updated_content = content + for m in matches: + invoke_args, result_register = m[1], m[2] + + invoke_args_list = invoke_args.split(", ") + param_count = len(invoke_args_list) + + injected_lines = [] + if param_count == 1: + injected_lines.append(f"invoke-static {{{invoke_args_list[0]}}}, LRK_TECHNO_INDIA/AES;->a(Ljava/lang/Object;)V") + injected_lines.append(f"invoke-static {{{invoke_args}}}, {match}\n move-result-object {result_register}") + injected_lines.append(f"invoke-static {{{result_register}}}, LRK_TECHNO_INDIA/AES;->a(Ljava/lang/Object;)V") + elif param_count > 1: + for idx, param in enumerate(invoke_args_list, start=1): + injected_lines.append(f"invoke-static {{{param}}}, LRK_TECHNO_INDIA/AES;->b{idx}(Ljava/lang/Object;)V") + injected_lines.append(f"invoke-static {{}}, LRK_TECHNO_INDIA/AES;->b()V") + injected_lines.append(f"invoke-static {{{invoke_args}}}, {match}\n move-result-object {result_register}") + injected_lines.append(f"invoke-static {{{result_register}}}, LRK_TECHNO_INDIA/AES;->a(Ljava/lang/Object;)V") + + match_text = m[0] + replacement_text = "\n ".join(injected_lines) + + if match_text in updated_content: + updated_content = updated_content.replace(match_text, replacement_text) + + open(file_path, 'w', encoding='utf-8', errors='ignore').write(updated_content) + + +# ---------------- Copy AES Smali ---------------- +def Copy_AES_Smali(decompile_dir, smali_folders, manifest_path, isAES_MS, isAPKEditor): + + AES_Logs_Inject(decompile_dir, smali_folders) + + if isAES_MS: + if isAPKEditor: + decompile_dir = M.os.path.join(decompile_dir, "smali") + + prefix = "classes" if isAPKEditor else "smali_classes" + + L_S_C_F = M.os.path.join(decompile_dir, f"{prefix}{int(M.os.path.basename(smali_folders[-1])[len(prefix):]) + 1}") + + M.os.makedirs(L_S_C_F, exist_ok=True) + else: + L_S_C_F = smali_folders[-1] + + + # ---------------- Copy AES.smali ---------------- + Target_Dest = M.os.path.join(L_S_C_F, 'RK_TECHNO_INDIA', 'AES.smali') + M.os.makedirs(M.os.path.dirname(Target_Dest), exist_ok=True) + M.shutil.copy(F.AES_Smali, Target_Dest) + + print(f"\n{C.S} Generate {C.E} {C.G}AES.smali {C.OG}➸❥ {C.Y}{M.os.path.relpath(Target_Dest, decompile_dir)} {C.G} ✔") + + + # ---------------- Update Package Name ---------------- + PKG_Name = M.re.search( + r'package="([^"]+)"', + open(manifest_path, 'r', encoding='utf-8', errors='ignore').read() + )[1] + + content = open(Target_Dest, 'r', encoding='utf-8', errors='ignore').read() + + Update_PKG = content.replace('PACKAGENAME', PKG_Name) + + open(Target_Dest, 'w', encoding='utf-8', errors='ignore').write(Update_PKG) + + print(f"{C.G} |\n └── {C.CC}Update Package Name ~{C.G}$ {C.OG}➸❥ {C.P}'{C.G}{PKG_Name}{C.P}' {C.G} ✔\n") \ No newline at end of file diff --git a/ApkPatcher/Patch/Ads_Patch.py b/ApkPatcher/Patch/Ads_Patch.py new file mode 100644 index 0000000..4df0138 --- /dev/null +++ b/ApkPatcher/Patch/Ads_Patch.py @@ -0,0 +1,181 @@ +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + +C_Line = f"{C.CC}{'_' * 61}" + + +# ---------------- Regex Scan ---------------- +def Regex_Scan(Smali_Path, Target_Regex, Count, Lock): + + Smali = open(Smali_Path, 'r', encoding='utf-8', errors='ignore').read() + + Regexs = [M.re.compile(r) for r in Target_Regex] + + for Regex in Regexs: + + if Regex.search(Smali): + + if Lock: + try: + with Lock: + Count.value += 1 + + print(f"\r{C.S} Find Target Smali {C.E} {C.OG}➸❥ {C.PN}{Count.value}", end='', flush=True) + + except Exception: + return None + + else: + Count[0] += 1 + + print(f"\r{C.S} Find Target Smali {C.E} {C.OG}➸❥ {C.PN}{Count[0]}", end='', flush=True) + + return Smali_Path + + +# ---------------- Ads Smali Patch ---------------- +def Ads_Smali_Patch(smali_folders): + + Smali_Paths, Match_Smali = [], [] + + patterns = [ + ( + r'"(com.google.android.play.core.appupdate.protocol.IAppUpdateService|Theme.Dialog.Alert|com.google.android.play.core.install.BIND_UPDATE_SERVICE)"', + r'""', + "Update Disable" + ), + ( + r'(invoke(?!.*(close|Destroy|Dismiss|Disabl|error|player|remov|expir|fail|hide|skip|stop)).*/(adcolony|admob|ads|adsdk|aerserv|appbrain|applovin|appodeal|appodealx|appsflyer|bytedance/sdk/openadsdk|chartboost|flurry|fyber|hyprmx|inmobi|ironsource|mbrg|mbridge|mintegral|moat|mobfox|mobilefuse|mopub|my/target|ogury|Omid|onesignal|presage|smaato|smartadserver|snap/adkit|snap/appadskit|startapp|taboola|tapjoy|tappx|vungle)/[^;]+;->(.*(load|show).*)\([^)]*\)V)|(invoke(?!.*(close|Deactiv|Destroy|Dismiss|Disabl|error|player|remov|expir|fail|hide|skip|stop|Throw)).*/(adcolony|admob|ads|adsdk|aerserv|appbrain|applovin|appodeal|appodealx|appsflyer|bytedance/sdk/openadsdk|chartboost|flurry|fyber|hyprmx|inmobi|ironsource|mbrg|mbridge|mintegral|moat|mobfox|mobilefuse|mopub|my/target|ogury|Omid|onesignal|presage|smaato|smartadserver|snap/adkit|snap/appadskit|startapp|taboola|tapjoy|tappx|vungle)/[^;]+;->(request.*|(.*(activat|Banner|build|Event|exec|header|html|initAd|initi|JavaScript|Interstitial|load|log|MetaData|metri|Native|onAd|propert|report|response|Rewarded|show|trac|url|(fetch|refresh|render|video)Ad).*)|.*Request)\([^)]*\)V)|(invoke(?!.*(close|Destroy|Dismiss|Disabl|error|player|remov|expir|fail|hide|skip|stop)).*/(adcolony|admob|ads|adsdk|aerserv|appbrain|applovin|appodeal|appodealx|appsflyer|bytedance/sdk/openadsdk|chartboost|flurry|fyber|hyprmx|inmobi|ironsource|mbrg|mbridge|mintegral|moat|mobfox|mobilefuse|mopub|my/target|ogury|Omid|onesignal|presage|smaato|smartadserver|snap/adkit|snap/appadskit|startapp|taboola|tapjoy|tappx|vungle)/[^;]+;->((.*(Banner|initAd|Interstitial|load|Native|onAd|Rewarded|show|(fetch|refresh|render|request|video)Ad).*))\([^)]*\)V)|invoke-.*\{.*\}, L[^;]+;->(loadAd|requestNativeAd|showInterstitial|fetchad|fetchads|onadloaded|requestInterstitialAd|showAd|loadAds|AdRequest|requestBannerAd|loadNextAd|createInterstitialAd|setNativeAd|loadBannerAd|loadNativeAd|loadRewardedAd|loadRewardedInterstitialAd|loadAds|loadAdViewAd|showInterstitialAd|shownativead|showbannerad|showvideoad|onAdFailedToLoad)\([^)]*\)V|invoke-[^{]+ \{[^\}]*\}, Lcom[^;]+;->requestInterstitialAd\([^)]*\)V|invoke-[^{]+ \{[^\}]*\}, Lcom[^;]+;->loadAds\([^)]*\)V|invoke-[^{]+ \{[^\}]*\}, Lcom[^;]+;->loadAd\([^)]*\)V|invoke-[^{]+ \{[^\}]*\}, Lcom[^;]+;->requestBannerAd\([^)]*\)V|invoke-[^{]+ \{[pv]\d\}, Lcom/facebook[^;]+;->show\([^)]*\)V|invoke-[^{]+ \{[pv]\d\}, Lcom/google[^;]+;->show\([^)]*\)V', + r'nop', + "Ads Regex 1" + ), + ( + r'(invoke(?!.*(close|Deactiv|Destroy|Dismiss|Disabl|error|player|remov|expir|fail|hide|skip|stop|Throw)).*/(adcolony|admob|ads|adsdk|aerserv|appbrain|applovin|appodeal|appodealx|appsflyer|bytedance/sdk/openadsdk|chartboost|flurry|fyber|hyprmx|inmobi|ironsource|mbrg|mbridge|mintegral|moat|mobfox|mobilefuse|mopub|my/target|ogury|Omid|onesignal|presage|smaato|smartadserver|snap/adkit|snap/appadskit|startapp|taboola|tapjoy|tappx|vungle)/[^;]+;->(request.*|(.*(activat|Banner|build|Event|exec|header|html|initAd|initi|JavaScript|Interstitial|load|log|MetaData|metri|Native|(can|get|is|has|was)Ad|propert|report|response|Rewarded|show|trac|url|(fetch|refresh|render|video)Ad).*)|.*Request)\([^)]*\)Z[^>]*?)move-result ([pv]\d+)|(invoke(?!.*(close|Destroy|Dismiss|Disabl|error|player|remov|expir|fail|hide|skip|stop)).*/(adcolony|admob|ads|adsdk|aerserv|appbrain|applovin|appodeal|appodealx|appsflyer|bytedance/sdk/openadsdk|chartboost|flurry|fyber|hyprmx|inmobi|ironsource|mbrg|mbridge|mintegral|moat|mobfox|mobilefuse|mopub|my/target|ogury|Omid|onesignal|presage|smaato|smartadserver|snap/adkit|snap/appadskit|startapp|taboola|tapjoy|tappx|vungle)/[^;]+;->((.*(Banner|initAd|Interstitial|load|Native|(can|get|has|is|was)Ad|Rewarded|show|(fetch|refresh|render|request|video)Ad).*))\([^)]*\)Z[^>]*?)move-result ([pv]\d+)', + r'const/4 \9, 0x0', + "Ads Regex 2" + ), + ( + r'(invoke(?!.*(close|Destroy|Dismiss|Disabl|error|player|remov|expir|fail|hide|skip|stop)).*/(adcolony|admob|ads|adsdk|aerserv|appbrain|applovin|appodeal|appodealx|appsflyer|bytedance/sdk/openadsdk|chartboost|flurry|fyber|hyprmx|inmobi|ironsource|mbrg|mbridge|mintegral|moat|mobfox|mobilefuse|mopub|my/target|ogury|Omid|onesignal|presage|smaato|smartadserver|snap/adkit|snap/appadskit|startapp|taboola|tapjoy|tappx|vungle)/[^;]+;->(.*(load|show).*)\([^)]*\)Z[^>]*?)move-result ([pv]\d+)', + r'const/4 \6, 0x0', + "Ads Regex 3" + ), + ( + r'(\.method\s(public|private|static)\s\b(?!\babstract|native\b)[^(]*?loadAd\([^)]*\)V)', + r'\1\n\treturn-void', + "Ads Regex 4" + ), + ( + r'(\.method\s(public|private|static)\s\b(?!\babstract|native\b)[^(]*?loadAd\([^)]*\)Z)', + r'\1\n\tconst/4 v0, 0x0\n\treturn v0', + "Ads Regex 5" + ), + ( + r'(invoke[^{]+ \{[^\}]*\}, L[^(]*loadAd\([^)]*\)[VZ])|(invoke[^{]+ \{[^\}]*\}, L[^(]*gms.*\>(loadUrl|loadDataWithBaseURL|requestInterstitialAd|showInterstitial|showVideo|showAd|loadData|onAdClicked|onAdLoaded|isLoading|loadAds|AdLoader|AdRequest|AdListener|AdView)\([^)]*\)V)', + r'#', + "Ads Regex 6" + ), + ( + r'\.method [^(]*(loadAd|requestNativeAd|showInterstitial|fetchad|fetchads|onadloaded|requestInterstitialAd|showAd|loadAds|AdRequest|requestBannerAd|loadNextAd|createInterstitialAd|setNativeAd|loadBannerAd|loadNativeAd|loadRewardedAd|loadRewardedInterstitialAd|loadAds|loadAdViewAd|showInterstitialAd|shownativead|showbannerad|showvideoad|onAdFailedToLoad)\([^)]*\)V\s+\.locals \d+[\s\S]*?\.end method', + r'#', + "Ads Regex 7" + ), + ( + r'"ca-app-pub-\d{16}/\d{10}"', + r'"ca-app-pub-0000000000000000/0000000000"', + "Ads Regex 8" + ), + ( + r'"(http.*|//.*)(61.145.124.238|-ads.|.ad.|.ads.|.analytics.localytics.com|.mobfox.com|.mp.mydas.mobi|.plus1.wapstart.ru|.scorecardresearch.com|.startappservice.com|/ad.|/ads|ad-mail|ad.*_logging|ad.api.kaffnet.com|adc3-launch|adcolony|adinformation|adkmob|admax|admob|admost|adsafeprotected|adservice|adtag|advert|adwhirl|adz.wattpad.com|alta.eqmob.com|amazon-*ads|amazon.*ads|amobee|analytics|applovin|applvn|appnext|appodeal|appsdt|appsflyer|burstly|cauly|cloudfront|com.google.android.gms.ads.identifier.service.START|crashlytics|crispwireless|doubleclick|dsp.batmobil.net|duapps|dummy|flurry|gad|getads|google.com/dfp|googleAds|googleads|googleapis.*.ad-*|googlesyndication|googletagmanager|greystripe|gstatic|inmobi|inneractive|jumptag|live.chartboost.com|madnet|millennialmedia|moatads|mopub|native_ads|pagead|pubnative|smaato|supersonicads|tapas|tapjoy|unityads|vungle|zucks).*"', + r'"="', + "Ads Regex 9" + ), + ( + r'"(http.*|//.*)(61\.145\.124\.238|/2mdn\.net|-ads\.|\.5rocks\.io|\.ad\.|\.adadapted|\.admitad\.|\.admost\.|\.ads\.|\.aerserv\.|\.airpush\.|\.batmobil\.|\.chartboost\.|\.cloudmobi\.|\.conviva\.|\.dov-e\.com|\.fyber\.|\.mng-ads\|\.mydas\.|\.predic\.|\.talkingdata\.|\.tapdaq\.|\.tele\.fm|\.unity3d\.|\.unity\.|\.wapstart\.|\.xdrig\.|\.zapr\.|\/ad\.|\/ads|a4\.tl|accengage|ad4push|ad4screen|ad-mail|ad\..*_logging|ad\.api\.kaffnet\.|ad\.cauly\.co\.|adbuddiz|adc3-launch|adcolony|adfurikun|adincube|adinformation|adkmob|admax\.|admixer|admob|admost|ads\.mdotm\.|adsafeprotected|adservice|adsmogo|adsrvr|adswizz|adtag|adtech\.de|advert|adwhirl|adz\.wattpad\.|alimama\.|alta\.eqmob\.|amazon-.*ads|amazon\..*ads|amobee|analytics|anvato|appboy|appbrain|applovin|applvn|appmetrica|appnext|appodeal|appsdt|appsflyer|apsalar|avocarrot|axonix|banners-slb\.mobile\.yandex\.net|banners\.mobile\.yandex\.net|brightcove\.|burstly|cauly|cloudfront|cmcm\.|com\.google\.android\.gms\.ads\.identifier\.service\.START|comscore|contextual\.media\.net|crashlytics|crispwireless|criteo\.|dmtry\.|doubleclick|duapps|dummy|flurry|fwmrm|gad|getads|gimbal|glispa|google\.com\/dfp|googleAds|googleads|googleapis\..*\.ad-.*|googlesyndication|googletagmanager|greystripe|gstatic|heyzap|hyprmx|iasds01|inmobi|inneractive|instreamatic|integralads|jumptag|jwpcdn|jwpltx|jwpsrv|kochava|localytics|madnet|mapbox|mc\.yandex\.ru|media\.net|metrics\.|millennialmedia|mixpanel|mng-ads\.com|moat\.|moatads|mobclix|mobfox|mobpowertech|moodpresence|mopub|native_ads|nativex\.|nexage\.|ooyala|openx\.|pagead|pingstart|prebid|presage\.io|pubmatic|pubnative|rayjump|saspreview|scorecardresearch|smaato|smartadserver|sponsorpay|startappservice|startup\.mobile\.yandex\.net|statistics\.videofarm\.daum\.net|supersonicads|taboola|tapas|tapjoy|tapylitics|target\.my\.com|teads\.|umeng|unityads|vungle|zucks).*"', + r'"127.0.0.1"', + "Ads Regex 10" + ), + + # ---------------- Fix Play ---------------- + ( + r'(invoke-interface \{[^\}]*\}, Lcom/google/android/vending/licensing/Policy;->allowAccess\(\)Z[^>]*?\s+)move-result ([pv]\d+)', + r'\1const/4 \2, 0x1', + "Bypass Client-Side LVL (allowAccess)" + ), + ( + r'(\.method [^(]*connectToLicensingService\(\)V\s+.locals \d+)[\s\S]*?(\s+return-void\n.end method)', + r'\1\2', + "connectToLicensingService" + ), + ( + r'(\.method [^(]*initializeLicenseCheck\(\)V\s+.locals \d+)[\s\S]*?(\s+return-void\n.end method)', + r'\1\2', + "initializeLicenseCheck" + ), + ( + r'(\.method [^(]*processResponse\(ILandroid/os/Bundle;\)V\s+.locals \d+)[\s\S]*?(\s+return-void\n.end method)', + r'\1\2', + "processResponse" + ) + ] + + Target_Regex = [p[0] for p in patterns] + + for smali_folder in smali_folders: + for root, _, files in M.os.walk(smali_folder): + for file in files: + if file.endswith('.smali'): + Smali_Paths.append(M.os.path.join(root, file)) + + try: + # ---------------- Multiple Threading ---------------- + with M.Manager() as MT: + Count = MT.Value('i', 0); Lock = MT.Lock() + with M.Pool(M.cpu_count()) as PL: + Match_Smali = [path for path in PL.starmap(Regex_Scan, [(Smali_Path, Target_Regex, Count, Lock) for Smali_Path in Smali_Paths]) if path] + + except Exception: + # ---------------- Single Threading ---------------- + Count = [0] + for Smali_Path in Smali_Paths: + result = Regex_Scan(Smali_Path, Target_Regex, Count, None) + + if result: + Match_Smali.append(result) + + print(f" {C.G} ✔", flush=True) + + print(f'\n{C_Line}\n') + + if Match_Smali: + for pattern, replacement, description in patterns: + + Count_Applied = 0 + + Applied_Files = set() + + for file_path in Match_Smali: + + content = open(file_path, 'r', encoding='utf-8', errors='ignore').read() + + new_content = M.re.sub(pattern, replacement, content) + + if new_content != content: + if file_path not in Applied_Files: + Applied_Files.add(file_path) + + Count_Applied += 1 + + open(file_path, 'w', encoding='utf-8', errors='ignore').write(new_content) + + if Count_Applied > 0: + print(f"\n{C.S} Tag {C.E} {C.G}{description}") + + print(f"\n{C.S} Pattern {C.E} {C.OG}➸❥ {C.P}{pattern}") + + for file_path in Applied_Files: + print(f"{C.G} |\n └──── {C.CC}~{C.G}$ {C.Y}{M.os.path.basename(file_path)} {C.G} ✔") + + print( + f"\n{C.S} Pattern Applied {C.E} {C.OG}➸❥ {C.PN}{Count_Applied} {C.C}Time/Smali {C.G} ✔\n" + f"\n{C_Line}\n" + ) \ No newline at end of file diff --git a/ApkPatcher/Patch/CERT_NSC.py b/ApkPatcher/Patch/CERT_NSC.py new file mode 100644 index 0000000..dd603a1 --- /dev/null +++ b/ApkPatcher/Patch/CERT_NSC.py @@ -0,0 +1,187 @@ +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + + +# ---------------- Write RAW CERT ---------------- +def Write_CERT(decompile_dir, isAPKEditor, CA_Cert): + + if isAPKEditor: + decompile_dir = M.os.path.join(decompile_dir, 'resources', 'package_1') + + Default_CERT = """\ +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgIHALdlRG+pDzANBgkqhkiG9w0BAQ0FADBHMRswGQYDVQQD +DBJIdHRwQ2FuYXJ5IFJvb3QgQ0ExEzARBgNVBAoMCkh0dHBDYW5hcnkxEzARBgNV +BAsMCkh0dHBDYW5hcnkwHhcNMjIwMzA2MTIxMTAxWhcNMzMwMzAzMTIxMTAxWjBH +MRswGQYDVQQDDBJIdHRwQ2FuYXJ5IFJvb3QgQ0ExEzARBgNVBAoMCkh0dHBDYW5h +cnkxEzARBgNVBAsMCkh0dHBDYW5hcnkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCrzm03w7mMvHujpl0IMb/jgxEwJdUsfpazdgUVdsq+7T/Ks8O3NMFP +d4hl6sUgRbaMx3Uz8WolEtz/wu/fdGnrUVDcdWXiJKfhLUUP3KuYwE9tahrfRf14 +Yg/xGoA8Pz1BEaUnsJSt6RB5qm5fwn2O8QRykAbgr11or2rr8KQWMaoeciN04tjd +kkcWmPWNSytwea7l1LOrolUXGcbFlpXpGY1cTCoB1RZJe7HkUd1zdYhKUlhHZo3P +in9FhGa/UJGlyWXmT3ybY0nuPtIvqJ3Ao4FwP1zkrrqvS0UCi3QvJZrZ8EEju0U9 +NM009njCT6sX56TUG189Dk1uettEiTtlAgMBAAGjZDBiMB0GA1UdDgQWBBT0yJzC +NcHzwIVXMTnvgPp74q1KWjAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBtjAj +BgNVHSUEHDAaBggrBgEFBQcDAQYIKwYBBQUHAwIGBFUdJQAwDQYJKoZIhvcNAQEN +BQADggEBAA9H0nWzKUKKfgu6RI657wVgSONymRRnpzQ+GNjbDoi6CR3QWL8SvPe8 +s61nM8xUP0aMFv0VYrd80sICTQXAEld+/eXoDib7qxg1I2I9v+FkLwPSN2FaJRkv +GKxfki4s6kpNNvmO5X+1eR1fK7Y/lrlp9V7zP8oMbcBuNkiWO6UYNGGGuqxFr3H4 +f4LRvODZks/aGea2E0pdiAnAZCIGZS3Mg5cS7wA5vUSkKwpBIcYFVdYTF/xblJfX +OBoyS7CMCG66aSfs3zk4lT8fVwtFJjvkM01gH3A4q6T78rZ/Nkx01GC90Y1+xDAW +0o1SBaeL3tulFzqhMkl5KW0F3vYpP8k= +-----END CERTIFICATE-----""" + + raw_dir = M.os.path.join(decompile_dir, 'res', 'raw') + + M.os.makedirs(raw_dir, exist_ok=True) + + addCERT = [] + + if CA_Cert: + for idx, cert_path in enumerate(CA_Cert, start=1): + raw_file = f'Techno_India_{idx}.pem' if idx > 1 else 'Techno_India.pem' + M.shutil.copy(cert_path, M.os.path.join(raw_dir, raw_file)) + + addCERT.append(raw_file) + + print( + f"\n{C.S} Certificate {C.E}{C.C} Your Certificate Path...\n" + f"{C.G} |\n |\n └──── {C.CC}Input ~{C.G}#{C.Y} {', '.join(CA_Cert)} {C.G} ✔\n" + ) + + print(f"\n{C.S} Write Certificate {C.E} {C.OG}➸❥ {C.Y}raw/{', '.join(addCERT)} {C.G} ✔\n") + + else: + raw_path = M.os.path.join(raw_dir, 'Techno_India.pem') + + open(raw_path, 'w', encoding='utf-8', errors='ignore').write(Default_CERT) + + print(f"\n{C.S} Certificate {C.E}{C.G} The default certificate is from TechnoIndia's Modded HttpCanary... ✔\n") + + print(f"\n{C.S} Write Default Certificate {C.E} {C.OG}➸❥ {C.Y}{M.os.path.basename(raw_dir)}/Techno_India.pem {C.G} ✔\n") + + +# ---------------- Write NSC XML ---------------- +def Write_NSC(decompile_dir, isAPKEditor, CA_Cert, xml_file='network_security_config.xml'): + + Write_CERT(decompile_dir, isAPKEditor, CA_Cert) + + if isAPKEditor: + decompile_dir = M.os.path.join(decompile_dir, 'resources', 'package_1') + + NSC = """\ + + + + + * + 0.0.0.0 + 127.0.0.1 + + {cert_PlaceHolder} + + + + + + + {cert_PlaceHolder} + + + + + + + {cert_PlaceHolder} + + + + +""" + + cert_Entries = "" + + if CA_Cert: + for idx, _ in enumerate(CA_Cert, start=1): + CERT_Name = f'Techno_India_{idx}' if idx > 1 else 'Techno_India' + cert_Entries += f' \n' + + else: + cert_Entries += ' \n' + + NSC_XML = NSC.format(cert_PlaceHolder = cert_Entries.strip()) + + xml_dir = M.os.path.join(decompile_dir, 'res', 'xml') + + M.os.makedirs(xml_dir, exist_ok=True) + + xml_path = M.os.path.join(xml_dir, xml_file) + + open(xml_path, 'w', encoding='utf-8', errors='ignore').write(NSC_XML) + + print(f"\n{C.S} Write Network Config {C.E} {C.OG}➸❥ {C.Y}{M.os.path.basename(xml_dir)}/{xml_file} {C.G} ✔\n") + + if isAPKEditor: + update_public_xml(decompile_dir, CA_Cert) + + +# ---------------- For isAPKEditor ---------------- +def update_public_xml(decompile_dir, CA_Cert): + + public_xml_path = M.os.path.join(decompile_dir, 'res', 'values', 'public.xml') + + public_xml = open(public_xml_path, 'r', encoding='utf-8', errors='ignore').readlines() + + raw_ids = [] + xml_ids = [] + + raw_xml_regex = M.re.compile(r'') + + raw_found = False + xml_found = False + + for line in public_xml: + for match in raw_xml_regex.findall(line): + res_id = int(match[0], 16) + res_type = match[1] + res_name = match[2] + + if res_type == "raw" and res_name == "Techno_India": + raw_found = True + elif res_type == "xml" and res_name == "network_security_config": + xml_found = True + + if res_type == "raw": + raw_ids.append(res_id) + elif res_type == "xml": + xml_ids.append(res_id) + + if raw_found and xml_found: + return + + new_raw_id = max(raw_ids) + 1 if raw_ids else 0x7fffff01 + new_xml_id = max(xml_ids) + 1 if xml_ids else 0x7ffffff1 + + new_entries = [] + + if not raw_found: + if CA_Cert: + for idx, _ in enumerate(CA_Cert, start=1): + CERT_Name = f'Techno_India_{idx}' if idx > 1 else 'Techno_India' + new_entries.append(f' \n') + new_raw_id += 1 + + else: + new_entries.append(f' \n') + + if not xml_found: + new_entries.append(f' \n') + + for idx in range(len(public_xml)): + if "" in public_xml[idx]: + public_xml[idx:idx] = new_entries + break + + open(public_xml_path, 'w', encoding='utf-8', errors='ignore').writelines(public_xml) + + print(f"\n{C.S} Write New Entries {C.E} {C.OG}➸❥ {C.G}public.xml\n\n{C.OG}{''.join(new_entries).strip()}\n") \ No newline at end of file diff --git a/ApkPatcher/Patch/Flutter_SSL_Patch.py b/ApkPatcher/Patch/Flutter_SSL_Patch.py new file mode 100644 index 0000000..0f277b0 --- /dev/null +++ b/ApkPatcher/Patch/Flutter_SSL_Patch.py @@ -0,0 +1,146 @@ +# -* coding: utf-8 *- +# @auhtor: AbhiTheModder + +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + + +patterns = { + "arm64": [ + "F. 0F 1C F8 F. 5. 01 A9 F. 5. 02 A9 F. .. 03 A9 .. .. .. .. 68 1A 40 F9", + "F. 43 01 D1 FE 67 01 A9 F8 5F 02 A9 F6 57 03 A9 F4 4F 04 A9 13 00 40 F9 F4 03 00 AA 68 1A 40 F9", + "FF 43 01 D1 FE 67 01 A9 .. .. 06 94 .. 7. 06 94 68 1A 40 F9 15 15 41 F9 B5 00 00 B4 B6 4A 40 F9", + "F. 0F 1C F8 F. .. 0. .. .. .. .. .9 .. .. 0. .. 68 1A 40 F9 15 .. 4. F9 B5 00 00 B4 B6 46 40 F9", + ], + "arm": [ + "2D E9 F. 4. D0 F8 00 80 81 46 D8 F8 18 00 D0 F8", + ], + "x86": [ + "55 41 57 41 56 41 55 41 54 53 50 49 89 fe 48 8b 1f 48 8b 43 30 4c 8b b8 d0 01 00 00 4d 85 ff 74 12 4d 8b a7 90 00 00 00 4d 85 e4 74 4a 49 8b 04 24 eb 46", + "55 41 57 41 56 41 55 41 54 53 50 49 89 f. 4c 8b 37 49 8b 46 30 4c 8b a. .. 0. 00 00 4d 85 e. 74 1. 4d 8b", + "55 41 57 41 56 41 55 41 54 53 48 83 EC 18 49 89 FF 48 8B 1F 48 8B 43 30 4C 8B A0 28 02 00 00 4D 85 E4 74", + "55 41 57 41 56 41 55 41 54 53 48 83 EC 38 C6 02 50 48 8B AF A. 00 00 00 48 85 ED 74 7. 48 83 7D 00 00 74", + "55 41 57 41 56 41 55 41 54 53 48 83 EC 18 49 89 FE 4C 8B 27 49 8B 44 24 30 48 8B 98 D0 01 00 00 48 85 DB", + ], +} + + +# ---------------- Get r2 Version ---------------- +def get_r2_version(): + + try: + result = M.subprocess.run(["r2", "-V"], capture_output=True, text=True, check=True) + results = result.stdout.strip().split() + + for result in results: + if result.startswith(("5.", "6.")): + result = result.split("-")[0] + return result + + return None + + except (M.subprocess.CalledProcessError, FileNotFoundError): + return None + + +# ---------------- Find Offset ---------------- +def find_offset(r2, patterns, is_iA=False): + + if is_iA: + arch = M.json.loads(r2.cmd("iAj")) + else: + arch = M.json.loads(r2.cmd("iaj")) + + arch_value = arch["bins"][0]["arch"] + arch_bits = arch["bins"][0]["bits"] + + if arch_value == "arm" and arch_bits == 64: + arch = "arm64" + elif arch_value == "arm" and arch_bits == 16: + arch = "arm" + elif arch_value == "x86" and arch_bits == 64: + arch = "x86" + else: + print(f"\n{C.ERROR} Unsupported architecture: {arch_value}\n") + return + + if arch in patterns: + for arch in patterns: + for pattern in patterns[arch]: + search_result = r2.cmd(f"/x {pattern}") + search_result = search_result.strip().split(" ")[0] + + if search_result: + search_fcn = r2.cmd(f"{search_result};afl.").strip().split(" ")[0] + print(f"\n{C.X}{C.C} ssl_verify_peer_cert found at: {C.PN}{search_result}\n") + + if not search_fcn and arch == "x86": + search_fcn = search_result + r2.cmd(f"af @{search_fcn}") + + print(f"\n{C.X}{C.C} function at: {C.PN}{search_fcn}\n") + return search_fcn + + +# ---------------- Patch Flutter SSL ---------------- +def Patch_Flutter_SSL(decompile_dir, isAPKEditor): + + print(f"\r{C.X}{C.C} Flutter SSL Patch, Script by {C.OG}🇮🇳 AbhiTheM0dder 🇮🇳\n") + + try: + r2_version = tuple(map(int, get_r2_version().split("."))) + ia_version = tuple(map(int, "5.9.5".split("."))) + + if r2_version <= ia_version: + is_iA = True + else: + is_iA = False + + except Exception as e: + exit(f"\n{C.ERROR} {str(e)}\n") + + architectures = ["arm64-v8a", "armeabi-v7a", "armeabi", "x86_64"] + lib_so_path = None + + for arch in architectures: + lib = "root/lib" if isAPKEditor else "lib" + potential_path = M.os.path.join(decompile_dir, lib, arch, 'libflutter.so') + + if M.os.path.exists(potential_path): + lib_so_path = potential_path + break + + if lib_so_path: + print(f"\n{C.S} Found {C.E} {C.OG}➸❥ {C.Y}{arch}/{M.os.path.basename(lib_so_path)} {C.G} ✔\n") + else: + exit(f"\n{C.ERROR} libflutter.so not found in any of the specified architectures {architectures}\n") + + M.shutil.rmtree(decompile_dir) + + import r2pipe + + if r2pipe.in_r2(): + r2 = r2pipe.open() + r2.cmd("e log.quiet=true") + r2.cmd("oo+") + else: + r2 = r2pipe.open(lib_so_path, flags=["-w", "-e", "log.quiet=true"]) + + print(f"\n{C.X}{C.G} Analyzing function calls...\n") + + r2.cmd("aac") + + print(f"\n{C.X}{C.G} Searching for offset...\n") + + offset = find_offset(r2, patterns, is_iA) + + if offset: + r2.cmd(f"{offset}") + r2.cmd("wao ret0") + print(f"\n{C.X}{C.C} ssl_verify_peer_cert: {C.G}Patched Successfully ! ✔\n") + else: + print(f"\n{C.ERROR} ssl_verify_peer_cert Not Found. ✘\n") + + print(f"{C.CC}{'_' * 61}\n\n") + + r2.quit() \ No newline at end of file diff --git a/ApkPatcher/Patch/Manifest_Patch.py b/ApkPatcher/Patch/Manifest_Patch.py new file mode 100644 index 0000000..ac69313 --- /dev/null +++ b/ApkPatcher/Patch/Manifest_Patch.py @@ -0,0 +1,172 @@ +from.Package import P + +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + + +# ---------------- Fix Manifest ---------------- +def Fix_Manifest(manifest_path, isPKG, isPine_Hook, Package_Name): + + if isPine_Hook: + Pine_Hook(manifest_path, Package_Name) + + isPC = bool(M.re.search('piracychecker', open(manifest_path).read(), M.re.I)) + + patterns = [ + ( + r'\s+android:(splitTypes|requiredSplitTypes)="[^"]*?"', + r'', + 'Splits' + ), + ( + r'(isSplitRequired=)"true"', + r'\1"false"', + 'isSplitRequired' + ), + ( + r'\s+]*"com.android.(vending.|stamp.|dynamic.apk.)[^"]*"[^>]*/>', + r'', + '' + ), + ( + r'\s+<[^>]*"(com.pairip.licensecheck)[^"]*"[^>]*/>' if isPC else r'\s+<[^>]*"com.(pairip.licensecheck|android.vending.CHECK_LICENSE)[^"]*"[^>]*/>', + r'', + 'CHECK_LICENSE' + ) + ] + + if isPKG: + patterns.extend( + [ + ( + rf'{P.Menifest_Regex}', + r'', + 'Spoof Package Detection' + ) + ] + ) + + for pattern, replacement, description in patterns: + content = open(manifest_path, 'r', encoding='utf-8', errors='ignore').read() + new_content = M.re.sub(pattern, replacement, content) + + if new_content != content: + print( + f"\n{C.S} Tag {C.E} {C.OG}{description}\n" + f"\n{C.S} Applying Pattern {C.E} {C.OG}➸❥ {C.P}{pattern}\n" + f"{C.G} |\n └──── {C.CC}Patch Cleaned Up ~{C.G}$ {C.P}'{C.G}{M.os.path.basename(manifest_path)}{C.P}' {C.G} ✔\n" + ) + + open(manifest_path, 'w', encoding='utf-8', errors='ignore').write(new_content) + + +# ---------------- Patch Manifest ---------------- +def Patch_Manifest(decompile_dir, manifest_path): + + content = open(manifest_path, 'r', encoding='utf-8', errors='ignore').read() + + application_tag = M.re.search(r']*>', content)[0] + + cleaned_tag = M.re.sub( + r'\s+android:(usesCleartextTraffic|networkSecurityConfig)="[^"]*?"', + '', + application_tag + ) + + content = content.replace(application_tag, + M.re.sub( + r'>', + '\n\tandroid:usesCleartextTraffic="true"\n\tandroid:networkSecurityConfig="@xml/network_security_config">', + cleaned_tag + ) + ) + + open(manifest_path, 'w', encoding='utf-8', errors='ignore').write(content) + + print(f'\n{C.S} Updated {C.E}{C.C} android:networkSecurityConfig={C.P}"{C.G}@xml/network_security_config{C.P}" {C.OG}➸❥ {C.Y}{M.os.path.basename(manifest_path)} {C.G} ✔\n') + + print(f'\n{C.S} Updated {C.E}{C.C} android:usesCleartextTraffic={C.P}"{C.G}true{C.P}" {C.OG}➸❥ {C.Y}{M.os.path.basename(manifest_path)} {C.G} ✔\n') + + +# ---------------- Permission Manifest ---------------- +def Permission_Manifest(decompile_dir, manifest_path, isAPKEditor): + + A_Y_P = M.os.path.join(decompile_dir, 'apktool.yml') + + content = open(manifest_path, 'r', encoding='utf-8', errors='ignore').read() + + new_permissions = '''\t\n\t\n\t''' + + content = M.re.sub( + r'\s+]*android:name="(android.permission.((READ|WRITE|MANAGE)_EXTERNAL_STORAGE))"[^>]*>', + '', + content + ) + + content = M.re.sub( + r'android:targetSdkVersion="\d+"', + 'android:targetSdkVersion="28"', + content + ) + + content = M.re.sub( + r'(]*>)', + r'\1\n' + new_permissions, + content + ) + + application_tag = M.re.search(r']*>', content)[0] + + cleaned_tag = M.re.sub( + r'\s+android:(request|preserve)LegacyExternalStorage="[^"]*?"', + '', + application_tag + ) + + content = content.replace(application_tag, + M.re.sub( + r'>', + '\n\tandroid:requestLegacyExternalStorage="true"\n\tandroid:preserveLegacyExternalStorage="true">', + cleaned_tag + ) + ) + + open(manifest_path, 'w', encoding='utf-8', errors='ignore').write(content) + + print(f"\n{C.S} Storage Permission {C.E} {C.OG}➸❥ {C.P}'{C.G}AndroidManifest.xml{C.P}' {C.G} ✔\n") + + if not isAPKEditor: + yml = open(A_Y_P, 'r', encoding='utf-8', errors='ignore').read() + + update_yml = M.re.sub( + r'(targetSdkVersion:) (\d+)', + r'\1 28', + yml + ) + + open(A_Y_P, 'w', encoding='utf-8', errors='ignore').write(update_yml) + + print(f"\n{C.S} targetSdkVersion {C.E} {C.PN}28 {C.OG}➸❥{C.G} apktool.yml\n") + + +# ---------------- Pine Hook ---------------- +def Pine_Hook(manifest_path, Package_Name): + + content = open(manifest_path, 'r', encoding='utf-8', errors='ignore').read() + + provider = f''' + ''' + + content = M.re.sub( + r'(]*>)', + rf'\1{provider}', + content + ) + + open(manifest_path, 'w', encoding='utf-8', errors='ignore').write(content) + + print(f'\n{C.S} HooK Manifest {C.E}\n{C.PN} {provider} {C.G} ✔\n') \ No newline at end of file diff --git a/ApkPatcher/Patch/Package.py b/ApkPatcher/Patch/Package.py new file mode 100644 index 0000000..45f2f72 --- /dev/null +++ b/ApkPatcher/Patch/Package.py @@ -0,0 +1,26 @@ +from ..MODULES import IMPORT; M = IMPORT() + + +class P: + # ---------------- Spoof Package Detection ---------------- + Find_String = ['com.noshufou.android.su.elite', 'com.noshufou.android.su', 'eu.chainfire.supersu', 'com.koushikdutta.superuser', 'com.thirdparty.superuser', 'com.yellowes.su', 'com.topjohnwu.magisk', 'com.kingroot.kinguser', 'com.kingo.root', 'com.smedialink.oneclickroot', 'com.zhiqupk.root.global', 'com.alephzain.framaroot', 'com.koushikdutta.rommanager.license', 'com.koushikdutta.rommanager', 'com.dimonvideo.luckypatcher', 'com.chelpus.lackypatch', 'com.ramdroid.appquarantinepro', 'com.ramdroid.appquarantine', 'com.android.vending.billing.InAppBillingService.COIN', 'com.android.vending.billing.InAppBillingService.LUCK', 'com.chelpus.luckypatcher', 'com.blackmartalpha', 'org.blackmart.market', 'com.allinone.free', 'com.repodroid.app', 'org.creeplays.hack', 'com.baseappfull.fwd', 'com.zmapp', 'com.dv.marketmod.installer', 'org.mobilism.android', 'com.android.wp.net.log', 'com.android.camera.update', 'cc.madkite.freedom', 'com.solohsu.android.edxp.manager', 'org.meowcat.edxposed.manager', 'com.xmodgame', 'com.cih.game_cih', 'com.charles.lpoqasert', 'catch_.me_.if_.you_.can_', 'com.devadvance.rootcloakplus', 'com.devadvance.rootcloak', 'com.saurik.substrate', 'com.zachspong.temprootremovejb', 'com.amphoras.hidemyrootadfree', 'com.amphoras.hidemyroot', 'com.formyhm.hiderootPremium', 'com.formyhm.hideroot', 'me.weishu.exp', 'moe.shizuku.privileged.', 'com.guoshi.httpcanary.premium', 'com.guoshi.httpcanary', 'com.reqable.android', 'com.network.proxy', 'com.sniffer3', 'com.sniffer2', 'com.sniffer', 'com.datacapture.pro', 'com.black.canary', 'org.httpcanary.pro', 'app.greyshirts.sslcapture', 'com.evbadroid.proxymon', 'com.minhui.networkcapture.pro', 'com.minhui.networkcapture', 'com.minhui.wifianalyzer', 'com.packagesniffer.frtparlak', 'com.evbadroid.wicapdemo', 'jp.co.taosoftware.android.packetcapture', 'com.andriell.multicast_sniffer', 'com.emanuelef.remote_capture', 'de.stefanpledl.localcast', 'bin.mt.plus.canary', 'bin.mt.plus', 'ru.maximoff.apktool', 'idm.internet.download.manager.plus', 'idm.internet.download.manager', 'com.applisto.appcloner', 'org.lsposed.lspatch', 'me.jsonet.jshook', 'br.tiagohm.restler', 'com.replit.app', 'io.virtualapp', 'de.robv.android.xposed'] + + Match_Regex = f'"({"|".join(Find_String[:-1])}|{Find_String[-1]}.*)"' + + Menifest_Regex = rf'(\s+]*android:name={Match_Regex}[^>]*/>)' + + + # ---------------- Generate Hash ---------------- + def Hash(self, CA_Cert): + + from asn1crypto import x509 + + f = open(CA_Cert,'rb').read() + + if f.startswith(b'-----'): f = M.base64.b64decode(''.join(f.decode().splitlines()[1:-1])) + CERT = x509.Certificate.load(f)['tbs_certificate']['subject_public_key_info'].dump() + + sha1 = M.base64.b64encode(M.hashlib.sha1(CERT).digest()).decode() + sha256 = M.base64.b64encode(M.hashlib.sha256(CERT).digest()).decode() + + return sha1, sha256 \ No newline at end of file diff --git a/ApkPatcher/Patch/Pairip_CoreX.py b/ApkPatcher/Patch/Pairip_CoreX.py new file mode 100644 index 0000000..1cea4eb --- /dev/null +++ b/ApkPatcher/Patch/Pairip_CoreX.py @@ -0,0 +1,77 @@ +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + +from ApkPatcher.Utils.Files_Check import FileCheck + +F = FileCheck(); F.Set_Path() + + +# ---------------- Check CoreX ---------------- +def Check_CoreX(decompile_dir, isAPKEditor): + + Lib_CoreX = [] + + lib_paths = M.os.path.join(decompile_dir, + *( + ['root', 'lib', 'arm64-v8a'] if isAPKEditor else ['lib', 'arm64-v8a'] + ) + ) + + for target_file in ['lib_Pairip_CoreX.so', 'libFirebaseCppApp.so']: + + if M.os.path.isfile(M.os.path.join(lib_paths, target_file)): + + Lib_CoreX.append(f"{C.G}{target_file} ➸❥ {C.P}arm64-v8a") + + if Lib_CoreX: + print(f"{C.INFO}{C.C} Already Added {C.OG}➸❥ {f' {C.OG}& '.join(Lib_CoreX)} {C.G} ✔\n") + + return True + return False + + +# ---------------- HooK CoreX ---------------- +def Hook_Core(apk_path, decompile_dir, isAPKEditor, Package_Name): + + with M.zipfile.ZipFile(apk_path, 'r') as zf: + base_apk = "base.apk" if "base.apk" in zf.namelist() else f"{Package_Name}.apk" + + try: + if M.os.name == 'nt' and M.shutil.which("7z"): + M.subprocess.run(["7z", "e", apk_path, base_apk, "-y"], text=True, capture_output=True) + + with M.zipfile.ZipFile(apk_path) as zf: + zf.extract(base_apk) + + else: + if M.shutil.which("unzip"): + M.subprocess.run(["unzip", "-o", apk_path, base_apk], text=True, capture_output=True) + + with M.zipfile.ZipFile(apk_path) as zf: + zf.extract(base_apk) + + print(f'\n{C.S} Dump {C.E} {C.G}➸❥ {C.OG}{base_apk}\n') + + Dump_Apk = "libFirebaseCppApp.so" + + M.os.rename(base_apk, Dump_Apk) + + lib_paths = M.os.path.join(decompile_dir, + *( + ['root', 'lib', 'arm64-v8a'] if isAPKEditor else ['lib', 'arm64-v8a'] + ) + ) + + print(f"\n{C.S} Arch {C.E} {C.G}➸❥ arm64-v8a\n") + + M.shutil.move(Dump_Apk, lib_paths); M.shutil.copy(F.Pairip_CoreX, lib_paths); + + print( + f'\n{C.S} HooK {C.E} {C.G}➸❥ {C.OG}libFirebaseCppApp.so {C.G} ✔\n' + f'\n{C.S} HooK {C.E} {C.G}➸❥ {C.OG}lib_Pairip_CoreX.so {C.G} ✔\n' + ) + + return True + + except Exception as e: + print(f"\n{C.ERROR} {e} ✘") \ No newline at end of file diff --git a/ApkPatcher/Patch/Pine_Hook.py b/ApkPatcher/Patch/Pine_Hook.py new file mode 100644 index 0000000..b2b645d --- /dev/null +++ b/ApkPatcher/Patch/Pine_Hook.py @@ -0,0 +1,63 @@ +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + +from ApkPatcher.Utils.Files_Check import FileCheck + +F = FileCheck(); F.Set_Path() + + +# ---------------- Pine Hook Patch ---------------- +def Pine_Hook_Patch(decompile_dir, isAPKEditor, isModules, isDex): + + print(f"{C.X}{C.C} Pine HooK, {C.OG}🇮🇳 AbhiTheM0dder 🇮🇳 {C.PN}& {C.OG}残页 {C.P}(canyie)\n") + + Target_Path = M.os.path.join(decompile_dir, + *( + ['root', 'hook'] if isAPKEditor else ['unknown', 'hook'] + ) + ) + + Dex_Path = M.os.path.join(decompile_dir, + *( + ['dex'] if isAPKEditor else [] + ) + ) + + # ---------------- Hook dexloader ---------------- + Loader_Dex = M.os.path.join(Dex_Path, isDex) + + M.shutil.copy(F.loader, Loader_Dex) + + print(f'\n{C.S} Loader {C.E} {C.G}➸❥ {C.OG}{isDex} {C.G} ✔\n') + + + # ---------------- Hook library ---------------- + if not M.os.path.exists(Target_Path): + M.os.makedirs(Target_Path) + + print(f'\n{C.S} Target Path {C.E} {C.G}➸❥ hook\n') + + for Target_Files in [F.config, F.libpine32, F.libpine64]: + + M.shutil.copy(Target_Files, Target_Path) + + print(f'\n{C.S} HooK {C.E} {C.G}➸❥ {C.OG}{M.os.path.basename(Target_Files)} {C.G} ✔\n') + + + # ---------------- isModules ---------------- + if isModules: + + Modules_Path = M.os.path.join(Target_Path, 'modules') + + if not M.os.path.exists(Modules_Path): + M.os.makedirs(Modules_Path) + + print(f"\n{C.S} Modules Path {C.E} {C.G}➸❥ hook/modules\n") + + Module_List = isModules if isinstance(isModules, (list, tuple)) else [isModules] + + for Modules in Module_List: + if M.os.path.exists(Modules): + M.shutil.copy(Modules, Modules_Path) + + print(f'\n{C.S} Module {C.E} {C.G}➸❥ {C.OG}{M.os.path.basename(Modules)} {C.G} ✔\n') \ No newline at end of file diff --git a/ApkPatcher/Patch/Random_INFO.py b/ApkPatcher/Patch/Random_INFO.py new file mode 100644 index 0000000..3dad2dc --- /dev/null +++ b/ApkPatcher/Patch/Random_INFO.py @@ -0,0 +1,3616 @@ +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + + +# ---------------- Random Info ---------------- +class R_I: + + def __init__(self): + + self.device_info_list = [ + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "SM-G973F", + "PRODUCT": "beyond1lte", + "DEVICE": "beyond1", + "BOARD": "universal9820", + "HARDWARE": "exynos9820", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "G973FXXS9DUE3", + "SERIAL": "23HJ9G7TR8XQ", + "DISPLAY": "G973F_11.0.3.1234", + "HOST": "buildhost01", + "RADIO": "Exynos_LTE", + "RADIO_VERSION": "E973FGH345", + "FINGERPRINT": "Samsung/SM-G973F/beyond1lte:11/RP1A.200720.012/G973FXXS9DUE3:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Redmi", + "MODEL": "M2101K7AI", + "PRODUCT": "mojito_in", + "DEVICE": "mojito", + "BOARD": "sdm732", + "HARDWARE": "qcom", + "ID": "RKQ1.211103.002", + "Android_Version": "12", + "BOOTLOADER": "02022323_mjto1_in", + "SERIAL": "XMAI9901123", + "DISPLAY": "Redmi_12.5.6_Stable", + "HOST": "build_xiaomi_server", + "RADIO": "SDX55_5G", + "RADIO_VERSION": "QVCN012344", + "FINGERPRINT": "Redmi/M2101K7AI/mojito_in:12/RKQ1.211103.002/Stable1234:user/release-keys" + }, + { + "MANUFACTURER": "Google", + "BRAND": "Google", + "MODEL": "Pixel 6", + "PRODUCT": "raven", + "DEVICE": "raven", + "BOARD": "gs101", + "HARDWARE": "tensor", + "ID": "SP2A.220505.002", + "Android_Version": "13", + "BOOTLOADER": "4110R0R0.1201", + "SERIAL": "GGLX20233011", + "DISPLAY": "Pixel_6_13.0.1_Raven", + "HOST": "google_cloud_13", + "RADIO": "Tensor_LTE_5G", + "RADIO_VERSION": "RV600_12034_Stable", + "FINGERPRINT": "Google/Pixel6/raven:13/SP2A.220505.002/Raven1203:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "IN2023", + "PRODUCT": "OnePlus8Pro", + "DEVICE": "instantnoodle", + "BOARD": "kona", + "HARDWARE": "qcom", + "ID": "IN2023_14.5.0", + "Android_Version": "13", + "BOOTLOADER": "IN2023_1505_Stable", + "SERIAL": "OP8820237744", + "DISPLAY": "IN2023_14.5.0_Stable", + "HOST": "buildserver_oppo", + "RADIO": "Qualcomm_X55_5G", + "RADIO_VERSION": "X555G2345IN2023", + "FINGERPRINT": "OnePlus/IN2023/instantnoodle:13/IN2023_14.5.0/K.5a75b18-40234/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "V2025", + "PRODUCT": "vivo_y70", + "DEVICE": "Y70T2025", + "BOARD": "mt6765", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "V2025_3.5.1_LTS", + "SERIAL": "VVV102548774X", + "DISPLAY": "Vivo_Y70_11.0.6.8", + "HOST": "vivo_buildserver", + "RADIO": "MT6765_LTE", + "RADIO_VERSION": "MT6765_4556L", + "FINGERPRINT": "Vivo/V2025/vivo_y70:11/RP1A.200720.012/Build344:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "RMX3381", + "PRODUCT": "RealmeGTNeo2", + "DEVICE": "neo2", + "BOARD": "sm8250", + "HARDWARE": "qcom", + "ID": "RMX3381_12.1.0.140", + "Android_Version": "12", + "BOOTLOADER": "RMX3381_1201_Stable", + "SERIAL": "RMTX778999345", + "DISPLAY": "RMX3381_12.1.140_EX", + "HOST": "build_realme_server", + "RADIO": "X50_ProModem", + "RADIO_VERSION": "RQ_12034_Stable", + "FINGERPRINT": "Realme/RMX3381/RealmeGTNeo2:12/RMX3381_12.1.0.140/K.5a75b18-4234/release-keys" + }, + { + "MANUFACTURER": "Motorola", + "BRAND": "Moto", + "MODEL": "XT2201-1", + "PRODUCT": "Edge30Pro", + "DEVICE": "ranger", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "TP1A.220905.004", + "Android_Version": "13", + "BOOTLOADER": "XT2201-4_T13_Official", + "SERIAL": "MOTX1234489933", + "DISPLAY": "XT2201_13.0.2", + "HOST": "motorola_build_center", + "RADIO": "Moto_LTE_5G", + "RADIO_VERSION": "Moto_3456XT20", + "FINGERPRINT": "Motorola/XT2201-1/Edge30Pro:13/TP1A.220905.004/K.5a75b18-45234/release-keys" + }, + { + "MANUFACTURER": "Sony", + "BRAND": "Xperia", + "MODEL": "XQ-BC62", + "PRODUCT": "Xperia1III", + "DEVICE": "XQBC", + "BOARD": "qcom", + "HARDWARE": "Snapdragon888", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "XQBCX_3.8.9_Official", + "SERIAL": "SN12345678123", + "DISPLAY": "Xperia1III_12.5.1", + "HOST": "sony_global_host", + "RADIO": "Snapdragon_LTE", + "RADIO_VERSION": "SND8884_30054", + "FINGERPRINT": "Sony/XQ-BC62/Xperia1III:12/SP1A.210812.016/K.5a95b18-45234/release-keys" + }, + { + "MANUFACTURER": "LG", + "BRAND": "LG", + "MODEL": "LM-G910", + "PRODUCT": "LGV60ThinQ5G", + "DEVICE": "LG-G910", + "BOARD": "QSC9871", + "HARDWARE": "qcom", + "ID": "QP1A.190711.020", + "Android_Version": "11", + "BOOTLOADER": "LM-G910_3.6.7", + "SERIAL": "LGVV123459993", + "DISPLAY": "LGV60_11.3.9_LTS", + "HOST": "lg_us_host", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "X60LG4459", + "FINGERPRINT": "LG/LM-G910/LG-V60:11/QP1A.190711.020/L.5a95b18-45234/release-keys" + }, + { + "MANUFACTURER": "ASUS", + "BRAND": "ASUS", + "MODEL": "ROG Phone 6", + "PRODUCT": "ROG6", + "DEVICE": "ASUS_I005D", + "BOARD": "sdm888+", + "HARDWARE": "qcom", + "ID": "SP2A.220405.003", + "Android_Version": "12", + "BOOTLOADER": "I005D_12.0.1_Stable", + "SERIAL": "AS1239994567", + "DISPLAY": "ROG6_12.1.0_Global", + "HOST": "asus_server_global", + "RADIO": "X65_LTE_5G", + "RADIO_VERSION": "QCM123456ASUS", + "FINGERPRINT": "ASUS/ROG6/ASUS_I005D:12/SP2A.220405.003/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Huawei", + "BRAND": "Huawei", + "MODEL": "P40 Pro", + "PRODUCT": "P40Pro", + "DEVICE": "HWANA", + "BOARD": "kirin990_5g", + "HARDWARE": "hisilicon", + "ID": "10.1.0.122", + "Android_Version": "10", + "BOOTLOADER": "HW_P40Pro_5.1.2", + "SERIAL": "HW12345678901", + "DISPLAY": "P40Pro_EMUI10.1", + "HOST": "huawei_global_build", + "RADIO": "Kirin_5GModem", + "RADIO_VERSION": "5G123HUAWEI", + "FINGERPRINT": "Huawei/P40Pro/HWANA:10/10.1.0.122/L.15c95b18-45234/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Realme", + "MODEL": "RMX3471", + "PRODUCT": "RealmeNarzo50", + "DEVICE": "RMX3471", + "BOARD": "mt6781", + "HARDWARE": "mediatek", + "ID": "RMX3471_11.0.6", + "Android_Version": "11", + "BOOTLOADER": "RMX3471_11.2.5", + "SERIAL": "RMZ1234567098", + "DISPLAY": "Narzo50_11.6_LTS", + "HOST": "oppo_build_server", + "RADIO": "MT5G_Modem", + "RADIO_VERSION": "MTK123REALME", + "FINGERPRINT": "Oppo/RMX3471/RealmeNarzo50:11/RMX3471_11.0.6/L.15c96b18-45234/release-keys" + }, + { + "MANUFACTURER": "Lenovo", + "BRAND": "Motorola", + "MODEL": "XT2125", + "PRODUCT": "MotoGPower2022", + "DEVICE": "CapriPlus", + "BOARD": "MT6739", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.010", + "Android_Version": "11", + "BOOTLOADER": "XT2125_11.5.1", + "SERIAL": "MOT12345678G9", + "DISPLAY": "MotoG_2022_LTS", + "HOST": "motorola_host_global", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTKCAPRI_MOTOROLA", + "FINGERPRINT": "Motorola/XT2125/MotoGPower2022:11/RP1A.200720.010/L.15c96b18-45234/release-keys" + }, + { + "MANUFACTURER": "Honor", + "BRAND": "Honor", + "MODEL": "HRY-LX2", + "PRODUCT": "Honor9XLite", + "DEVICE": "HRYLX", + "BOARD": "kirin710", + "HARDWARE": "hisilicon", + "ID": "9.1.0.330", + "Android_Version": "9", + "BOOTLOADER": "HRY-LX2_BKL", + "SERIAL": "HN9876543219", + "DISPLAY": "Honor9X_EMUI9.1", + "HOST": "honor_build_server", + "RADIO": "Kirin710_4GModem", + "RADIO_VERSION": "HISI123456HONOR", + "FINGERPRINT": "Honor/HRY-LX2/Honor9XLite:9/9.1.0.330/L.15c96b18-45134/release-keys" + }, + { + "MANUFACTURER": "ZTE", + "BRAND": "Nubia", + "MODEL": "NX669J", + "PRODUCT": "RedMagic6SPro", + "DEVICE": "NX669", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "NX669_12.0.3", + "SERIAL": "ZTE0001239999", + "DISPLAY": "RedMagic6_Pro_12", + "HOST": "zte_global_build", + "RADIO": "Snapdragon_LTE5G", + "RADIO_VERSION": "SDM123REDMAGIC", + "FINGERPRINT": "ZTE/NX669J/RedMagic6SPro:12/SP1A.210812.016/L.15c96b18-78134/release-keys" + }, + { + "MANUFACTURER": "HTC", + "BRAND": "HTC", + "MODEL": "2Q9S100", + "PRODUCT": "HTC_U20", + "DEVICE": "HTCU20", + "BOARD": "mt6853", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.011", + "Android_Version": "11", + "BOOTLOADER": "HTC_2Q9S_1102", + "SERIAL": "HTC5671234001", + "DISPLAY": "HTC_U20_5G", + "HOST": "htc_dev_server", + "RADIO": "MT6853_Modem", + "RADIO_VERSION": "MTKM123HTC5G", + "FINGERPRINT": "HTC/2Q9S100/HTCU20:11/RP1A.200720.011/L.15c96b19-78134/release-keys" + }, + { + "MANUFACTURER": "Nokia", + "BRAND": "Nokia", + "MODEL": "TA-1357", + "PRODUCT": "NokiaC30", + "DEVICE": "Magnetar", + "BOARD": "SC9863A", + "HARDWARE": "unisoc", + "ID": "RP1A.200720.010", + "Android_Version": "11", + "BOOTLOADER": "TA-1357_LTS", + "SERIAL": "NKC1357891230", + "DISPLAY": "NokiaC30_11.0.1", + "HOST": "nokia_build_server", + "RADIO": "UNISOC_LTE", + "RADIO_VERSION": "UNSC986NOKIA", + "FINGERPRINT": "Nokia/TA-1357/NokiaC30:11/RP1A.200720.010/Stable:user/release-keys" + }, + { + "MANUFACTURER": "TCL", + "BRAND": "Alcatel", + "MODEL": "9021G", + "PRODUCT": "Alcatel1SE", + "DEVICE": "1SE2020", + "BOARD": "mt6762", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.013", + "Android_Version": "10", + "BOOTLOADER": "9021G_10.1.0", + "SERIAL": "TCL1230009981", + "DISPLAY": "Alcatel_1SE_10", + "HOST": "alcatel_server_build", + "RADIO": "MTK_LTE4G", + "RADIO_VERSION": "MTKM1234ALCATEL", + "FINGERPRINT": "TCL/9021G/Alcatel1SE:10/RP1A.200720.013/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "V2151", + "PRODUCT": "Vivo_Y33s", + "DEVICE": "Vivo_Y33s", + "BOARD": "mt6769v", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "Vivo_V2151_1205", + "SERIAL": "VV9987123004", + "DISPLAY": "Vivo_Y33s_12.5_LTS", + "HOST": "vivo_global_server", + "RADIO": "MTK5G_LTE", + "RADIO_VERSION": "MTKM1234VIVO", + "FINGERPRINT": "Vivo/V2151/Vivo_Y33s:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Xiaomi", + "MODEL": "MI 11X", + "PRODUCT": "aliothin", + "DEVICE": "alioth", + "BOARD": "SM8250", + "HARDWARE": "qcom", + "ID": "RP1A.200720.010", + "Android_Version": "11", + "BOOTLOADER": "alioth_11.0.3", + "SERIAL": "XIAO1234567890", + "DISPLAY": "MI11X_11.0.3", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55", + "FINGERPRINT": "Xiaomi/MI 11X/aliothin:11/RP1A.200720.010/Stable:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO 9", + "PRODUCT": "V2163A", + "DEVICE": "V2163", + "BOARD": "SM8350", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "iQOO_9_12.0.6", + "SERIAL": "IQ1234567890", + "DISPLAY": "iQOO9_12.0.6", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X65", + "RADIO_VERSION": "X65QCOM", + "FINGERPRINT": "iQOO/V2163A/iQOO 9:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy S22", + "PRODUCT": "s22_exynos", + "DEVICE": "s22", + "BOARD": "Exynos2200", + "HARDWARE": "exynos", + "ID": "SP1A.210812.016", + "IMEI": "351561161736307", + "Android_Version": "12", + "BOOTLOADER": "S22_12.0.4", + "SERIAL": "SAMSUNG12345", + "DISPLAY": "S22_12.0.4", + "HOST": "samsung_global_build", + "RADIO": "Exynos_5G", + "RADIO_VERSION": "Exynos_2200", + "FINGERPRINT": "Samsung/Galaxy S22/s22_exynos:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Google", + "BRAND": "Google", + "MODEL": "Pixel 7", + "PRODUCT": "panther", + "DEVICE": "panther", + "BOARD": "gs101", + "HARDWARE": "tensor", + "ID": "SP2A.220505.002", + "Android_Version": "13", + "BOOTLOADER": "panther_13.0.1", + "SERIAL": "GOOGLE987654321", + "DISPLAY": "Pixel7_13.0.1", + "HOST": "google_build_server", + "RADIO": "Tensor_5G", + "RADIO_VERSION": "Tensor_5G_01", + "FINGERPRINT": "Google/Pixel7/panther:13/SP2A.220505.002/Stable:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus 10 Pro", + "PRODUCT": "OnePlus10Pro", + "DEVICE": "instantly", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "OnePlus10Pro_12.1.0", + "SERIAL": "OP12345678910", + "DISPLAY": "OnePlus10Pro_12.1.0", + "HOST": "oneplus_build_server", + "RADIO": "X55_LTE_5G", + "RADIO_VERSION": "X55_QCOM_OnePlus", + "FINGERPRINT": "OnePlus/OnePlus 10 Pro/instantly:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Motorola", + "BRAND": "Motorola", + "MODEL": "Edge 20 Pro", + "PRODUCT": "MotorolaEdge20Pro", + "DEVICE": "motorola_edge", + "BOARD": "SM8250", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "Edge20Pro_11.0.5", + "SERIAL": "MOT1234567890", + "DISPLAY": "Edge20Pro_11.0.5", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X55_5G", + "RADIO_VERSION": "Moto_X55_Stable", + "FINGERPRINT": "Motorola/Edge 20 Pro/motorola_edge:11/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Nothing", + "BRAND": "Nothing", + "MODEL": "Phone 1", + "PRODUCT": "A065", + "DEVICE": "A065", + "BOARD": "SM8450", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "Nothing_12.0.4", + "SERIAL": "NO1234567890", + "DISPLAY": "Phone1_12.0.4", + "HOST": "nothing_global", + "RADIO": "Snapdragon_5G", + "RADIO_VERSION": "5G_Snapdragon", + "FINGERPRINT": "Nothing/Phone 1/A065:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme GT", + "PRODUCT": "RMX2202", + "DEVICE": "GT", + "BOARD": "sm8250", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "RMX2202_11.2.4", + "SERIAL": "RMX220212345", + "DISPLAY": "Realme_GT_11.2.4", + "HOST": "realme_build_server", + "RADIO": "X55_LTE_5G", + "RADIO_VERSION": "QCOM_X55", + "FINGERPRINT": "Realme/RMX2202/Realme GT:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "V21e", + "PRODUCT": "V21e", + "DEVICE": "Vivo_V21e", + "BOARD": "mt6769v", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.010", + "Android_Version": "11", + "BOOTLOADER": "V21e_11.2.0", + "SERIAL": "VV9876543210", + "DISPLAY": "Vivo_V21e_11.2.0", + "HOST": "vivo_build_server", + "RADIO": "MT6769_LTE", + "RADIO_VERSION": "MTK_LTE_VIVO", + "FINGERPRINT": "Vivo/V21e/Vivo_V21e:11/RP1A.200720.010/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "OPPO Reno 5", + "PRODUCT": "CPH2145", + "DEVICE": "Reno5", + "BOARD": "sm7125", + "HARDWARE": "qcom", + "ID": "SP2A.220505.002", + "Android_Version": "12", + "BOOTLOADER": "CPH2145_12.0.5", + "SERIAL": "OPPO987654321", + "DISPLAY": "OPPO_Reno5_12.0.5", + "HOST": "oppo_build_server", + "RADIO": "X55_LTE_5G", + "RADIO_VERSION": "QCOM_X55_OPPO", + "FINGERPRINT": "Oppo/CPH2145/Reno5:12/SP2A.220505.002/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Xiaomi", + "MODEL": "Redmi Note 10", + "PRODUCT": "mojito", + "DEVICE": "mojito", + "BOARD": "SM7150", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "mojito_11.0.5", + "SERIAL": "XM1234567890", + "DISPLAY": "RedmiNote10_11.0.5", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55", + "FINGERPRINT": "Xiaomi/Redmi Note 10/mojito:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO Z6", + "PRODUCT": "V2163A", + "DEVICE": "V2163", + "BOARD": "sm6150", + "HARDWARE": "qcom", + "ID": "RP1A.200720.011", + "Android_Version": "12", + "BOOTLOADER": "iQOO_Z6_12.0.4", + "SERIAL": "IQZ6123456789", + "DISPLAY": "iQOOZ6_12.0.4", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_iQOO", + "FINGERPRINT": "iQOO/V2163A/iQOO Z6:12/RP1A.200720.011/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy A52", + "PRODUCT": "a52", + "DEVICE": "a52", + "BOARD": "sm7150", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "A52_11.0.4", + "SERIAL": "SAMSUNG1234A52", + "DISPLAY": "GalaxyA52_11.0.4", + "HOST": "samsung_build_server", + "RADIO": "Exynos_5G", + "RADIO_VERSION": "Exynos_Exynos5", + "FINGERPRINT": "Samsung/Galaxy A52/a52:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Google", + "BRAND": "Google", + "MODEL": "Pixel 6", + "PRODUCT": "oriole", + "DEVICE": "oriole", + "BOARD": "gs101", + "HARDWARE": "tensor", + "ID": "SP2A.220505.002", + "Android_Version": "13", + "BOOTLOADER": "oriole_13.0.3", + "SERIAL": "GOOGLE654321098", + "DISPLAY": "Pixel6_13.0.3", + "HOST": "google_build_server", + "RADIO": "Tensor_5G", + "RADIO_VERSION": "Tensor_5G_02", + "FINGERPRINT": "Google/Pixel6/oriole:13/SP2A.220505.002/Stable:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus Nord CE 2", + "PRODUCT": "EBBA", + "DEVICE": "EBBA", + "BOARD": "sm6375", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "12", + "BOOTLOADER": "OnePlus_NordCE2_12.1.4", + "SERIAL": "OPCE1234567890", + "DISPLAY": "NordCE2_12.1.4", + "HOST": "oneplus_build_server", + "RADIO": "X60_LTE_5G", + "RADIO_VERSION": "OnePlus_X60", + "FINGERPRINT": "OnePlus/OnePlus Nord CE 2/EBBA:12/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Motorola", + "BRAND": "Motorola", + "MODEL": "Moto G60", + "PRODUCT": "potter", + "DEVICE": "potter", + "BOARD": "sm7150", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "Moto_G60_11.0.7", + "SERIAL": "MOTG12345678", + "DISPLAY": "MotoG60_11.0.7", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_Moto", + "FINGERPRINT": "Motorola/Moto G60/potter:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Nothing", + "BRAND": "Nothing", + "MODEL": "Phone 2", + "PRODUCT": "A076", + "DEVICE": "A076", + "BOARD": "SM8450", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "Nothing_12.1.0", + "SERIAL": "NO9876543210", + "DISPLAY": "Phone2_12.1.0", + "HOST": "nothing_build_server", + "RADIO": "Snapdragon_5G", + "RADIO_VERSION": "5G_Snapdragon2", + "FINGERPRINT": "Nothing/Phone 2/A076:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme Narzo 50 Pro", + "PRODUCT": "RMX3381", + "DEVICE": "RMX3381", + "BOARD": "mt6877", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "RMX3381_11.2.4", + "SERIAL": "RMX3381123456", + "DISPLAY": "Narzo50Pro_11.2.4", + "HOST": "realme_build_server", + "RADIO": "MTK_LTE_5G", + "RADIO_VERSION": "MTK_LTE_Realme", + "FINGERPRINT": "Realme/RMX3381/Realme Narzo 50 Pro:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "V23 5G", + "PRODUCT": "V2130", + "DEVICE": "V2130", + "BOARD": "mt6877", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "Vivo_V2130_12.0.1", + "SERIAL": "VV1234567890", + "DISPLAY": "VivoV23_12.0.1", + "HOST": "vivo_build_server", + "RADIO": "MTK_5G_LTE", + "RADIO_VERSION": "MTK_VIVO_LTE", + "FINGERPRINT": "Vivo/V2130/Vivo V23 5G:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo F19 Pro+", + "PRODUCT": "CPH2109", + "DEVICE": "F19Pro+", + "BOARD": "sm7250", + "HARDWARE": "qcom", + "ID": "SP2A.220505.002", + "Android_Version": "11", + "BOOTLOADER": "CPH2109_11.0.6", + "SERIAL": "OPF190123456", + "DISPLAY": "F19ProPlus_11.0.6", + "HOST": "oppo_build_server", + "RADIO": "X55_5G", + "RADIO_VERSION": "QCOM_X55_OPPO", + "FINGERPRINT": "Oppo/CPH2109/F19Pro+:11/SP2A.220505.002/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Xiaomi", + "MODEL": "Mi 10i", + "PRODUCT": "gauguin_in", + "DEVICE": "gauguin", + "BOARD": "sm7250", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "gauguin_in_11.0.9", + "SERIAL": "XM987654321", + "DISPLAY": "Mi10i_11.0.9", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_5G", + "RADIO_VERSION": "QCOM_X55_Xiaomi", + "FINGERPRINT": "Xiaomi/Mi 10i/gauguin_in:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO 7 Legend", + "PRODUCT": "V2171A", + "DEVICE": "V2171", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "12", + "BOOTLOADER": "iQOO_7_12.1.0", + "SERIAL": "IQ0000123456", + "DISPLAY": "iQOO7_12.1.0", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_iQOO", + "FINGERPRINT": "iQOO/V2171A/iQOO 7 Legend:12/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy A12", + "PRODUCT": "a12", + "DEVICE": "a12", + "BOARD": "Exynos850", + "HARDWARE": "exynos", + "ID": "RP1A.200720.010", + "Android_Version": "11", + "BOOTLOADER": "A12_11.1.2", + "SERIAL": "SAMSUNG12345A12", + "DISPLAY": "GalaxyA12_11.1.2", + "HOST": "samsung_build_server", + "RADIO": "Exynos_LTE", + "RADIO_VERSION": "Exynos_850", + "FINGERPRINT": "Samsung/Galaxy A12/a12:11/RP1A.200720.010/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Google", + "BRAND": "Google", + "MODEL": "Pixel 5", + "PRODUCT": "redfin", + "DEVICE": "redfin", + "BOARD": "gs101", + "HARDWARE": "tensor", + "ID": "SP2A.220505.002", + "Android_Version": "13", + "BOOTLOADER": "redfin_13.0.2", + "SERIAL": "GOOGLE1122334455", + "DISPLAY": "Pixel5_13.0.2", + "HOST": "google_build_server", + "RADIO": "Tensor_5G", + "RADIO_VERSION": "Tensor_5G_03", + "FINGERPRINT": "Google/Pixel5/redfin:13/SP2A.220505.002/Stable:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus 9", + "PRODUCT": "LE2111", + "DEVICE": "LE", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "OnePlus_9_12.1.3", + "SERIAL": "OP1234098765", + "DISPLAY": "OnePlus9_12.1.3", + "HOST": "oneplus_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_OnePlus", + "FINGERPRINT": "OnePlus/OnePlus 9/LE:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Motorola", + "BRAND": "Motorola", + "MODEL": "Moto Edge 30", + "PRODUCT": "sirocco", + "DEVICE": "sirocco", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "RP1A.200720.010", + "Android_Version": "12", + "BOOTLOADER": "Edge30_12.1.5", + "SERIAL": "MOTEDGE1234", + "DISPLAY": "MotoEdge30_12.1.5", + "HOST": "motorola_build_server", + "RADIO": "X60_LTE_5G", + "RADIO_VERSION": "QCOM_X60_Motorola", + "FINGERPRINT": "Motorola/Moto Edge 30/sirocco:12/RP1A.200720.010/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Nothing", + "BRAND": "Nothing", + "MODEL": "Phone 1", + "PRODUCT": "A065", + "DEVICE": "A065", + "BOARD": "SM8450", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "Nothing_12.0.4", + "SERIAL": "NO1234567890", + "DISPLAY": "Phone1_12.0.4", + "HOST": "nothing_build_server", + "RADIO": "Snapdragon_5G", + "RADIO_VERSION": "Snapdragon_5G_04", + "FINGERPRINT": "Nothing/Phone 1/A065:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme 8 Pro", + "PRODUCT": "RMX3081", + "DEVICE": "RMX3081", + "BOARD": "sm7125", + "HARDWARE": "qcom", + "ID": "RP1A.200720.011", + "Android_Version": "11", + "BOOTLOADER": "RMX3081_11.1.2", + "SERIAL": "RMX308112345", + "DISPLAY": "Realme8Pro_11.1.2", + "HOST": "realme_build_server", + "RADIO": "X55_5G", + "RADIO_VERSION": "QCOM_X55_Realme", + "FINGERPRINT": "Realme/RMX3081/Realme 8 Pro:11/RP1A.200720.011/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "V21", + "PRODUCT": "V2030", + "DEVICE": "V2030", + "BOARD": "mt6853", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "Vivo_V2030_11.2.3", + "SERIAL": "VV9876543210", + "DISPLAY": "VivoV21_11.2.3", + "HOST": "vivo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_VIVO", + "FINGERPRINT": "Vivo/V2030/Vivo V21:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo Reno 6", + "PRODUCT": "CPH2201", + "DEVICE": "Reno6", + "BOARD": "sm7250", + "HARDWARE": "qcom", + "ID": "SP2A.220505.002", + "Android_Version": "11", + "BOOTLOADER": "CPH2201_11.0.7", + "SERIAL": "OPPO220112345", + "DISPLAY": "Reno6_11.0.7", + "HOST": "oppo_build_server", + "RADIO": "X60_LTE_5G", + "RADIO_VERSION": "QCOM_X60_5G_OPPO", + "FINGERPRINT": "Oppo/CPH2201/Reno6:11/SP2A.220505.002/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Zero 8", + "PRODUCT": "X683", + "DEVICE": "X683", + "BOARD": "mt6785", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "10", + "BOOTLOADER": "X683_10.0.3", + "SERIAL": "INFINIX123456", + "DISPLAY": "Zero8_10.0.3", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE_5G", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X683/Zero 8:10/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO X3 Pro", + "PRODUCT": "Vayu", + "DEVICE": "Vayu", + "BOARD": "sm8150", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "POCO_X3Pro_11.0.10", + "SERIAL": "POCOX3123456789", + "DISPLAY": "POCOX3Pro_11.0.10", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_POCO", + "FINGERPRINT": "POCO/POCO X3 Pro/Vayu:11/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Honor", + "BRAND": "Honor", + "MODEL": "Honor 10X Lite", + "PRODUCT": "YAL-L21", + "DEVICE": "YAL", + "BOARD": "kirin710", + "HARDWARE": "huawei", + "ID": "SP1A.210812.016", + "Android_Version": "10", + "BOOTLOADER": "YAL-L21_10.0.3", + "SERIAL": "HONOR12345678", + "DISPLAY": "Honor10XLite_10.0.3", + "HOST": "honor_build_server", + "RADIO": "Kirin_LTE", + "RADIO_VERSION": "Kirin710_Honor", + "FINGERPRINT": "Honor/YAL-L21/Honor 10X Lite:10/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Tecno", + "BRAND": "Tecno", + "MODEL": "Tecno Camon 16", + "PRODUCT": "CG7", + "DEVICE": "CG7", + "BOARD": "mt6768", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.011", + "Android_Version": "10", + "BOOTLOADER": "Tecno_Camon16_10.0.4", + "SERIAL": "TECNO123456", + "DISPLAY": "TecnoCamon16_10.0.4", + "HOST": "tecno_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Tecno", + "FINGERPRINT": "Tecno/CG7/Tecno Camon 16:10/RP1A.200720.011/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Xiaomi", + "MODEL": "Mi 11X", + "PRODUCT": "Alioth", + "DEVICE": "alioth", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "alioth_11.0.9", + "SERIAL": "XM9876543210", + "DISPLAY": "Mi11X_11.0.9", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_5G", + "RADIO_VERSION": "QCOM_X55_Xiaomi", + "FINGERPRINT": "Xiaomi/Mi 11X/alioth:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO Z7", + "PRODUCT": "V2235A", + "DEVICE": "V2235", + "BOARD": "sm6375", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "12", + "BOOTLOADER": "iQOO_Z7_12.0.1", + "SERIAL": "IQZ7123456789", + "DISPLAY": "iQOOZ7_12.0.1", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_iQOO", + "FINGERPRINT": "iQOO/V2235A/iQOO Z7:12/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy S21", + "PRODUCT": "S21", + "DEVICE": "S21", + "BOARD": "Exynos2100", + "HARDWARE": "exynos", + "ID": "RP1A.200720.010", + "IMEI": "350336267465478", + "Android_Version": "12", + "BOOTLOADER": "GalaxyS21_12.1.2", + "SERIAL": "SAMSUNG12345S21", + "DISPLAY": "GalaxyS21_12.1.2", + "HOST": "samsung_build_server", + "RADIO": "Exynos_LTE_5G", + "RADIO_VERSION": "Exynos_2100", + "FINGERPRINT": "Samsung/Galaxy S21/S21:12/RP1A.200720.010/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Google", + "BRAND": "Google", + "MODEL": "Pixel 6a", + "PRODUCT": "Bluejay", + "DEVICE": "bluejay", + "BOARD": "gs101", + "HARDWARE": "tensor", + "ID": "SP2A.220505.002", + "Android_Version": "13", + "BOOTLOADER": "bluejay_13.0.3", + "SERIAL": "GOOGLE23456789", + "DISPLAY": "Pixel6a_13.0.3", + "HOST": "google_build_server", + "RADIO": "Tensor_5G", + "RADIO_VERSION": "Tensor_5G_02", + "FINGERPRINT": "Google/Pixel6a/bluejay:13/SP2A.220505.002/Stable:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus 10 Pro", + "PRODUCT": "LE2121", + "DEVICE": "LE2121", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "OnePlus_10Pro_12.1.0", + "SERIAL": "OP1012345678", + "DISPLAY": "OnePlus10Pro_12.1.0", + "HOST": "oneplus_build_server", + "RADIO": "X60_5G", + "RADIO_VERSION": "QCOM_X60_OnePlus", + "FINGERPRINT": "OnePlus/OnePlus 10 Pro/LE2121:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Motorola", + "BRAND": "Motorola", + "MODEL": "Moto G Power (2022)", + "PRODUCT": "hale", + "DEVICE": "hale", + "BOARD": "sm7225", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "Moto_GPower_11.0.8", + "SERIAL": "MOTGPower1234", + "DISPLAY": "MotoGPower2022_11.0.8", + "HOST": "motorola_build_server", + "RADIO": "X60_5G", + "RADIO_VERSION": "QCOM_X60_Motorola", + "FINGERPRINT": "Motorola/Moto G Power 2022/hale:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Nothing", + "BRAND": "Nothing", + "MODEL": "Nothing Phone 2", + "PRODUCT": "A076", + "DEVICE": "A076", + "BOARD": "SM8450", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "Nothing_12.1.0", + "SERIAL": "NO876543210", + "DISPLAY": "NothingPhone2_12.1.0", + "HOST": "nothing_build_server", + "RADIO": "Snapdragon_5G", + "RADIO_VERSION": "Snapdragon_5G_04", + "FINGERPRINT": "Nothing/Phone 2/A076:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme Narzo 30 Pro", + "PRODUCT": "RMX2161", + "DEVICE": "RMX2161", + "BOARD": "sm7150", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "RMX2161_10.0.3", + "SERIAL": "RMX2161N123", + "DISPLAY": "Narzo30Pro_10.0.3", + "HOST": "realme_build_server", + "RADIO": "X55_LTE_5G", + "RADIO_VERSION": "QCOM_X55_Realme", + "FINGERPRINT": "Realme/RMX2161/Realme Narzo 30 Pro:10/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "Vivo Y20", + "PRODUCT": "V2026", + "DEVICE": "V2026", + "BOARD": "mt6765", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "10", + "BOOTLOADER": "Vivo_V2026_10.0.3", + "SERIAL": "VV123456789", + "DISPLAY": "VivoY20_10.0.3", + "HOST": "vivo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_VIVO", + "FINGERPRINT": "Vivo/V2026/Vivo Y20:10/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo A15", + "PRODUCT": "CPH2185", + "DEVICE": "A15", + "BOARD": "mt6765", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "10", + "BOOTLOADER": "CPH2185_10.0.3", + "SERIAL": "OPPOA15123456", + "DISPLAY": "OppoA15_10.0.3", + "HOST": "oppo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_OPPO", + "FINGERPRINT": "Oppo/CPH2185/Oppo A15:10/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Infinix Note 10", + "PRODUCT": "X695", + "DEVICE": "X695", + "BOARD": "mt6769", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "X695_11.0.1", + "SERIAL": "INFINIX12345678", + "DISPLAY": "InfinixNote10_11.0.1", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE_5G", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X695/Infinix Note 10:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO M3", + "PRODUCT": "Lemongrab", + "DEVICE": "Lemongrab", + "BOARD": "sm6115", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "POCO_M3_10.0.2", + "SERIAL": "POCO123456M3", + "DISPLAY": "POCO_M3_10.0.2", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X11", + "RADIO_VERSION": "QCOM_X11_POCO", + "FINGERPRINT": "POCO/POCO M3/Lemongrab:10/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Honor", + "BRAND": "Honor", + "MODEL": "Honor 30 Pro", + "PRODUCT": "NOH-NX9", + "DEVICE": "NOH", + "BOARD": "kirin990", + "HARDWARE": "huawei", + "ID": "SP1A.210812.016", + "Android_Version": "10", + "BOOTLOADER": "NOH-NX9_10.0.0", + "SERIAL": "HONOR23456789", + "DISPLAY": "Honor30Pro_10.0.0", + "HOST": "honor_build_server", + "RADIO": "Kirin_LTE", + "RADIO_VERSION": "Kirin990_Honor", + "FINGERPRINT": "Honor/NOH-NX9/Honor 30 Pro:10/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Tecno", + "BRAND": "Tecno", + "MODEL": "Tecno Spark 7", + "PRODUCT": "KE5", + "DEVICE": "KE5", + "BOARD": "mt6765", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.011", + "Android_Version": "11", + "BOOTLOADER": "Tecno_Spark7_11.0.0", + "SERIAL": "TECNO234567", + "DISPLAY": "TecnoSpark7_11.0.0", + "HOST": "tecno_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Tecno", + "FINGERPRINT": "Tecno/KE5/Tecno Spark 7:11/RP1A.200720.011/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Xiaomi", + "MODEL": "Redmi Note 10", + "PRODUCT": "Mojito", + "DEVICE": "mojito", + "BOARD": "sm6150", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "mojito_11.0.9", + "SERIAL": "XM987654321", + "DISPLAY": "RedmiNote10_11.0.9", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_X12", + "RADIO_VERSION": "QCOM_X12_Xiaomi", + "FINGERPRINT": "Xiaomi/Redmi Note 10/Mojito:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO 7", + "PRODUCT": "PD2056", + "DEVICE": "PD2056", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "iQOO_7_11.1.2", + "SERIAL": "IQ70123456", + "DISPLAY": "iQOO7_11.1.2", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_iQOO", + "FINGERPRINT": "iQOO/PD2056/iQOO 7:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy A32", + "PRODUCT": "A32", + "DEVICE": "A32", + "BOARD": "exynos850", + "HARDWARE": "exynos", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "GalaxyA32_11.0.3", + "SERIAL": "SAMSUNG1234567A32", + "DISPLAY": "GalaxyA32_11.0.3", + "HOST": "samsung_build_server", + "RADIO": "Exynos_5G", + "RADIO_VERSION": "Exynos_850", + "FINGERPRINT": "Samsung/Galaxy A32/A32:11/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Google", + "BRAND": "Google", + "MODEL": "Pixel 6", + "PRODUCT": "Oriole", + "DEVICE": "oriole", + "BOARD": "gs101", + "HARDWARE": "tensor", + "ID": "SP2A.220505.002", + "Android_Version": "13", + "BOOTLOADER": "oriole_13.0.2", + "SERIAL": "GOOGLE98765432", + "DISPLAY": "Pixel6_13.0.2", + "HOST": "google_build_server", + "RADIO": "Tensor_5G", + "RADIO_VERSION": "Tensor_5G_03", + "FINGERPRINT": "Google/Pixel6/oriole:13/SP2A.220505.002/Stable:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus 9 Pro", + "PRODUCT": "LE2123", + "DEVICE": "LE2123", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "OnePlus_9Pro_12.1.0", + "SERIAL": "OP991234567", + "DISPLAY": "OnePlus9Pro_12.1.0", + "HOST": "oneplus_build_server", + "RADIO": "X60_5G", + "RADIO_VERSION": "QCOM_X60_OnePlus", + "FINGERPRINT": "OnePlus/OnePlus 9 Pro/LE2123:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Motorola", + "BRAND": "Motorola", + "MODEL": "Moto Edge 20", + "PRODUCT": "Edge 20", + "DEVICE": "Edge20", + "BOARD": "sm7250", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "Moto_Edge_20_11.0.2", + "SERIAL": "MOTEdge2021234", + "DISPLAY": "MotoEdge20_11.0.2", + "HOST": "motorola_build_server", + "RADIO": "X60_5G", + "RADIO_VERSION": "QCOM_X60_Motorola", + "FINGERPRINT": "Motorola/Moto Edge 20/Edge20:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Nothing", + "BRAND": "Nothing", + "MODEL": "Nothing Phone 1", + "PRODUCT": "A063", + "DEVICE": "A063", + "BOARD": "SM8450", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "Nothing_12.0.5", + "SERIAL": "NO123456789", + "DISPLAY": "NothingPhone1_12.0.5", + "HOST": "nothing_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Nothing", + "FINGERPRINT": "Nothing/Phone1/A063:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme GT 5G", + "PRODUCT": "RMX2202", + "DEVICE": "RMX2202", + "BOARD": "sm8250", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "RMX2202_11.0.4", + "SERIAL": "RMX2202GT1234", + "DISPLAY": "RealmeGT5G_11.0.4", + "HOST": "realme_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_Realme", + "FINGERPRINT": "Realme/RMX2202/Realme GT 5G:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "Vivo V21", + "PRODUCT": "V2101", + "DEVICE": "V2101", + "BOARD": "mt6853", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "Vivo_V2101_11.0.1", + "SERIAL": "VV987654321", + "DISPLAY": "VivoV21_11.0.1", + "HOST": "vivo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_VIVO", + "FINGERPRINT": "Vivo/V2101/Vivo V21:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo F19 Pro+", + "PRODUCT": "CPH2219", + "DEVICE": "F19ProPlus", + "BOARD": "mt6877", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "Oppo_F19ProPlus_11.0.1", + "SERIAL": "OPPOF1923456", + "DISPLAY": "OppoF19ProPlus_11.0.1", + "HOST": "oppo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_OPPO", + "FINGERPRINT": "Oppo/CPH2219/Oppo F19 Pro+:11/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Infinix Zero 5G", + "PRODUCT": "X6815", + "DEVICE": "X6815", + "BOARD": "mt6877", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "X6815_11.0.2", + "SERIAL": "INFINIX87654321", + "DISPLAY": "Zero5G_11.0.2", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE_5G", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X6815/Infinix Zero 5G:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO X4 Pro", + "PRODUCT": "2201116PG", + "DEVICE": "2201116PG", + "BOARD": "sm7150", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "POCO_X4_11.0.1", + "SERIAL": "POCOX4Pro1234", + "DISPLAY": "POCOX4Pro_11.0.1", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_POCO", + "FINGERPRINT": "POCO/POCO X4 Pro/2201116PG:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Infinix Zero 8", + "PRODUCT": "X688C", + "DEVICE": "X688C", + "BOARD": "mt6785", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "10", + "BOOTLOADER": "X688C_10.0.0", + "SERIAL": "INFINIX123456", + "DISPLAY": "Zero8_10.0.0", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X688C/Infinix Zero 8:10/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO F2 Pro", + "PRODUCT": "Everest", + "DEVICE": "Everest", + "BOARD": "sm8250", + "HARDWARE": "qcom", + "ID": "SP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "POCO_F2Pro_11.0.1", + "SERIAL": "POCOF212345", + "DISPLAY": "POCOF2Pro_11.0.1", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_POCO", + "FINGERPRINT": "POCO/POCO F2 Pro/Everest:11/SP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Honor", + "BRAND": "Honor", + "MODEL": "Honor 9X", + "PRODUCT": "HRY-AL00", + "DEVICE": "HRY", + "BOARD": "kirin710", + "HARDWARE": "huawei", + "ID": "SP1A.210812.016", + "Android_Version": "9", + "BOOTLOADER": "HRY-AL00_9.1.0", + "SERIAL": "HONOR987654", + "DISPLAY": "Honor9X_9.1.0", + "HOST": "honor_build_server", + "RADIO": "Kirin_LTE", + "RADIO_VERSION": "Kirin710_Honor", + "FINGERPRINT": "Honor/HRY-AL00/Honor 9X:9/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Tecno", + "BRAND": "Tecno", + "MODEL": "Tecno Camon 17", + "PRODUCT": "KE7", + "DEVICE": "KE7", + "BOARD": "mt6769", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "TecnoCamon17_11.0.0", + "SERIAL": "TECNO12345", + "DISPLAY": "TecnoCamon17_11.0.0", + "HOST": "tecno_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Tecno", + "FINGERPRINT": "Tecno/KE7/Tecno Camon 17:11/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Xiaomi", + "MODEL": "Redmi Note 9 Pro", + "PRODUCT": "Curtana", + "DEVICE": "Curtana", + "BOARD": "sm7125", + "HARDWARE": "qcom", + "ID": "SP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "RedmiNote9Pro_11.0.6", + "SERIAL": "XM123456789", + "DISPLAY": "RedmiNote9Pro_11.0.6", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_X11", + "RADIO_VERSION": "QCOM_X11_Xiaomi", + "FINGERPRINT": "Xiaomi/Redmi Note 9 Pro/Curtana:11/SP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO Z3", + "PRODUCT": "V2124A", + "DEVICE": "V2124A", + "BOARD": "sm7250", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "iQOOZ3_11.0.1", + "SERIAL": "IQO01234567", + "DISPLAY": "iQOOZ3_11.0.1", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_iQOO", + "FINGERPRINT": "iQOO/V2124A/iQOO Z3:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy M32", + "PRODUCT": "SM-M325F", + "DEVICE": "SM-M325F", + "BOARD": "exynos9611", + "HARDWARE": "exynos", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "GalaxyM32_11.0.4", + "SERIAL": "SAMSUNG987654", + "DISPLAY": "GalaxyM32_11.0.4", + "HOST": "samsung_build_server", + "RADIO": "Exynos_LTE", + "RADIO_VERSION": "Exynos_9611", + "FINGERPRINT": "Samsung/Galaxy M32/SM-M325F:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Google", + "BRAND": "Google", + "MODEL": "Pixel 5", + "PRODUCT": "Redfin", + "DEVICE": "redfin", + "BOARD": "qcom", + "HARDWARE": "google", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "Pixel5_11.0.1", + "SERIAL": "GOOGLE12345", + "DISPLAY": "Pixel5_11.0.1", + "HOST": "google_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_Google", + "FINGERPRINT": "Google/Pixel5/redfin:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus Nord 2", + "PRODUCT": "AC2003", + "DEVICE": "AC2003", + "BOARD": "mt6893", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "OnePlusNord2_11.0.2", + "SERIAL": "OP1234567890", + "DISPLAY": "OnePlusNord2_11.0.2", + "HOST": "oneplus_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_OnePlus", + "FINGERPRINT": "OnePlus/OnePlus Nord 2/AC2003:11/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Motorola", + "BRAND": "Motorola", + "MODEL": "Moto G60", + "PRODUCT": "corn", + "DEVICE": "corn", + "BOARD": "sm7150", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "MotoG60_11.0.1", + "SERIAL": "MOTG6012345", + "DISPLAY": "MotoG60_11.0.1", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X11", + "RADIO_VERSION": "QCOM_X11_Motorola", + "FINGERPRINT": "Motorola/Moto G60/corn:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Nothing", + "BRAND": "Nothing", + "MODEL": "Nothing Phone 2", + "PRODUCT": "A066", + "DEVICE": "A066", + "BOARD": "SM8450", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "13", + "BOOTLOADER": "NothingPhone2_13.0.2", + "SERIAL": "NOTHING987654", + "DISPLAY": "NothingPhone2_13.0.2", + "HOST": "nothing_build_server", + "RADIO": "Snapdragon_X65", + "RADIO_VERSION": "QCOM_X65_Nothing", + "FINGERPRINT": "Nothing/Phone2/A066:13/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme 7 Pro", + "PRODUCT": "RMX2170", + "DEVICE": "RMX2170", + "BOARD": "sm7125", + "HARDWARE": "qcom", + "ID": "SP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "RMX2170_10.0.0", + "SERIAL": "RMX21701234", + "DISPLAY": "Realme7Pro_10.0.0", + "HOST": "realme_build_server", + "RADIO": "Snapdragon_X11", + "RADIO_VERSION": "QCOM_X11_Realme", + "FINGERPRINT": "Realme/RMX2170/Realme 7 Pro:10/SP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "Vivo V21e", + "PRODUCT": "V2050", + "DEVICE": "V2050", + "BOARD": "mt6769", + "HARDWARE": "mediatek", + "ID": "SP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "Vivo_V2050_11.0.0", + "SERIAL": "VV987654321", + "DISPLAY": "VivoV21e_11.0.0", + "HOST": "vivo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_VIVO", + "FINGERPRINT": "Vivo/V2050/Vivo V21e:11/SP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo Reno 5 Pro", + "PRODUCT": "CPH2201", + "DEVICE": "Reno5Pro", + "BOARD": "mt6877", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "OppoReno5Pro_11.0.4", + "SERIAL": "OPPO9876543", + "DISPLAY": "OppoReno5Pro_11.0.4", + "HOST": "oppo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_OPPO", + "FINGERPRINT": "Oppo/CPH2201/Oppo Reno 5 Pro:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Infinix Smart 5", + "PRODUCT": "X657", + "DEVICE": "X657", + "BOARD": "mt6761", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "10", + "BOOTLOADER": "InfinixSmart5_10.0.0", + "SERIAL": "INFINIX7654321", + "DISPLAY": "InfinixSmart5_10.0.0", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X657/Infinix Smart 5:10/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO M2 Pro", + "PRODUCT": "Salta", + "DEVICE": "Salta", + "BOARD": "sm7125", + "HARDWARE": "qcom", + "ID": "SP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "POCO_M2Pro_10.0.4", + "SERIAL": "POCO1234567890", + "DISPLAY": "POCO_M2Pro_10.0.4", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X11", + "RADIO_VERSION": "QCOM_X11_POCO", + "FINGERPRINT": "POCO/POCO M2 Pro/Salta:10/SP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme X7", + "PRODUCT": "RMX3092", + "DEVICE": "RMX3092", + "BOARD": "mt6877", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "RealmeX7_10.0.1", + "SERIAL": "RMX987654321", + "DISPLAY": "RealmeX7_10.0.1", + "HOST": "realme_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Realme", + "FINGERPRINT": "Realme/RMX3092/Realme X7:10/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "Vivo V20", + "PRODUCT": "V2026", + "DEVICE": "V2026", + "BOARD": "sd720g", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "Vivo_V2026_11.0.0", + "SERIAL": "VV123456789", + "DISPLAY": "VivoV20_11.0.0", + "HOST": "vivo_build_server", + "RADIO": "Snapdragon_X12", + "RADIO_VERSION": "QCOM_X12_VIVO", + "FINGERPRINT": "Vivo/V2026/Vivo V20:11/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo F19 Pro", + "PRODUCT": "CPH2109", + "DEVICE": "CPH2109", + "BOARD": "mt6779", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "OppoF19Pro_11.0.3", + "SERIAL": "OPPO12345678", + "DISPLAY": "OppoF19Pro_11.0.3", + "HOST": "oppo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_OPPO", + "FINGERPRINT": "Oppo/CPH2109/Oppo F19 Pro:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Infinix Note 10", + "PRODUCT": "X695", + "DEVICE": "X695", + "BOARD": "mt6769", + "HARDWARE": "mediatek", + "ID": "SP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "InfinixNote10_11.0.1", + "SERIAL": "INFINIX123456", + "DISPLAY": "InfinixNote10_11.0.1", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X695/Infinix Note 10:11/SP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO M3", + "PRODUCT": "Lemax", + "DEVICE": "Lemax", + "BOARD": "sm6115", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "POCO_M3_10.0.2", + "SERIAL": "POCO987654321", + "DISPLAY": "POCO_M3_10.0.2", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X11", + "RADIO_VERSION": "QCOM_X11_POCO", + "FINGERPRINT": "POCO/POCO M3/Lemax:10/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Tecno", + "BRAND": "Tecno", + "MODEL": "Tecno Spark 6", + "PRODUCT": "KE5", + "DEVICE": "KE5", + "BOARD": "mt6761", + "HARDWARE": "mediatek", + "ID": "SP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "TecnoSpark6_10.0.0", + "SERIAL": "TECNO987654", + "DISPLAY": "TecnoSpark6_10.0.0", + "HOST": "tecno_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Tecno", + "FINGERPRINT": "Tecno/KE5/Tecno Spark 6:10/SP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Moto", + "BRAND": "Moto", + "MODEL": "Moto G9", + "PRODUCT": "guacamole", + "DEVICE": "guacamole", + "BOARD": "sm6125", + "HARDWARE": "qcom", + "ID": "SP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "MotoG9_10.0.2", + "SERIAL": "MOTO123456789", + "DISPLAY": "MotoG9_10.0.2", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X11", + "RADIO_VERSION": "QCOM_X11_Moto", + "FINGERPRINT": "Motorola/Moto G9/guacamole:10/SP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Xiaomi", + "MODEL": "Redmi Note 10 Pro", + "PRODUCT": "Sweet", + "DEVICE": "Sweet", + "BOARD": "sm7150", + "HARDWARE": "qcom", + "ID": "SP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "RedmiNote10Pro_11.0.5", + "SERIAL": "XM987654321", + "DISPLAY": "RedmiNote10Pro_11.0.5", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_X11", + "RADIO_VERSION": "QCOM_X11_Xiaomi", + "FINGERPRINT": "Xiaomi/Redmi Note 10 Pro/Sweet:11/SP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO 7", + "PRODUCT": "V2056A", + "DEVICE": "V2056A", + "BOARD": "sm8250", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "iQOO7_11.0.1", + "SERIAL": "IQO012345678", + "DISPLAY": "iQOO7_11.0.1", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_iQOO", + "FINGERPRINT": "iQOO/V2056A/iQOO 7:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy S21", + "PRODUCT": "SM-G991B", + "DEVICE": "SM-G991B", + "BOARD": "exynos2100", + "HARDWARE": "samsung", + "ID": "RP1A.200720.012", + "IMEI": "350336263545489", + "Android_Version": "11", + "BOOTLOADER": "GalaxyS21_11.0.4", + "SERIAL": "SAMSUNG123456", + "DISPLAY": "GalaxyS21_11.0.4", + "HOST": "samsung_build_server", + "RADIO": "Exynos_LTE", + "RADIO_VERSION": "Exynos_2100_Samsung", + "FINGERPRINT": "Samsung/Galaxy S21/SM-G991B:11/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus 9", + "PRODUCT": "LE2111", + "DEVICE": "LE2111", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "OnePlus9_11.0.3", + "SERIAL": "OP123456789", + "DISPLAY": "OnePlus9_11.0.3", + "HOST": "oneplus_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_OnePlus", + "FINGERPRINT": "OnePlus/OnePlus 9/LE2111:11/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Motorola", + "BRAND": "Motorola", + "MODEL": "Moto G Power", + "PRODUCT": "guacamole", + "DEVICE": "guacamole", + "BOARD": "sm6125", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "MotoGPower_10.0.1", + "SERIAL": "MOTG987654", + "DISPLAY": "MotoGPower_10.0.1", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X11", + "RADIO_VERSION": "QCOM_X11_Motorola", + "FINGERPRINT": "Motorola/Moto G Power/guacamole:10/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Nothing", + "BRAND": "Nothing", + "MODEL": "Nothing Phone 1", + "PRODUCT": "A063", + "DEVICE": "A063", + "BOARD": "SM8450", + "HARDWARE": "qcom", + "ID": "RP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "NothingPhone1_12.0.4", + "SERIAL": "NOTHING123456", + "DISPLAY": "NothingPhone1_12.0.4", + "HOST": "nothing_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Nothing", + "FINGERPRINT": "Nothing/Phone1/A063:12/RP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Google", + "BRAND": "Google", + "MODEL": "Pixel 6", + "PRODUCT": "Raven", + "DEVICE": "raven", + "BOARD": "google", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "Pixel6_12.0.1", + "SERIAL": "GOOGLE1234567", + "DISPLAY": "Pixel6_12.0.1", + "HOST": "google_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Google", + "FINGERPRINT": "Google/Pixel6/raven:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme 8 Pro", + "PRODUCT": "RMX3081", + "DEVICE": "RMX3081", + "BOARD": "sm7125", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "Realme8Pro_11.0.2", + "SERIAL": "RMX123456789", + "DISPLAY": "Realme8Pro_11.0.2", + "HOST": "realme_build_server", + "RADIO": "Snapdragon_X11", + "RADIO_VERSION": "QCOM_X11_Realme", + "FINGERPRINT": "Realme/RMX3081/Realme 8 Pro:11/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "Vivo Y20", + "PRODUCT": "V2027", + "DEVICE": "V2027", + "BOARD": "sd460", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "VivoY20_10.0.2", + "SERIAL": "VV1234567890", + "DISPLAY": "VivoY20_10.0.2", + "HOST": "vivo_build_server", + "RADIO": "Snapdragon_X6", + "RADIO_VERSION": "QCOM_X6_Vivo", + "FINGERPRINT": "Vivo/V2027/Vivo Y20:10/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo Reno 5", + "PRODUCT": "CPH2145", + "DEVICE": "CPH2145", + "BOARD": "mt6877", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "OppoReno5_11.0.1", + "SERIAL": "OPPO987654321", + "DISPLAY": "OppoReno5_11.0.1", + "HOST": "oppo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_OPPO", + "FINGERPRINT": "Oppo/CPH2145/Oppo Reno 5:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Infinix Zero 8", + "PRODUCT": "X686", + "DEVICE": "X686", + "BOARD": "mt6785", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "10", + "BOOTLOADER": "InfinixZero8_10.0.0", + "SERIAL": "INFINIX987654", + "DISPLAY": "InfinixZero8_10.0.0", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X686/Infinix Zero 8:10/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO F3", + "PRODUCT": "Alioth", + "DEVICE": "Alioth", + "BOARD": "sm8250", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "POCOF3_11.0.4", + "SERIAL": "POCO123456789", + "DISPLAY": "POCOF3_11.0.4", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_POCO", + "FINGERPRINT": "POCO/POCO F3/Alioth:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Tecno", + "BRAND": "Tecno", + "MODEL": "Tecno Camon 17", + "PRODUCT": "KE7", + "DEVICE": "KE7", + "BOARD": "mt6769", + "HARDWARE": "mediatek", + "ID": "SP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "TecnoCamon17_11.0.1", + "SERIAL": "TECNO987654", + "DISPLAY": "TecnoCamon17_11.0.1", + "HOST": "tecno_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Tecno", + "FINGERPRINT": "Tecno/KE7/Tecno Camon 17:11/SP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Moto", + "BRAND": "Moto", + "MODEL": "Moto E", + "PRODUCT": "go", + "DEVICE": "go", + "BOARD": "sm4250", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "MotoE_10.0.0", + "SERIAL": "MOTO987654", + "DISPLAY": "MotoE_10.0.0", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X11", + "RADIO_VERSION": "QCOM_X11_Moto", + "FINGERPRINT": "Motorola/Moto E/go:10/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Redmi", + "BRAND": "Redmi", + "MODEL": "Redmi Note 9 Pro", + "PRODUCT": "Joyeuse", + "DEVICE": "Joyeuse", + "BOARD": "sm7125", + "HARDWARE": "qcom", + "ID": "SP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "RedmiNote9Pro_10.0.1", + "SERIAL": "REDMI123456", + "DISPLAY": "RedmiNote9Pro_10.0.1", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_X11", + "RADIO_VERSION": "QCOM_X11_Redmi", + "FINGERPRINT": "Xiaomi/Redmi Note 9 Pro/Joyeuse:10/SP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO Z3", + "PRODUCT": "V2054A", + "DEVICE": "V2054A", + "BOARD": "sm7250", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "iQOOZ3_11.0.2", + "SERIAL": "IQO0123456", + "DISPLAY": "iQOOZ3_11.0.2", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_iQOO", + "FINGERPRINT": "iQOO/V2054A/iQOO Z3:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy A51", + "PRODUCT": "SM-A515F", + "DEVICE": "SM-A515F", + "BOARD": "exynos9611", + "HARDWARE": "samsung", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "GalaxyA51_11.0.4", + "SERIAL": "SAMSUNG1234", + "DISPLAY": "GalaxyA51_11.0.4", + "HOST": "samsung_build_server", + "RADIO": "Exynos_LTE", + "RADIO_VERSION": "Exynos_9611_Samsung", + "FINGERPRINT": "Samsung/Galaxy A51/SM-A515F:11/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus Nord 2", + "PRODUCT": "DN2101", + "DEVICE": "DN2101", + "BOARD": "mt6893", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "OnePlusNord2_11.0.3", + "SERIAL": "OP1234567", + "DISPLAY": "OnePlusNord2_11.0.3", + "HOST": "oneplus_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_OnePlus", + "FINGERPRINT": "OnePlus/DN2101/OnePlus Nord 2:11/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Motorola", + "BRAND": "Motorola", + "MODEL": "Moto G60", + "PRODUCT": "cornsilk", + "DEVICE": "cornsilk", + "BOARD": "sm7150", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "MotoG60_10.0.1", + "SERIAL": "MOTG123456", + "DISPLAY": "MotoG60_10.0.1", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X11", + "RADIO_VERSION": "QCOM_X11_Motorola", + "FINGERPRINT": "Motorola/Moto G60/cornsilk:10/RP1A.200720.012/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Google", + "BRAND": "Google", + "MODEL": "Pixel 5", + "PRODUCT": "Redfin", + "DEVICE": "redfin", + "BOARD": "google", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "12", + "BOOTLOADER": "Pixel5_12.0.1", + "SERIAL": "GOOGLE12345", + "DISPLAY": "Pixel5_12.0.1", + "HOST": "google_build_server", + "RADIO": "Snapdragon_X65", + "RADIO_VERSION": "QCOM_X65_Google", + "FINGERPRINT": "Google/Pixel5/redfin:12/SP1A.210812.016/Stable:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme 9 Pro", + "PRODUCT": "RMX3471", + "DEVICE": "RMX3471", + "BOARD": "sm7250", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "12", + "BOOTLOADER": "Realme9Pro_12.0.3", + "SERIAL": "RMX123654789", + "DISPLAY": "Realme9Pro_12.0.3", + "HOST": "realme_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_Realme", + "FINGERPRINT": "Realme/RMX3471/Realme 9 Pro:12/RP1A.200720.012/R.2a75b19-19315:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "Vivo V21", + "PRODUCT": "V2050", + "DEVICE": "V2050", + "BOARD": "mt6893", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "VivoV21_11.0.5", + "SERIAL": "VV987654321", + "DISPLAY": "VivoV21_11.0.5", + "HOST": "vivo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Vivo", + "FINGERPRINT": "Vivo/V2050/Vivo V21:11/RP1A.200720.012/R.4f82f39-76311:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo F19 Pro", + "PRODUCT": "CPH2109", + "DEVICE": "CPH2109", + "BOARD": "mt6769", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "OppoF19Pro_11.0.2", + "SERIAL": "OPPO987654321", + "DISPLAY": "OppoF19Pro_11.0.2", + "HOST": "oppo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Oppo", + "FINGERPRINT": "Oppo/CPH2109/Oppo F19 Pro:11/SP1A.210812.016/R.6d11f15-18412:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Infinix Note 10", + "PRODUCT": "X693", + "DEVICE": "X693", + "BOARD": "mt6768", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "InfinixNote10_11.0.1", + "SERIAL": "INFINIX123654", + "DISPLAY": "InfinixNote10_11.0.1", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X693/Infinix Note 10:11/SP1A.210812.016/R.1a23b54-98102:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO X3 Pro", + "PRODUCT": "Vayu", + "DEVICE": "Vayu", + "BOARD": "sm8150", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "POCOX3Pro_11.0.4", + "SERIAL": "POCO123987", + "DISPLAY": "POCOX3Pro_11.0.4", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_POCO", + "FINGERPRINT": "POCO/POCO X3 Pro/Vayu:11/SP1A.210812.016/R.8f37b12-65141:user/release-keys" + }, + { + "MANUFACTURER": "Tecno", + "BRAND": "Tecno", + "MODEL": "Tecno Spark 7", + "PRODUCT": "KE7", + "DEVICE": "KE7", + "BOARD": "mt6769", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "TecnoSpark7_11.0.3", + "SERIAL": "TECNO654321", + "DISPLAY": "TecnoSpark7_11.0.3", + "HOST": "tecno_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Tecno", + "FINGERPRINT": "Tecno/KE7/Tecno Spark 7:11/RP1A.200720.012/R.9d61e03-72136:user/release-keys" + }, + { + "MANUFACTURER": "Moto", + "BRAND": "Moto", + "MODEL": "Moto G60", + "PRODUCT": "cornsilk", + "DEVICE": "cornsilk", + "BOARD": "sm7150", + "HARDWARE": "qcom", + "ID": "SP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "MotoG60_10.0.2", + "SERIAL": "MOTG987654", + "DISPLAY": "MotoG60_10.0.2", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Moto", + "FINGERPRINT": "Motorola/Moto G60/cornsilk:10/SP1A.200720.012/R.1b97a61-84902:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Xiaomi", + "MODEL": "Mi 11X Pro", + "PRODUCT": "Alioth", + "DEVICE": "Alioth", + "BOARD": "sm8250", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "Mi11XPro_11.0.5", + "SERIAL": "MI123456789", + "DISPLAY": "Mi11XPro_11.0.5", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Xiaomi", + "FINGERPRINT": "Xiaomi/Mi 11X Pro/Alioth:11/RP1A.200720.012/R.6d2a7f9-59223:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO 7", + "PRODUCT": "V2043", + "DEVICE": "V2043", + "BOARD": "sm8250", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "iQOO7_11.0.2", + "SERIAL": "IQO1234567", + "DISPLAY": "iQOO7_11.0.2", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_iQOO", + "FINGERPRINT": "iQOO/V2043/iQOO 7:11/RP1A.200720.012/R.2b81d40-45112:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy A72", + "PRODUCT": "SM-A725F", + "DEVICE": "SM-A725F", + "BOARD": "exynos9611", + "HARDWARE": "samsung", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "GalaxyA72_11.0.3", + "SERIAL": "SAMSUNG123654", + "DISPLAY": "GalaxyA72_11.0.3", + "HOST": "samsung_build_server", + "RADIO": "Exynos_LTE", + "RADIO_VERSION": "Exynos_9611_Samsung", + "FINGERPRINT": "Samsung/Galaxy A72/SM-A725F:11/RP1A.200720.012/R.3a64e92-30215:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus 9", + "PRODUCT": "LE2111", + "DEVICE": "LE2111", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "11", + "BOOTLOADER": "OnePlus9_11.0.1", + "SERIAL": "OP987654321", + "DISPLAY": "OnePlus9_11.0.1", + "HOST": "oneplus_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_OnePlus", + "FINGERPRINT": "OnePlus/LE2111/OnePlus 9:11/SP1A.210812.016/R.8c5d39b-20976:user/release-keys" + }, + { + "MANUFACTURER": "Motorola", + "BRAND": "Motorola", + "MODEL": "Moto G Power", + "PRODUCT": "cornsilk", + "DEVICE": "cornsilk", + "BOARD": "sm7250", + "HARDWARE": "qcom", + "ID": "SP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "MotoGPower_10.0.3", + "SERIAL": "MOTG654321", + "DISPLAY": "MotoGPower_10.0.3", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_Motorola", + "FINGERPRINT": "Motorola/Moto G Power/cornsilk:10/SP1A.200720.012/R.7f4a90f-12543:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme Narzo 30 Pro", + "PRODUCT": "RMX2020", + "DEVICE": "RMX2020", + "BOARD": "sm7125", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "RealmeNarzo30_10.0.3", + "SERIAL": "RMX123987654", + "DISPLAY": "RealmeNarzo30_10.0.3", + "HOST": "realme_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_Realme", + "FINGERPRINT": "Realme/RMX2020/Realme Narzo 30 Pro:10/RP1A.200720.012/M.2a75b19-19315:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "Vivo Y51", + "PRODUCT": "V2030", + "DEVICE": "V2030", + "BOARD": "sm6125", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "VivoY51_10.0.5", + "SERIAL": "VIVO1234567", + "DISPLAY": "VivoY51_10.0.5", + "HOST": "vivo_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_Vivo", + "FINGERPRINT": "Vivo/V2030/Vivo Y51:10/RP1A.200720.012/M.1b90f18-71521:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo A53", + "PRODUCT": "CPH2127", + "DEVICE": "CPH2127", + "BOARD": "sm6125", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "OppoA53_10.0.3", + "SERIAL": "OPPO12345678", + "DISPLAY": "OppoA53_10.0.3", + "HOST": "oppo_build_server", + "RADIO": "Snapdragon_X55", + "RADIO_VERSION": "QCOM_X55_Oppo", + "FINGERPRINT": "Oppo/CPH2127/Oppo A53:10/RP1A.200720.012/M.3d92c37-48190:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Infinix Zero 8", + "PRODUCT": "X6810", + "DEVICE": "X6810", + "BOARD": "mt6769", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "10", + "BOOTLOADER": "InfinixZero8_10.0.4", + "SERIAL": "INFINIX123654", + "DISPLAY": "InfinixZero8_10.0.4", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X6810/Infinix Zero 8:10/SP1A.210812.016/M.5e40d29-89216:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO M2 Pro", + "PRODUCT": "gram", + "DEVICE": "gram", + "BOARD": "sm7125", + "HARDWARE": "qcom", + "ID": "SP1A.200812.016", + "Android_Version": "10", + "BOOTLOADER": "POCO_M2Pro_10.0.4", + "SERIAL": "POCO123987", + "DISPLAY": "POCO_M2Pro_10.0.4", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_POCO", + "FINGERPRINT": "POCO/POCO M2 Pro/gram:10/SP1A.200812.016/M.7c1b34d-61256:user/release-keys" + }, + { + "MANUFACTURER": "Tecno", + "BRAND": "Tecno", + "MODEL": "Tecno Camon 16", + "PRODUCT": "KE5", + "DEVICE": "KE5", + "BOARD": "mt6768", + "HARDWARE": "mediatek", + "ID": "RP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "TecnoCamon16_10.0.4", + "SERIAL": "TECNO654321", + "DISPLAY": "TecnoCamon16_10.0.4", + "HOST": "tecno_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Tecno", + "FINGERPRINT": "Tecno/KE5/Tecno Camon 16:10/RP1A.200720.012/M.1c72f60-62139:user/release-keys" + }, + { + "MANUFACTURER": "Moto", + "BRAND": "Moto", + "MODEL": "Moto G60", + "PRODUCT": "cornflower", + "DEVICE": "cornflower", + "BOARD": "sm7250", + "HARDWARE": "qcom", + "ID": "SP1A.200812.016", + "Android_Version": "11", + "BOOTLOADER": "MotoG60_11.0.2", + "SERIAL": "MOTG987654", + "DISPLAY": "MotoG60_11.0.2", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Moto", + "FINGERPRINT": "Motorola/Moto G60/cornflower:11/SP1A.200812.016/M.3f18e12-68415:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Xiaomi", + "MODEL": "Redmi Note 10 Pro", + "PRODUCT": "sweet", + "DEVICE": "sweet", + "BOARD": "sm7150", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "RedmiNote10Pro_11.0.4", + "SERIAL": "MI123456789", + "DISPLAY": "RedmiNote10Pro_11.0.4", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Xiaomi", + "FINGERPRINT": "Xiaomi/Redmi Note 10 Pro/sweet:11/RP1A.200720.012/M.9d72f43-83265:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO 3", + "PRODUCT": "I1927", + "DEVICE": "I1927", + "BOARD": "sm8250", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "10", + "BOOTLOADER": "iQOO3_10.0.5", + "SERIAL": "IQO1234567", + "DISPLAY": "iQOO3_10.0.5", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_iQOO", + "FINGERPRINT": "iQOO/I1927/iQOO 3:10/RP1A.200720.012/M.2d74f11-93561:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy M32", + "PRODUCT": "SM-M325F", + "DEVICE": "SM-M325F", + "BOARD": "exynos9611", + "HARDWARE": "samsung", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "GalaxyM32_11.0.4", + "SERIAL": "SAMSUNG987654", + "DISPLAY": "GalaxyM32_11.0.4", + "HOST": "samsung_build_server", + "RADIO": "Exynos_LTE", + "RADIO_VERSION": "Exynos9611_Samsung", + "FINGERPRINT": "Samsung/Galaxy M32/SM-M325F:11/RP1A.200720.012/M.5e92c43-74129:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus Nord 2", + "PRODUCT": "DN2101", + "DEVICE": "DN2101", + "BOARD": "sm8250", + "HARDWARE": "qcom", + "ID": "SP1A.200812.016", + "Android_Version": "11", + "BOOTLOADER": "OnePlusNord2_11.0.3", + "SERIAL": "OP987654321", + "DISPLAY": "OnePlusNord2_11.0.3", + "HOST": "oneplus_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_OnePlus", + "FINGERPRINT": "OnePlus/DN2101/OnePlus Nord 2:11/SP1A.200812.016/M.4a75e90-95314:user/release-keys" + }, + { + "MANUFACTURER": "Motorola", + "BRAND": "Motorola", + "MODEL": "Moto Edge", + "PRODUCT": "edge", + "DEVICE": "edge", + "BOARD": "sm8250", + "HARDWARE": "qcom", + "ID": "RP1A.200720.012", + "Android_Version": "11", + "BOOTLOADER": "MotoEdge_11.0.3", + "SERIAL": "MOTG876543", + "DISPLAY": "MotoEdge_11.0.3", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Motorola", + "FINGERPRINT": "Motorola/Moto Edge/edge:11/RP1A.200720.012/M.2b45f13-51239:user/release-keys" + }, + { + "MANUFACTURER": "Nothing", + "BRAND": "Nothing", + "MODEL": "Nothing Phone (1)", + "PRODUCT": "A065", + "DEVICE": "A065", + "BOARD": "qcom", + "HARDWARE": "qcom", + "ID": "SP1A.200812.016", + "Android_Version": "12", + "BOOTLOADER": "NothingPhone1_12.0.2", + "SERIAL": "NOTHING123", + "DISPLAY": "NothingPhone1_12.0.2", + "HOST": "nothing_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Nothing", + "FINGERPRINT": "Nothing/A065/Nothing Phone (1):12/SP1A.200812.016/M.7d3c92b-90123:user/release-keys" + }, + { + "MANUFACTURER": "Google", + "BRAND": "Google", + "MODEL": "Pixel 5", + "PRODUCT": "redfin", + "DEVICE": "redfin", + "BOARD": "sm8250", + "HARDWARE": "qcom", + "ID": "SP1A.200812.016", + "Android_Version": "11", + "BOOTLOADER": "Pixel5_11.0.2", + "SERIAL": "GOOG1234567", + "DISPLAY": "Pixel5_11.0.2", + "HOST": "google_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Google", + "FINGERPRINT": "Google/redfin/Pixel 5:11/SP1A.200812.016/M.8a72f81-15647:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme GT 2 Pro", + "PRODUCT": "RMX3301", + "DEVICE": "RMX3301", + "BOARD": "sm8250", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "13", + "BOOTLOADER": "RealmeGT2Pro_13.0.3", + "SERIAL": "RMX123987654", + "DISPLAY": "RealmeGT2Pro_13.0.3", + "HOST": "realme_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Realme", + "FINGERPRINT": "Realme/RMX3301/Realme GT 2 Pro:13/TP1A.220905.001/M.4b73e10-56123:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "Vivo V23e 5G", + "PRODUCT": "V2131", + "DEVICE": "V2131", + "BOARD": "mt6833", + "HARDWARE": "mediatek", + "ID": "TP1A.220905.001", + "Android_Version": "13", + "BOOTLOADER": "VivoV23e_13.0.2", + "SERIAL": "VIVO87654321", + "DISPLAY": "VivoV23e_13.0.2", + "HOST": "vivo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Vivo", + "FINGERPRINT": "Vivo/V2131/Vivo V23e 5G:13/TP1A.220905.001/M.3f74c23-19874:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo Find X5 Pro", + "PRODUCT": "CPH2305", + "DEVICE": "CPH2305", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "13", + "BOOTLOADER": "OppoFindX5Pro_13.0.4", + "SERIAL": "OPPO123456789", + "DISPLAY": "OppoFindX5Pro_13.0.4", + "HOST": "oppo_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Oppo", + "FINGERPRINT": "Oppo/CPH2305/Oppo Find X5 Pro:13/TP1A.220905.001/M.2b84d71-67215:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Infinix Zero Ultra", + "PRODUCT": "X6812", + "DEVICE": "X6812", + "BOARD": "mt6893", + "HARDWARE": "mediatek", + "ID": "TP1A.220905.001", + "Android_Version": "13", + "BOOTLOADER": "InfinixZeroUltra_13.0.2", + "SERIAL": "INFINIX1234567", + "DISPLAY": "InfinixZeroUltra_13.0.2", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X6812/Infinix Zero Ultra:13/TP1A.220905.001/M.5f72c83-92115:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO X4 GT", + "PRODUCT": "redmi", + "DEVICE": "redmi", + "BOARD": "sm7325", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "13", + "BOOTLOADER": "POCOX4GT_13.0.3", + "SERIAL": "POCO987654321", + "DISPLAY": "POCOX4GT_13.0.3", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_POCO", + "FINGERPRINT": "POCO/redmi/POCO X4 GT:13/TP1A.220905.001/M.6b92f47-12456:user/release-keys" + }, + { + "MANUFACTURER": "Tecno", + "BRAND": "Tecno", + "MODEL": "Tecno Phantom X2", + "PRODUCT": "KE6", + "DEVICE": "KE6", + "BOARD": "mt6893", + "HARDWARE": "mediatek", + "ID": "TP1A.220905.001", + "Android_Version": "13", + "BOOTLOADER": "TecnoPhantomX2_13.0.5", + "SERIAL": "TECNO123987", + "DISPLAY": "TecnoPhantomX2_13.0.5", + "HOST": "tecno_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Tecno", + "FINGERPRINT": "Tecno/KE6/Tecno Phantom X2:13/TP1A.220905.001/M.1c92f47-80123:user/release-keys" + }, + { + "MANUFACTURER": "Moto", + "BRAND": "Moto", + "MODEL": "Moto G200 5G", + "PRODUCT": "corned-beef", + "DEVICE": "corned-beef", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "13", + "BOOTLOADER": "MotoG200_13.0.2", + "SERIAL": "MOTG123456", + "DISPLAY": "MotoG200_13.0.2", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Moto", + "FINGERPRINT": "Motorola/Moto G200/corned-beef:13/TP1A.220905.001/M.2a73c25-98274:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Xiaomi", + "MODEL": "Xiaomi 12 Pro", + "PRODUCT": "cypress", + "DEVICE": "cypress", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "13", + "BOOTLOADER": "Xiaomi12Pro_13.0.4", + "SERIAL": "MI12345678", + "DISPLAY": "Xiaomi12Pro_13.0.4", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Xiaomi", + "FINGERPRINT": "Xiaomi/cypress/Xiaomi 12 Pro:13/TP1A.220905.001/M.3b85d32-74629:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO 9 Pro", + "PRODUCT": "I2126", + "DEVICE": "I2126", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "13", + "BOOTLOADER": "iQOO9Pro_13.0.2", + "SERIAL": "IQO1234567", + "DISPLAY": "iQOO9Pro_13.0.2", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_iQOO", + "FINGERPRINT": "iQOO/I2126/iQOO 9 Pro:13/TP1A.220905.001/M.2b75e11-63215:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy S22 Ultra", + "PRODUCT": "SM-S908B", + "DEVICE": "SM-S908B", + "BOARD": "exynos2200", + "HARDWARE": "samsung", + "ID": "TP1A.220905.001", + "IMEI": "350280388762357", + "Android_Version": "13", + "BOOTLOADER": "GalaxyS22Ultra_13.0.3", + "SERIAL": "SAMSUNG123456", + "DISPLAY": "GalaxyS22Ultra_13.0.3", + "HOST": "samsung_build_server", + "RADIO": "Exynos_LTE", + "RADIO_VERSION": "Exynos2200_Samsung", + "FINGERPRINT": "Samsung/SM-S908B/Galaxy S22 Ultra:13/TP1A.220905.001/M.3f92e41-76291:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus 10 Pro", + "PRODUCT": "LE2120", + "DEVICE": "LE2120", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "13", + "BOOTLOADER": "OnePlus10Pro_13.0.4", + "SERIAL": "OP987654321", + "DISPLAY": "OnePlus10Pro_13.0.4", + "HOST": "oneplus_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_OnePlus", + "FINGERPRINT": "OnePlus/LE2120/OnePlus 10 Pro:13/TP1A.220905.001/M.1a84d32-67381:user/release-keys" + }, + { + "MANUFACTURER": "Motorola", + "BRAND": "Motorola", + "MODEL": "Moto G Power (2023)", + "PRODUCT": "XT2315", + "DEVICE": "XT2315", + "BOARD": "sm7225", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "14", + "BOOTLOADER": "MotoGPower2023_14.0.3", + "SERIAL": "MOTG987654", + "DISPLAY": "MotoGPower2023_14.0.3", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Motorola", + "FINGERPRINT": "Motorola/Moto G Power (2023)/XT2315:14/TP1A.220905.001/M.3d17b98-92543:user/release-keys" + }, + { + "MANUFACTURER": "Nothing", + "BRAND": "Nothing", + "MODEL": "Nothing Phone (2)", + "PRODUCT": "A072", + "DEVICE": "A072", + "BOARD": "qcom", + "HARDWARE": "qcom", + "ID": "SP1A.200812.016", + "Android_Version": "14", + "BOOTLOADER": "NothingPhone2_14.0.1", + "SERIAL": "NOTHING87654321", + "DISPLAY": "NothingPhone2_14.0.1", + "HOST": "nothing_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Nothing", + "FINGERPRINT": "Nothing/A072/Nothing Phone (2):14/SP1A.200812.016/M.9d51f90-74182:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme 10 Pro+", + "PRODUCT": "RMX3686", + "DEVICE": "RMX3686", + "BOARD": "sm8550", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "14", + "BOOTLOADER": "Realme10ProPlus_14.0.2", + "SERIAL": "RMX1009876", + "DISPLAY": "Realme10ProPlus_14.0.2", + "HOST": "realme_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_Realme", + "FINGERPRINT": "Realme/RMX3686/Realme 10 Pro+:14/TP1A.220905.001/A.3a72d92-19415:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "Vivo X90 Pro", + "PRODUCT": "V2219A", + "DEVICE": "V2219A", + "BOARD": "mt6895", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "15", + "BOOTLOADER": "VivoX90Pro_15.0.1", + "SERIAL": "VIVO890123", + "DISPLAY": "VivoX90Pro_15.0.1", + "HOST": "vivo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Vivo", + "FINGERPRINT": "Vivo/V2219A/Vivo X90 Pro:15/SP1A.210812.016/A.5e73c84-78412:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo Reno 8 Pro", + "PRODUCT": "CPH2359", + "DEVICE": "CPH2359", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "15", + "BOOTLOADER": "OppoReno8Pro_15.0.2", + "SERIAL": "OPPO1098765", + "DISPLAY": "OppoReno8Pro_15.0.2", + "HOST": "oppo_build_server", + "RADIO": "Snapdragon_X65", + "RADIO_VERSION": "QCOM_X65_Oppo", + "FINGERPRINT": "Oppo/CPH2359/Oppo Reno 8 Pro:15/SP1A.210812.016/A.8f72d72-90231:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Infinix Zero 5G 2023", + "PRODUCT": "X6813", + "DEVICE": "X6813", + "BOARD": "mt6893", + "HARDWARE": "mediatek", + "ID": "TP1A.220905.001", + "Android_Version": "15", + "BOOTLOADER": "InfinixZero5G2023_15.0.2", + "SERIAL": "INFINIX332156", + "DISPLAY": "InfinixZero5G2023_15.0.2", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X6813/Infinix Zero 5G 2023:15/TP1A.220905.001/A.4e62b19-89512:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO F4 GT", + "PRODUCT": "Mondrian", + "DEVICE": "Mondrian", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "14", + "BOOTLOADER": "POCOF4GT_14.0.1", + "SERIAL": "POCO789654", + "DISPLAY": "POCOF4GT_14.0.1", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X65", + "RADIO_VERSION": "QCOM_X65_POCO", + "FINGERPRINT": "POCO/Mondrian/POCO F4 GT:14/TP1A.220905.001/A.6e93d15-81423:user/release-keys" + }, + { + "MANUFACTURER": "Tecno", + "BRAND": "Tecno", + "MODEL": "Tecno Camon 20 Pro", + "PRODUCT": "AD9", + "DEVICE": "AD9", + "BOARD": "mt6895", + "HARDWARE": "mediatek", + "ID": "TP1A.220905.001", + "Android_Version": "15", + "BOOTLOADER": "TecnoCamon20Pro_15.0.3", + "SERIAL": "TECNO7654321", + "DISPLAY": "TecnoCamon20Pro_15.0.3", + "HOST": "tecno_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Tecno", + "FINGERPRINT": "Tecno/AD9/Tecno Camon 20 Pro:15/TP1A.220905.001/A.2d75b19-93215:user/release-keys" + }, + { + "MANUFACTURER": "Moto", + "BRAND": "Moto", + "MODEL": "Moto Edge 40 Pro", + "PRODUCT": "edge40pro", + "DEVICE": "edge40pro", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "15", + "BOOTLOADER": "MotoEdge40Pro_15.0.1", + "SERIAL": "MOTG654321", + "DISPLAY": "MotoEdge40Pro_15.0.1", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_Moto", + "FINGERPRINT": "Motorola/Moto Edge 40 Pro/edge40pro:15/TP1A.220905.001/A.3a71b93-97124:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Xiaomi", + "MODEL": "Xiaomi 13", + "PRODUCT": "nuwa", + "DEVICE": "nuwa", + "BOARD": "sm8550", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "14", + "BOOTLOADER": "Xiaomi13_14.0.2", + "SERIAL": "MI1098765", + "DISPLAY": "Xiaomi13_14.0.2", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_Xiaomi", + "FINGERPRINT": "Xiaomi/nuwa/Xiaomi 13:14/TP1A.220905.001/A.7a91d19-63345:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO Neo 7", + "PRODUCT": "I2206", + "DEVICE": "I2206", + "BOARD": "sm8550", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "14", + "BOOTLOADER": "iQOONeo7_14.0.3", + "SERIAL": "IQO0987654", + "DISPLAY": "iQOONeo7_14.0.3", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_iQOO", + "FINGERPRINT": "iQOO/I2206/iQOO Neo 7:14/SP1A.210812.016/A.9a85b26-67134:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy Z Fold 5", + "PRODUCT": "SM-F946B", + "DEVICE": "SM-F946B", + "BOARD": "exynos2200", + "HARDWARE": "samsung", + "ID": "TP1A.220905.001", + "IMEI": "351561160767485", + "Android_Version": "14", + "BOOTLOADER": "GalaxyZFold5_14.0.1", + "SERIAL": "SAMSUNG123456", + "DISPLAY": "GalaxyZFold5_14.0.1", + "HOST": "samsung_build_server", + "RADIO": "Exynos_LTE", + "RADIO_VERSION": "Exynos2200_Samsung", + "FINGERPRINT": "Samsung/Galaxy Z Fold 5/SM-F946B:14/TP1A.220905.001/A.2a92d83-66125:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus 10 Pro", + "PRODUCT": "NE2210", + "DEVICE": "NE2210", + "BOARD": "sm8550", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "15", + "BOOTLOADER": "OnePlus10Pro_15.0.2", + "SERIAL": "OP98765432", + "DISPLAY": "OnePlus10Pro_15.0.2", + "HOST": "oneplus_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_OnePlus", + "FINGERPRINT": "OnePlus/NE2210/OnePlus 10 Pro:15/SP1A.210812.016/A.3b91f82-91372:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme 9 Pro+", + "PRODUCT": "RMX3393", + "DEVICE": "RMX3393", + "BOARD": "sm6350", + "HARDWARE": "qcom", + "ID": "SP1A.220812.016", + "Android_Version": "14", + "BOOTLOADER": "Realme9Pro+_14.0.2", + "SERIAL": "RMX1234567", + "DISPLAY": "Realme9Pro+_14.0.2", + "HOST": "realme_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Realme", + "FINGERPRINT": "Realme/RMX3393/Realme 9 Pro+:14/SP1A.220812.016/G.2a75b19-19315:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "Vivo V27 Pro", + "PRODUCT": "V2246", + "DEVICE": "V2246", + "BOARD": "mt6893", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "15", + "BOOTLOADER": "VivoV27Pro_15.0.1", + "SERIAL": "VIVO7654321", + "DISPLAY": "VivoV27Pro_15.0.1", + "HOST": "vivo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Vivo", + "FINGERPRINT": "Vivo/V2246/Vivo V27 Pro:15/SP1A.210812.016/G.7a75c12-47351:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo Find X5 Pro", + "PRODUCT": "CPH2201", + "DEVICE": "CPH2201", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "15", + "BOOTLOADER": "OppoFindX5Pro_15.0.2", + "SERIAL": "OPPO0987654", + "DISPLAY": "OppoFindX5Pro_15.0.2", + "HOST": "oppo_build_server", + "RADIO": "Snapdragon_X65", + "RADIO_VERSION": "QCOM_X65_Oppo", + "FINGERPRINT": "Oppo/CPH2201/Oppo Find X5 Pro:15/SP1A.210812.016/G.4a63c29-78421:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Infinix Zero Ultra", + "PRODUCT": "X6813", + "DEVICE": "X6813", + "BOARD": "mt6893", + "HARDWARE": "mediatek", + "ID": "TP1A.220905.001", + "Android_Version": "14", + "BOOTLOADER": "InfinixZeroUltra_14.0.1", + "SERIAL": "INFINIX563785", + "DISPLAY": "InfinixZeroUltra_14.0.1", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X6813/Infinix Zero Ultra:14/TP1A.220905.001/G.1a72c29-67451:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO X5 Pro", + "PRODUCT": "mondrian", + "DEVICE": "mondrian", + "BOARD": "sm8550", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "13", + "BOOTLOADER": "POCOX5Pro_13.0.1", + "SERIAL": "POCO12344321", + "DISPLAY": "POCOX5Pro_13.0.1", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_POCO", + "FINGERPRINT": "POCO/mondrian/POCO X5 Pro:13/TP1A.220905.001/G.3a61d92-57341:user/release-keys" + }, + { + "MANUFACTURER": "Tecno", + "BRAND": "Tecno", + "MODEL": "Tecno Phantom X2", + "PRODUCT": "AD8", + "DEVICE": "AD8", + "BOARD": "mt6895", + "HARDWARE": "mediatek", + "ID": "SP1A.210812.016", + "Android_Version": "14", + "BOOTLOADER": "TecnoPhantomX2_14.0.1", + "SERIAL": "TECNO198765", + "DISPLAY": "TecnoPhantomX2_14.0.1", + "HOST": "tecno_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Tecno", + "FINGERPRINT": "Tecno/AD8/Tecno Phantom X2:14/SP1A.210812.016/G.2b75b24-81932:user/release-keys" + }, + { + "MANUFACTURER": "Moto", + "BRAND": "Moto", + "MODEL": "Moto Edge 30", + "PRODUCT": "edge30", + "DEVICE": "edge30", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "14", + "BOOTLOADER": "MotoEdge30_14.0.3", + "SERIAL": "MOTG456789", + "DISPLAY": "MotoEdge30_14.0.3", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Moto", + "FINGERPRINT": "Motorola/Moto Edge 30/edge30:14/SP1A.210812.016/G.4b73d91-38128:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Xiaomi", + "MODEL": "Xiaomi 12", + "PRODUCT": "cody", + "DEVICE": "cody", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "15", + "BOOTLOADER": "Xiaomi12_15.0.1", + "SERIAL": "MI2345678", + "DISPLAY": "Xiaomi12_15.0.1", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_Xiaomi", + "FINGERPRINT": "Xiaomi/cody/Xiaomi 12:15/TP1A.220905.001/G.1a91d17-65328:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO 11", + "PRODUCT": "I2202", + "DEVICE": "I2202", + "BOARD": "sm8550", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "14", + "BOOTLOADER": "iQOO11_14.0.2", + "SERIAL": "IQO332546", + "DISPLAY": "iQOO11_14.0.2", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_iQOO", + "FINGERPRINT": "iQOO/I2202/iQOO 11:14/TP1A.220905.001/G.3b65d82-87341:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy S22 Ultra", + "PRODUCT": "SM-S908E", + "DEVICE": "SM-S908E", + "BOARD": "exynos2200", + "HARDWARE": "samsung", + "ID": "TP1A.220905.001", + "IMEI": "350280381492614", + "Android_Version": "14", + "BOOTLOADER": "GalaxyS22Ultra_14.0.3", + "SERIAL": "SAMSUNG876543", + "DISPLAY": "GalaxyS22Ultra_14.0.3", + "HOST": "samsung_build_server", + "RADIO": "Exynos_LTE", + "RADIO_VERSION": "Exynos2200_Samsung", + "FINGERPRINT": "Samsung/Galaxy S22 Ultra/SM-S908E:14/TP1A.220905.001/G.2b75c27-38172:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus 9 Pro", + "PRODUCT": "LE2121", + "DEVICE": "LE2121", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "15", + "BOOTLOADER": "OnePlus9Pro_15.0.3", + "SERIAL": "OP7654321", + "DISPLAY": "OnePlus9Pro_15.0.3", + "HOST": "oneplus_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_OnePlus", + "FINGERPRINT": "OnePlus/LE2121/OnePlus 9 Pro:15/SP1A.210812.016/G.7a61d35-58239:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme GT 2 Pro", + "PRODUCT": "RMX3300", + "DEVICE": "RMX3300", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "15", + "BOOTLOADER": "RealmeGT2Pro_15.0.2", + "SERIAL": "RMX44321", + "DISPLAY": "RealmeGT2Pro_15.0.2", + "HOST": "realme_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_Realme", + "FINGERPRINT": "Realme/RMX3300/Realme GT 2 Pro:15/SP1A.210812.016/K.2a75b19-19315:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "Vivo V23 Pro", + "PRODUCT": "V2132", + "DEVICE": "V2132", + "BOARD": "mt6893", + "HARDWARE": "mediatek", + "ID": "TP1A.220905.001", + "Android_Version": "14", + "BOOTLOADER": "VivoV23Pro_14.0.3", + "SERIAL": "VIVO987654", + "DISPLAY": "VivoV23Pro_14.0.3", + "HOST": "vivo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Vivo", + "FINGERPRINT": "Vivo/V2132/Vivo V23 Pro:14/TP1A.220905.001/K.2a75b19-19315:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo Reno 8 Pro", + "PRODUCT": "CPH2343", + "DEVICE": "CPH2343", + "BOARD": "sm7325", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "15", + "BOOTLOADER": "OppoReno8Pro_15.0.1", + "SERIAL": "OPPO654321", + "DISPLAY": "OppoReno8Pro_15.0.1", + "HOST": "oppo_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_Oppo", + "FINGERPRINT": "Oppo/CPH2343/Oppo Reno 8 Pro:15/TP1A.220905.001/K.4a76b17-58421:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Infinix Zero 5G", + "PRODUCT": "X6810", + "DEVICE": "X6810", + "BOARD": "mt6893", + "HARDWARE": "mediatek", + "ID": "SP1A.220812.016", + "Android_Version": "14", + "BOOTLOADER": "InfinixZero5G_14.0.2", + "SERIAL": "INFINIX789101", + "DISPLAY": "InfinixZero5G_14.0.2", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X6810/Infinix Zero 5G:14/SP1A.220812.016/K.2b75d92-58451:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO F4", + "PRODUCT": "mondrian", + "DEVICE": "mondrian", + "BOARD": "sm8550", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "14", + "BOOTLOADER": "POCOF4_14.0.1", + "SERIAL": "POCO987654", + "DISPLAY": "POCOF4_14.0.1", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_POCO", + "FINGERPRINT": "POCO/mondrian/POCO F4:14/TP1A.220905.001/K.3a75c19-67221:user/release-keys" + }, + { + "MANUFACTURER": "Tecno", + "BRAND": "Tecno", + "MODEL": "Tecno Spark 9 Pro", + "PRODUCT": "AD7", + "DEVICE": "AD7", + "BOARD": "mt6785", + "HARDWARE": "mediatek", + "ID": "SP1A.220905.001", + "Android_Version": "13", + "BOOTLOADER": "TecnoSpark9Pro_13.0.2", + "SERIAL": "TECNO234987", + "DISPLAY": "TecnoSpark9Pro_13.0.2", + "HOST": "tecno_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Tecno", + "FINGERPRINT": "Tecno/AD7/Tecno Spark 9 Pro:13/SP1A.220905.001/K.5a75c28-88222:user/release-keys" + }, + { + "MANUFACTURER": "Moto Fusion", + "BRAND": "Moto", + "MODEL": "Moto Fusion 5G", + "PRODUCT": "fusion", + "DEVICE": "fusion", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "14", + "BOOTLOADER": "MotoFusion_14.0.3", + "SERIAL": "MOTO654321", + "DISPLAY": "MotoFusion_14.0.3", + "HOST": "motorola_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_Moto", + "FINGERPRINT": "Motorola/Moto Fusion 5G/fusion:14/SP1A.210812.016/K.3a71c12-19318:user/release-keys" + }, + { + "MANUFACTURER": "Xiaomi", + "BRAND": "Xiaomi", + "MODEL": "Xiaomi 11T Pro", + "PRODUCT": "cody", + "DEVICE": "cody", + "BOARD": "sm8550", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "13", + "BOOTLOADER": "Xiaomi11TPro_13.0.2", + "SERIAL": "MI5674321", + "DISPLAY": "Xiaomi11TPro_13.0.2", + "HOST": "xiaomi_build_server", + "RADIO": "Snapdragon_X60", + "RADIO_VERSION": "QCOM_X60_Xiaomi", + "FINGERPRINT": "Xiaomi/cody/Xiaomi 11T Pro:13/TP1A.220905.001/K.7a76b15-58239:user/release-keys" + }, + { + "MANUFACTURER": "iQOO", + "BRAND": "iQOO", + "MODEL": "iQOO Neo 6", + "PRODUCT": "I2205", + "DEVICE": "I2205", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "SP1A.220905.001", + "Android_Version": "14", + "BOOTLOADER": "iQOONeo6_14.0.2", + "SERIAL": "IQO5678123", + "DISPLAY": "iQOONeo6_14.0.2", + "HOST": "iqoo_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_iQOO", + "FINGERPRINT": "iQOO/I2205/iQOO Neo 6:14/SP1A.220905.001/K.6a75b19-49321:user/release-keys" + }, + { + "MANUFACTURER": "Samsung", + "BRAND": "Samsung", + "MODEL": "Galaxy Z Fold 4", + "PRODUCT": "SM-F936U", + "DEVICE": "SM-F936U", + "BOARD": "exynos2200", + "HARDWARE": "samsung", + "ID": "TP1A.220905.001", + "IMEI": "351561165602935", + "Android_Version": "15", + "BOOTLOADER": "GalaxyZF4_15.0.3", + "SERIAL": "SAMSUNG432109", + "DISPLAY": "GalaxyZF4_15.0.3", + "HOST": "samsung_build_server", + "RADIO": "Exynos_LTE", + "RADIO_VERSION": "Exynos2200_Samsung", + "FINGERPRINT": "Samsung/Galaxy Z Fold 4/SM-F936U:15/TP1A.220905.001/K.3a76b12-90321:user/release-keys" + }, + { + "MANUFACTURER": "OnePlus", + "BRAND": "OnePlus", + "MODEL": "OnePlus 10 Pro", + "PRODUCT": "LE2123", + "DEVICE": "LE2123", + "BOARD": "sm8350", + "HARDWARE": "qcom", + "ID": "SP1A.210812.016", + "Android_Version": "14", + "BOOTLOADER": "OnePlus10Pro_14.0.2", + "SERIAL": "OP9876543", + "DISPLAY": "OnePlus10Pro_14.0.2", + "HOST": "oneplus_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_OnePlus", + "FINGERPRINT": "OnePlus/LE2123/OnePlus 10 Pro:14/SP1A.210812.016/K.5a72d15-47312:user/release-keys" + }, + { + "MANUFACTURER": "Realme", + "BRAND": "Realme", + "MODEL": "Realme GT 2 Pro", + "PRODUCT": "RMX3300", + "DEVICE": "RMX3300", + "BOARD": "sm8450", + "HARDWARE": "qcom", + "ID": "SP1A.220812.016", + "Android_Version": "15", + "BOOTLOADER": "RealmeGT2Pro_15.0.1", + "SERIAL": "RMX567123", + "DISPLAY": "RealmeGT2Pro_15.0.1", + "HOST": "realme_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_Realme", + "FINGERPRINT": "Realme/RMX3300/Realme GT 2 Pro:15/SP1A.220812.016/K.2a75b19-19315:user/release-keys" + }, + { + "MANUFACTURER": "Vivo", + "BRAND": "Vivo", + "MODEL": "Vivo V23 Pro", + "PRODUCT": "V2132", + "DEVICE": "V2132", + "BOARD": "mt6893", + "HARDWARE": "mediatek", + "ID": "TP1A.220905.001", + "Android_Version": "14", + "BOOTLOADER": "VivoV23Pro_14.0.2", + "SERIAL": "VIVO234567", + "DISPLAY": "VivoV23Pro_14.0.2", + "HOST": "vivo_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Vivo", + "FINGERPRINT": "Vivo/V2132/Vivo V23 Pro:14/TP1A.220905.001/K.3b75c19-45231:user/release-keys" + }, + { + "MANUFACTURER": "Oppo", + "BRAND": "Oppo", + "MODEL": "Oppo Reno 8 Pro", + "PRODUCT": "CPH2343", + "DEVICE": "CPH2343", + "BOARD": "sm7325", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "15", + "BOOTLOADER": "OppoReno8Pro_15.0.2", + "SERIAL": "OPPO987654", + "DISPLAY": "OppoReno8Pro_15.0.2", + "HOST": "oppo_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_Oppo", + "FINGERPRINT": "Oppo/CPH2343/Oppo Reno 8 Pro:15/TP1A.220905.001/K.4a75b19-54321:user/release-keys" + }, + { + "MANUFACTURER": "Infinix", + "BRAND": "Infinix", + "MODEL": "Infinix Zero 5G", + "PRODUCT": "X6810", + "DEVICE": "X6810", + "BOARD": "mt6893", + "HARDWARE": "mediatek", + "ID": "SP1A.220905.001", + "Android_Version": "14", + "BOOTLOADER": "InfinixZero5G_14.0.3", + "SERIAL": "INFINIX891011", + "DISPLAY": "InfinixZero5G_14.0.3", + "HOST": "infinix_build_server", + "RADIO": "MTK_LTE", + "RADIO_VERSION": "MTK_LTE_Infinix", + "FINGERPRINT": "Infinix/X6810/Infinix Zero 5G:14/SP1A.220905.001/K.2a75b19-19315:user/release-keys" + }, + { + "MANUFACTURER": "POCO", + "BRAND": "POCO", + "MODEL": "POCO X4 Pro 5G", + "PRODUCT": "mondrian", + "DEVICE": "mondrian", + "BOARD": "sm8550", + "HARDWARE": "qcom", + "ID": "TP1A.220905.001", + "Android_Version": "14", + "BOOTLOADER": "POCOX4Pro_14.0.2", + "SERIAL": "POCO123456", + "DISPLAY": "POCOX4Pro_14.0.2", + "HOST": "poco_build_server", + "RADIO": "Snapdragon_X70", + "RADIO_VERSION": "QCOM_X70_POCO", + "FINGERPRINT": "POCO/mondrian/POCO X4 Pro 5G:14/TP1A.220905.001/K.5a75b19-40234:user/release-keys" + } + + ] + self.selected_device = {} + + + # ---------------- Get Random Device Info ---------------- + def get_random_device_info(self): + + self.selected_device = M.random.choice(self.device_info_list) + + print(f'{C.X}{C.C} Fake Device Info Generate\n\n') + + for key, value in self.selected_device.items(): + setattr(self, f"is_{key.lower()}", value) + print(f'{C.G}︻デ═一 {C.C}{key} {C.OG}➸❥ {C.Y}{value}') + + print(f"\n{C.CC}{'_' * 61}\n\n") diff --git a/ApkPatcher/Patch/Smali_Patch.py b/ApkPatcher/Patch/Smali_Patch.py new file mode 100644 index 0000000..cbac18f --- /dev/null +++ b/ApkPatcher/Patch/Smali_Patch.py @@ -0,0 +1,400 @@ +from.Package import P + +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + +C_Line = f"{C.CC}{'_' * 61}" + + +# ---------------- Scan Target Regex ---------------- +def Regex_Scan(Smali_Path, Target_Regex, Count, Lock, isPKG, isCoreX): + + if isPKG: + Target_Regex = [P.Match_Regex[1:-1]] if Smali_Path.endswith('.xml') else Target_Regex + [P.Match_Regex] if Smali_Path.endswith('.smali') else [] + + if isCoreX: + Target_Regex = Target_Regex + [ r'\.class public Lcom/pairip/VMRunner;\n'] + + Smali = open(Smali_Path, 'r', encoding='utf-8', errors='ignore').read() + + Regexs = [M.re.compile(r) for r in Target_Regex] + + # ---------------- For Regex Scan ---------------- + for Regex in Regexs: + if Regex.search(Smali): + + if Lock: + try: + with Lock: + Count.value += 1 + + print(f"\r{C.S} Find Target Smali {C.E} {C.OG}➸❥ {C.PN}{Count.value}", end='', flush=True) + + except Exception: + return None + + else: + Count[0] += 1 + + print(f"\r{C.S} Find Target Smali {C.E} {C.OG}➸❥ {C.PN}{Count[0]}", end='', flush=True) + + return Smali_Path + + # ---------------- For String Scan ( Without Regex ) ---------------- + #for String in Target_String: + #if String in Smali: + #with Lock: + #Count.value += 1 + #print(f"\r[ Find Target Smali ] ➸❥ {Count.value}", end='', flush=True) + #return Smali_Path + + +# ---------------- Apply Smali_Patch ---------------- +def Smali_Patch(decompile_dir, smali_folders, isAPKEditor, CA_Cert, isID, isPairip, isPairip_lib, isPKG, isPurchased, isScreenShot, Skip_Patch, isUSB, isCoreX): + + Smali_Paths, Match_Smali = [], [] + + patterns = [ + # ---------------- VPN Bypass ---------------- + ( + r'(const/4 [pv]\d+, 0x4[^>]*?invoke-\w+ \{[^\}]*\}, Landroid/net/NetworkCapabilities;->hasTransport\(I\)Z[^>]*?)move-result ([pv]\d+)', + r'\1const/4 \2, 0x0', + "Bypassed Vpn/Proxy Detection NetworkCapabilities hasTransport" + ), + ( + r'(Ljava/net/NetworkInterface;->(?:isUp|isVirtual|isLoopback)\(\)Z[^>]*?)move-result ([pv]\d+)', + r'\1const/4 \2, 0x0', + "Bypassed Vpn/Proxy Detection NetworkInterface isUp" + ), + ( + r'(const-string [pv]\d+, "(tun|tunl0|tun0|utun0|utun1|utun2|utun3|utun4|pptp|ppp|pp0|ppp0|p2p0|ccmni0|ipsec)"[^>]*?invoke-\w+ \{[^\}]*\}, L[^\(]+;->\S+\(Ljava/lang/CharSequence;\)Z[^>]*?)move-result ([pv]\d+)', + r'\1const/4 \3, 0x0', + "Bypassed Vpn/Proxy Detection NetworkInterface" + ), + + # ---------------- Mock Location & Update & Pkg Install Fixed ---------------- + ( + r'(invoke-virtual \{[^\}]*\}, Landroid/location/Location;->(?:isFromMockProvider|isMock)\(\)Z[^>]*?)move-result ([pv]\d+)', + r'\1const/4 \2, 0x0', + "Bypassed Mock Detection" + ), + ( + r'(invoke-virtual \{[^\}]*\}, Landroid/content/pm/PackageManager;->getInstallerPackageName\(Ljava/lang/String;\)Ljava/lang/String;[^>]*?)move-result-object ([pv]\d+)', + r'\1const-string \2, "com.android.vending"', + "Fixed Installer" + ), + + # ---------------- SSL BYPASS ( MITM ) ---------------- + ( + r'(\.method [^(]*verify\([^\)]*(?:Ljavax/net/ssl/SSLSession;|Ljava/security/cert/X509Certificate;)[^\)]*\)Z\s+.locals \d+)[\s\S]*?(\n.end method)', + r'\1\n' + r' const v0, 0x1\n' + r' return v0\2', + "Verify SSLSession & X509Certificate" + ), + ( + r'(\.method [^(]*checkServerTrusted\([^\)]*Ljava/security/cert/X509Certificate;[^\)]*\)Ljava/util/List;\s+.locals \d+)[\s\S]*?(\n.end method)', + r'\1\n' + r' new-instance v0, Ljava/util/ArrayList;\n' + r' invoke-direct {v0}, Ljava/util/ArrayList;->()V\n' + r' return-object v0\2', + "checkServerTrusted" + ), + ( + r'(\.method [^(]*check(?:Client|Server)Trusted\([^\)]*Ljava/security/cert/X509Certificate;[^\)]*\)V\s+.locals \d+)[\s\S]*?(\n.end method)', + r'\1\n\treturn-void\2', + "check(Client|Server)Trusted" + ), + ( + r'(\.method [^(]*check\(Ljava/lang/String;(?:Ljava/util/List;|\[Ljava/security/cert/Certificate;)\)V\s+.locals \d+)[\s\S]*?(\n.end method)', + r'\1\n\treturn-void\2', + "CertificatePinner & HostnameVerifier" + ), + ( + r'(\.method [^(]*check\$okhttp\(Ljava/lang/String;[^\)]*\)V\s+.locals \d+)[\s\S]*?(\n.end method)', + r'\1\n\treturn-void\2', + "check$okhttp" + ), + ( + r'(\.method [^(]*getAcceptedIssuers\(\)\[Ljava/security/cert/X509Certificate;\s+.locals \d+)[\s\S]*?(\n.end method)', + r'\1\n' + r' const/4 v0, 0x0\n' + r' new-array v0, v0, [Ljava/security/cert/X509Certificate;\n' + r' return-object v0\2', + "getAcceptedIssuers" + ), + ( + r'(\.method [^(]*\S+\(Ljava/lang/String;[^\)]*\)V\s+.locals \d+)(?:(?!\.end method)[\s\S])*?(?:check-cast [pv]\d+, Ljava/security/cert/X509Certificate;|Ljavax/net/ssl/SSLPeerUnverifiedException;)(?:(?!\.end method)[\s\S])*?(\n.end method)', + r'\1\n\treturn-void\2', + "" + ), + + # ---------------- Fix Play ---------------- + ( + r'(invoke-interface \{[^\}]*\}, Lcom/google/android/vending/licensing/Policy;->allowAccess\(\)Z[^>]*?\s+)move-result ([pv]\d+)', + r'\1const/4 \2, 0x1', + "Bypass Client-Side LVL (allowAccess)" + ), + ( + r'(\.method [^(]*connectToLicensingService\(\)V\s+.locals \d+)[\s\S]*?(\s+return-void\n.end method)', + r'\1\2', + "connectToLicensingService" + ), + ( + r'(\.method [^(]*initializeLicenseCheck\(\)V\s+.locals \d+)[\s\S]*?(\s+return-void\n.end method)', + r'\1\2', + "initializeLicenseCheck" + ), + ( + r'(\.method [^(]*processResponse\(ILandroid/os/Bundle;\)V\s+.locals \d+)[\s\S]*?(\s+return-void\n.end method)', + r'\1\2', + "processResponse" + ) + ] + + # if CA_Cert: + # sha1, sha256 = P().Hash(CA_Cert[0]) + # ---------------- SHA-256 & SHA-1 ---------------- + # patterns.extend([ + # (r'(\.method [^(]*\S+\((?:Ljava/security/cert/X509Certificate;|[^)]*)\)Ljava/lang/String;\s+.locals \d+)(?:(?!\.end\smethod)[\s\S])*?"sha256/[^"]*"(?:(?!\.end\smethod)[\s\S])*?(([pv]\d+)\n.end method)', fr'\1\n\tconst-string \3, "sha256/{sha256}"\n\treturn-object \2', f"SHA-256 ➸❥ {C.OG}{sha256}"), + # (r'(\.method public [^(]*\S+\((?:Ljava/security/cert/X509Certificate;|[^)]*)\)Ljava/lang/String;\s+.*\s+)(?:(?!\.end\smethod)[\s\S])*?"sha1/[^"]*"(?:(?!\.end\smethod)[\s\S])*?(([pv]\d+)\n.end method)', fr'\1\n\tconst-string \3, "sha1/{sha1}"\n\treturn-object \2', f"SHA-1 ➸❥ {C.OG}{sha1}") + # ]) + + + # ---------------- Custom Device ID ---------------- + if isID: + patterns.append( + ( + r'(const-string [pv]\d+, "android_id"[^>]*?invoke-static \{[^\}]*\}, Landroid/provider/Settings\$Secure;->getString\(Landroid/content/ContentResolver;Ljava/lang/String;\)Ljava/lang/String;[^>]*?)move-result-object ([pv]\d+)', + rf'\1const-string \2, "{isID}"', + f"Custom Android ID ➸❥ {C.OG}{isID}" + ) + ) + + + # ---------------- isPairip ---------------- + if isPairip and isPairip_lib: + patterns.extend( + [ + ( + r'invoke-static \{[^\}]*\}, Lcom/pairip/SignatureCheck;->verifyIntegrity\(Landroid/content/Context;\)V', + r'#', + "VerifyIntegrity" + ), + ( + r'(\.method [^(]*verifyIntegrity\(Landroid/content/Context;\)V\s+.locals \d+)[\s\S]*?(\s+return-void\n.end method)', + r'\1\2', + "VerifyIntegrity" + ), + ( + r'(\.method [^(]*verifySignatureMatches\(Ljava/lang/String;\)Z\s+.locals \d+\s+)[\s\S]*?(\s+return ([pv]\d+)\n.end method)', + r'\1const/4 \3, 0x1\2', + "verifySignatureMatches" + ) + ] + ) + + + # ---------------- Bypass Package Detection ---------------- + if isPKG: + patterns.extend( + [ + # ---------------- Kill Process & Exit ---------------- + ( + r'invoke-static \{[^\}]*\}, (?:Ljava/lang/System;->exit|Landroid/os/Process;->killProcess)\(I\)V', + 'nop', + "Blocked System.exit & Process.killProcess" + ), + + # ---------------- Xposed Bypass & Frida Bypass ---------------- + ( + r'(const-string [pv]\d+, )"de.robv.android.xposed', + r'\1"com.Fuck.U', + "Bypassed Xposed Detection" + ), + ( + r'const-string [pv]\d+, "(generic|goldfish)"[^>]*?invoke-static \{[^\}]*\}, Landroid/os/Build;->get(Device|Hardware)\(\)Ljava/lang/String;[^>]*?move-result-object [pv]\d+[^>]*?invoke-virtual \{[^\}]*\}, Ljava/lang/String;->contains\(Ljava/lang/CharSequence;\)Z[^>]*move-result ([pv]\d+)', + r'const/4 \3, 0x0', + "Bypassed Device detection" + ), + ( + r'const-string [pv]\d+, "/data/local/tmp/(?:frida|frida-server)"[^>]*?invoke-static \{[^\}]*\}, Ljava/io/File;->exists\(\)Z[^>]*?move-result ([pv]\d+)', + r'const/4 \1, 0x0', + "Bypassed Frida Detection" + ) + ] + ) + + + # ---------------- Purchased Status ---------------- + if isPurchased: + patterns.extend( + [ + ( + r'(\.method [^(]*(?:getPrice|getMrp|getPro_mrp|getTotal(?:_)?Price|getOffer(?:_)?price|getSub_pack_price|getSub_actual_price|getActual_price|getDiscount(?:_)?price|getRegistration_price|getProduct_amount|getIs_locked)\(\)Ljava/lang/String;(?:(?!const-string [pv]\d+, "0")[\s\S])*?)(return-object ([pv]\d+)\n.end method)', + r'\1const-string \3, "0"\n\t\2', + "Patch 1" + ), + ( + r'(\.method [^(]*(?:is(?:_)?Paid|getIs(?:_)?Paid|is(?:_)?purchase(?:d)?|get(?:_)?Purchase(?:d)?|getIs(?:_)?purchase(?:d)?|getPurchaseStatus|getIs_pass|getIs_pro|getIs_pro_purchased|getIs_pro_content|isOwn|isLifetime|is(?:_)?Trial)\(.*\)(?:Ljava/lang/String;|Ljava/lang/Integer;)(?:(?!const-string [pv]\d+, "1")[\s\S])*?)(return-object ([pv]\d+)\n.end method)', + r'\1const-string \3, "1"\n\t\2', + "Patch 2" + ), + ( + r'(\.method [^(]*(?:is(?:_)?Paid|getInsIspaid|is(?:_)?purchase(?:d)?|getUser_purchase_status|getPurchaseId|is(?:_)?Trial)\(\)(?:I|Z)(?:(?!const [pv]\d+, 0x1)[\s\S])*?)(return ([pv]\d+)\n.end method)', + r'\1const \3, 0x1\n\t\2', + "Patch 3" + ) + ] + ) + + + # ---------------- Bypass SS ---------------- + if isScreenShot: + patterns.extend( + [ + ( + r'(const/16 [pv]\d+, 0x)200(0\s+(.line \d+\s+)*?invoke-virtual \{[^\}]*\}, Landroid/view/Window;->(?:add|set)Flags\(II\)V)', + r'\1\2', + "Bypassed Anti-Screen Detection <(add|set)Flags>" + ), + ( + r'(invoke-static \{[^\}]*\}, L[^\(]+;->isSecuredNow\(Landroid/view/Window;\)Z\s+(.line \d+\s+)*?move-result [pv]\d+\s+(.line \d+\s+)*?const/16 ([pv]\d+),) 0x2000', + r'\1 0x0', + "Bypassed Anti-Screen Detection " + ), + ( + r'(iget [pv]\d+, [pv]\d+, Landroid/view/WindowManager\$LayoutParams;->flags:I\s+(.line \d+\s+)*?or-int/lit16 [pv]\d+, [pv]\d+,) 0x2000', + r'\1 0x0', + "Bypassed Anti-Screen Detection " + ), + ( + r'(invoke-virtual \{([pv]\d+), ([pv]\d+)\}, Landroid/view/SurfaceView;->setSecure\(Z\)V)', + r'const/4 \3, 0x0\n\n\t\1', + "Bypassed Anti-Screen Detection " + ) + ] + ) + + + # ---------------- Remove USB Debugging ---------------- + if isUSB: + patterns.extend( + [ + ( + r'(const-string [pv]\d+, "development_settings_enabled"[^>]*invoke-static \{[^\}]*\}, L[^\(]+;->getInt\([^\)]*Ljava\/lang\/String;I\)I[^>]*)move-result ([pv]\d+)', + r'\1const/4 \2, 0x0', + 'Remove USB Debugging ' + ), + ( + r'(const-string [pv]\d+, "adb_enabled"[^>]*invoke-static \{[^\}]*\}, L[^\(]+;->getInt\([^\(]*Ljava\/lang\/String;I\)I[^>]*)move-result ([pv]\d+)', + r'\1const/4 \2, 0x0', + 'Remove USB Debugging ' + ) + ] + ) + + + Target_Regex = [p[0] for p in patterns] + + + # ---------------- Spoof Package Detection ---------------- + if isPKG: + counter = [1] + patterns.extend( + [ + ( + rf'{P.Match_Regex}', lambda m: + f'"com.Fuck.Me{(lambda x: counter.__setitem__(0, x+1) or x)(counter[0])}"', + 'Spoof Package Detection in Dex' + ), + ( + rf'{P.Match_Regex[1:-1]}', lambda m: + f'"com.Fuck.Me{(lambda x: counter.__setitem__(0, x+1) or x)(counter[0])}"', + 'Spoof Package Detection in Res' + ) + ] + ) + + + # ---------------- loadLibrary ➢ '_Pairip_CoreX' ---------------- + if isCoreX: + patterns.append( + ( + r'(\.method [^<]*\(\)V\s+.locals \d+\n)', + r'\1' + r' const-string v0, "_Pairip_CoreX"\n' + r' invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V\n', + f'CoreX_Hook ➸❥ {C.OG}"lib_Pairip_CoreX.so"' + ) + ) + + if isPKG: + smali_folders = [M.os.path.join(decompile_dir, 'resources' if isAPKEditor else 'res')] + smali_folders + + for smali_folder in smali_folders: + for root, _, files in M.os.walk(smali_folder): + for file in files: + if file.endswith(('.xml', '.smali') if isPKG else ('.smali')): + Smali_Paths.append(M.os.path.join(root, file)) + + try: + # ---------------- Multi Threading ---------------- + with M.Manager() as MT: + Count = MT.Value('i', 0); Lock = MT.Lock() + with M.Pool(M.cpu_count()) as PL: + Match_Smali = [path for path in PL.starmap(Regex_Scan, [(Smali_Path, Target_Regex, Count, Lock, isPKG, isCoreX) for Smali_Path in Smali_Paths]) if path] + + except Exception: + # ---------------- Single Threading ---------------- + Count = [0] + for Smali_Path in Smali_Paths: + result = Regex_Scan(Smali_Path, Target_Regex, Count, None, isPKG, isCoreX) + + if result: + Match_Smali.append(result) + + print(f" {C.G} ✔", flush=True) + + print(f'\n{C_Line}\n') + + if Match_Smali: + for pattern, replacement, description in patterns: + + Count_Applied = 0 + + Applied_Files = set() + + if description in Skip_Patch: + print(f"\n{C.S} Skip Patch {C.E} {C.OG}➸❥ {C.G}{description}\n") + + continue + + for file_path in Match_Smali: + if description.startswith("CoreX_Hook") and not file_path.endswith("VMRunner.smali"): + continue + + content = open(file_path, 'r', encoding='utf-8', errors='ignore').read() + + new_content = M.re.sub(pattern, replacement, content) + + if new_content != content: + if file_path not in Applied_Files: + Applied_Files.add(file_path) + + Count_Applied += 1 + + open(file_path, 'w', encoding='utf-8', errors='ignore').write(new_content) + + if Count_Applied > 0: + print(f"\n{C.S} Tag {C.E} {C.G}{description}") + + print(f"\n{C.S} Pattern {C.E} {C.OG}➸❥ {C.P}{pattern}") + + for file_path in Applied_Files: + print(f"{C.G} |\n └──── {C.CC}~{C.G}$ {C.Y}{M.os.path.basename(file_path)} {C.G} ✔") + + print( + f"\n{C.S} Pattern Applied {C.E} {C.OG}➸❥ {C.PN}{Count_Applied} {C.C}Time/Smali {C.G} ✔\n" + f"\n{C_Line}\n" + ) \ No newline at end of file diff --git a/ApkPatcher/Patch/Spoof_Patch.py b/ApkPatcher/Patch/Spoof_Patch.py new file mode 100644 index 0000000..19b09e6 --- /dev/null +++ b/ApkPatcher/Patch/Spoof_Patch.py @@ -0,0 +1,328 @@ +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + +from.Random_INFO import R_I; RI = R_I() + +C_Line = f"{C.CC}{'_' * 61}" + + +# ---------------- Generate IMEI ---------------- +def generate_imei(): + imei = ''.join(str(M.random.randint(0, 9)) for _ in range(14)) + check_digit = (sum(int(d) if i % 2 == 0 else sum(divmod(int(d) * 2, 10)) for i, d in enumerate(imei)) * 9) % 10 + return imei + str(check_digit) + + +isIMEI = generate_imei() + + +# ---------------- Generate lat lon hex ---------------- +def generate_lat_lon_hex(): + scale_factor = 10**12 + lat, lon = round(M.random.uniform(-90.0, 90.0), 6), round(M.random.uniform(-180.0, 180.0), 6) + lat_hex = hex(int(abs(lat) * scale_factor)) + "L" + lon_hex = hex(int(abs(lon) * scale_factor)) + "L" + return lat_hex, lon_hex + + +lat_hex, lon_hex = generate_lat_lon_hex() + + +# ---------------- Generate Mac Add ---------------- +def generate_mac_add(): + return ':'.join([''.join(M.random.choices('0123456789ABCDEF', k=2)) for _ in range(6)]) + + +isMac1, isMac2, isMac3, isMac4 = [generate_mac_add() for _ in range(4)] + + +# ---------------- Generate Device ID ---------------- +def generateDeviceId(): + volatile_seed = "12345" + seed = ''.join(M.random.choice(M.string.ascii_letters + M.string.digits) for _ in range(16)) + m = M.hashlib.md5() + m.update(seed.encode('utf-8') + volatile_seed.encode('utf-8')) + return m.hexdigest()[:16], seed + + +device_id, random_seed = generateDeviceId() + + +# ---------------- Regex Scan ---------------- +def Regex_Scan(Smali_Path, Target_Regex, Count, Lock): + + Smali = open(Smali_Path, 'r', encoding='utf-8', errors='ignore').read() + + Regexs = [M.re.compile(r) for r in Target_Regex] + + for Regex in Regexs: + if Regex.search(Smali): + + if Lock: + try: + with Lock: + Count.value += 1 + + print(f"\r{C.S} Find Target Smali {C.E} {C.OG}➸❥ {C.PN}{Count.value}", end='', flush=True) + + except Exception: + return None + + else: + Count[0] += 1 + + print(f"\r{C.S} Find Target Smali {C.E} {C.OG}➸❥ {C.PN}{Count[0]}", end='', flush=True) + + return Smali_Path + + +# ---------------- Patch Random Info ---------------- +def Patch_Random_Info(smali_folders, isID): + + RI.get_random_device_info() + + Smali_Paths, Match_Smali = [], [] + + patterns = [ + # ---------------- Build Info ---------------- + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->MANUFACTURER:Ljava/lang/String;', + rf'const-string \1, "{RI.is_manufacturer}"', + f"MANUFACTURER ➸❥ {C.OG}{RI.is_manufacturer}" + ), + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->BRAND:Ljava/lang/String;', + rf'const-string \1, "{RI.is_brand}"', + f"BRAND ➸❥ {C.OG}{RI.is_brand}" + ), + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->MODEL:Ljava/lang/String;', + rf'const-string \1, "{RI.is_model}"', + f"MODEL ➸❥ {C.OG}{RI.is_model}" + ), + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->PRODUCT:Ljava/lang/String;', + rf'const-string \1, "{RI.is_product}"', + f"PRODUCT ➸❥ {C.OG}{RI.is_product}" + ), + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->DEVICE:Ljava/lang/String;', + rf'const-string \1, "{RI.is_device}"', + f"DEVICE ➸❥ {C.OG}{RI.is_device}" + ), + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->BOARD:Ljava/lang/String;', + rf'const-string \1, "{RI.is_board}"', + f"BOARD ➸❥ {C.OG}{RI.is_board}" + ), + ( + r'invoke-static \{\}, Landroid/os/Build;->getRadioVersion\(\)Ljava/lang/String;[^>]*?move-result-object ([pv]\d+)', + rf'const-string \1, "Unknown"', + f"getRadioVersion ➸❥ {C.OG}Unknown" + ), + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->RADIO:Ljava/lang/String;', + rf'const-string \1, "Unknown"', + f"RADIO ➸❥ {C.OG}Unknown" + ), + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->HARDWARE:Ljava/lang/String;', + rf'const-string \1, "{RI.is_hardware}"', + f"HARDWARE ➸❥ {C.OG}{RI.is_hardware}" + ), + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->BOOTLOADER:Ljava/lang/String;', + rf'const-string \1, "Unknown"', + f"BOOTLOADER ➸❥ {C.OG}Unknown" + ), + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->FINGERPRINT:Ljava/lang/String;', + rf'const-string \1, "{RI.is_fingerprint}"', + f"FINGERPRINT ➸❥ {C.OG}{RI.is_fingerprint}" + ), + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->ID:Ljava/lang/String;', + rf'const-string \1, "{RI.is_id}"', + f"ID ➸❥ {C.OG}{RI.is_id}" + ), + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->SERIAL:Ljava/lang/String;', + rf'const-string \1, "Unknown"', + f"SERIAL ➸❥ {C.OG}Unknown" + ), + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->DISPLAY:Ljava/lang/String;', + rf'const-string \1, "{RI.is_display}"', + f"DISPLAY ➸❥ {C.OG}{RI.is_display}" + ), + ( + r'sget-object ([pv]\d+), Landroid/os/Build;->HOST:Ljava/lang/String;', + rf'const-string \1, "localhost"', + f"HOST ➸❥ {C.OG}localhost" + ), + ( + r'const-string [pv]\d+, "(?:generic|goldfish)"[^>]*?invoke-static \{[^\}]*\}, Landroid/os/Build;->get(?:Device|Hardware)\(\)Ljava/lang/String;[^>]*?move-result-object [pv]\d+[^>]*?invoke-virtual \{[^\}]*\}, Ljava/lang/String;->contains\(Ljava/lang/CharSequence;\)Z[^>]*?move-result ([pv]\d+)', + rf'const/4 \1, 0x0', + "Bypassed Device detection" + ), + + # ---------------- Mock Location & Update & PKG Install Fixed ---------------- + ( + r'(invoke-virtual \{[^\}]*\}, Landroid/location/Location;->getLongitude\(\)D[^>]*?)move-result-wide ([pv]\d+)', + rf'\1const-wide \2, {lon_hex}', + f"Longitude ➸❥ {C.OG}{lon_hex}" + ), + ( + r'(invoke-virtual \{[^\}]*\}, Landroid/location/Location;->getLatitude\(\)D[^>]*?)move-result-wide ([pv]\d+)', + rf'\1const-wide \2, {lat_hex}', + f"Latitude ➸❥ {C.OG}{lat_hex}" + ), + ( + r'invoke-virtual \{[^\}]*\}, Landroid/location/Location;->(?:isFromMockProvider|isMock)\(\)Z[^>]*?move-result ([pv]\d+)', + rf'const/4 \1, 0x0', + "Bypassed Mock Detection" + ), + ( + r'iget-object ([pv]\d+), [pv]\d+, L[^;]*;->ip:Ljava/lang/String;', + rf'const-string \1, "127.0.0.1"', + f"IP To LocalHost ➸❥ {C.OG}127.0.0.1" + ), + ( + r'(invoke-virtual \{[^\}]*\}, Landroid/content/pm/PackageManager;->getInstallerPackageName\(Ljava/lang/String;\)Ljava/lang/String;[^>]*?)move-result-object ([pv]\d+)', + r'\1const-string \2, "com.android.vending"', + "Fixed Installer" + ), + + # ---------------- Settings$Secure ---------------- + ( + r'(const-string [pv]\d+, "bluetooth_address"[^>]*?invoke-static \{[^\}]*\}, Landroid/provider/Settings\$Secure;->getString\(Landroid/content/ContentResolver;Ljava/lang/String;\)Ljava/lang/String;[^>]*?)move-result-object ([pv]\d+)', + rf'\1const-string \2, "{isMac1}"', + f"Bluetooth Address ➸❥ {C.OG}{isMac1}" + ), + + # ---------------- Network Info ---------------- + ( + r'(invoke-virtual \{[^\}]*\}, Landroid/net/wifi/WifiInfo;->getBSSID\(\)Ljava/lang/String;[^>]*?)move-result-object ([pv]\d+)', + rf'\1const-string \2, "{isMac2}"', + f"WifiInfo BSSID ➸❥ {C.OG}{isMac2}" + ), + ( + r'(invoke-virtual \{[^\}]*\}, Landroid/net/wifi/WifiInfo;->getMacAddress\(\)Ljava/lang/String;[^>]*?)move-result-object ([pv]\d+)', + rf'\1const-string \2, "{isMac3}"', + f"WifiInfo MacAddress ➸❥ {C.OG}{isMac3}" + ), + ( + r'(invoke-virtual \{[^\}]*\}, Landroid/bluetooth/BluetoothDevice;->getAddress\(\)Ljava/lang/String;[^>]*?)move-result-object ([pv]\d+)', + rf'\1const-string \2, "{isMac4}"', + f"BluetoothDevice Address ➸❥ {C.OG}{isMac4}" + ), + + # ---------------- Telephony Manager ---------------- + ( + r'(invoke-virtual \{[^\}]*\}, Landroid/telephony/TelephonyManager;->getDeviceId\(\)Ljava/lang/String;[^>]*?)move-result-object ([pv]\d+)', + rf'\1const-string \2, "{isIMEI}"', + f"IMEI NO (Device ID) ➸❥ {C.OG}{isIMEI}" + ), + + # ---------------- Fix Play ---------------- + ( + r'(invoke-interface \{[^\}]*\}, Lcom/google/android/vending/licensing/Policy;->allowAccess\(\)Z[^>]*?\s+)move-result ([pv]\d+)', + r'\1const/4 \2, 0x1', + "Bypass Client-Side LVL (allowAccess)" + ), + ( + r'(\.method [^(]*connectToLicensingService\(\)V\s+.locals \d+)[\s\S]*?(\s+return-void\n.end method)', + r'\1\2', + "connectToLicensingService" + ), + ( + r'(\.method [^(]*initializeLicenseCheck\(\)V\s+.locals \d+)[\s\S]*?(\s+return-void\n.end method)', + r'\1\2', + "initializeLicenseCheck" + ), + ( + r'(\.method [^(]*processResponse\(ILandroid/os/Bundle;\)V\s+.locals \d+)[\s\S]*?(\s+return-void\n.end method)', + r'\1\2', + "processResponse" + ) + ] + + if isID: + # ---------------- Custom Device ID ---------------- + patterns.append( + ( + r'(const-string [pv]\d+, "android_id"[^>]*?invoke-static \{[^\}]*\}, Landroid/provider/Settings\$Secure;->getString\(Landroid/content/ContentResolver;Ljava/lang/String;\)Ljava/lang/String;[^>]*?)move-result-object ([pv]\d+)', + rf'\1const-string \2, "{isID}"', + f"Custom Android ID ➸❥ {C.OG}{isID}" + ) + ) + else: + patterns.append( + ( + r'(const-string [pv]\d+, "android_id"[^>]*?invoke-static \{[^\}]*\}, Landroid/provider/Settings\$Secure;->getString\(Landroid/content/ContentResolver;Ljava/lang/String;\)Ljava/lang/String;[^>]*?)move-result-object ([pv]\d+)', + rf'\1const-string \2, "{device_id}"', + f"Random Android ID ➸❥ {C.OG}{device_id}" + ) + ) + + Target_Regex = [p[0] for p in patterns] + + for smali_folder in smali_folders: + for root, _, files in M.os.walk(smali_folder): + for file in files: + if file.endswith('.smali'): + Smali_Paths.append(M.os.path.join(root, file)) + + try: + # ---------------- Multi Threading ---------------- + with M.Manager() as MT: + Count = MT.Value('i', 0); Lock = MT.Lock() + with M.Pool(M.cpu_count()) as PL: + Match_Smali = [path for path in PL.starmap(Regex_Scan, [(Smali_Path, Target_Regex, Count, Lock) for Smali_Path in Smali_Paths]) if path] + + except Exception: + # ---------------- Single Threading ---------------- + Count = [0] + for Smali_Path in Smali_Paths: + result = Regex_Scan(Smali_Path, Target_Regex, Count, None) + + if result: + Match_Smali.append(result) + + print(f" {C.G} ✔", flush=True) + + print(f'\n{C_Line}\n') + + if Match_Smali: + for pattern, replacement, description in patterns: + + Count_Applied = 0 + + Applied_Files = set() + + for file_path in Match_Smali: + + content = open(file_path, 'r', encoding='utf-8', errors='ignore').read() + + new_content = M.re.sub(pattern, replacement, content) + + if new_content != content: + if file_path not in Applied_Files: + Applied_Files.add(file_path) + + Count_Applied += 1 + + open(file_path, 'w', encoding='utf-8', errors='ignore').write(new_content) + + if Count_Applied > 0: + print(f"\n{C.S} Tag {C.E} {C.G}{description}") + + print(f"\n{C.S} Pattern {C.E} {C.OG}➸❥ {C.P}{pattern}") + + for file_path in Applied_Files: + print(f"{C.G} |\n └──── {C.CC}~{C.G}$ {C.Y}{M.os.path.basename(file_path)} {C.G} ✔") + + print( + f"\n{C.S} Pattern Applied {C.E} {C.OG}➸❥ {C.PN}{Count_Applied} {C.C}Time/Smali {C.G} ✔\n" + f"\n{C_Line}\n" + ) \ No newline at end of file diff --git a/ApkPatcher/Patch/TG_Patch.py b/ApkPatcher/Patch/TG_Patch.py new file mode 100644 index 0000000..f0dfd01 --- /dev/null +++ b/ApkPatcher/Patch/TG_Patch.py @@ -0,0 +1,490 @@ +# TG Patch Inspired By AbhiTheM0dder Script + +# Link - https://github.com/AbhiTheModder/termux-scripts/blob/main/tgpatcher.py + +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() +from ApkPatcher.Utils.Files_Check import FileCheck + +F = FileCheck(); F.Set_Path() + +C_Line = f"{C.CC}{'_' * 61}" + + +# ---------------- Regex Scan ---------------- +def Regex_Scan(Smali_Path, Target_Regex, Count, Lock): + + Smali = open(Smali_Path, 'r', encoding='utf-8', errors='ignore').read() + + Regexs = [M.re.compile(r) for r in Target_Regex] + + matched_idx = [] + + for idx, Regex in enumerate(Regexs): + if Regex.search(Smali): + matched_idx.append(idx) + + if matched_idx: + if Lock: + try: + with Lock: + Count.value += 1 + print(f"\r{C.S} Find Target Smali {C.E} {C.OG}➸❥ {C.PN}{Count.value}", end='', flush=True) + except Exception: + return None + else: + Count[0] += 1 + print(f"\r{C.S} Find Target Smali {C.E} {C.OG}➸❥ {C.PN}{Count[0]}", end='', flush=True) + + return (Smali_Path, matched_idx) + + +# ---------------- TG Smali Patch ---------------- +def TG_Smali_Patch(decompile_dir, smali_folders, isAPKEditor): + + Smali_Paths, Smali_Files, Match_Smali = [], [], [] + + Target_Smali = [ + "TextCell.smali", + "UserConfig.smali", + "StoryViewer.smali", + "PhotoViewer.smali", + "AndroidUtilities.smali", + "TranslateAlert2.smali", + "MessageObject.smali", + "StoriesController.smali", + "MessagesStorage.smali", + "FileLoadOperation.smali", + "FlagSecureReason.smali", + "SecretMediaViewer.smali", + "MessagesController.smali", + "PaymentFormActivity.smali", + "PremiumPreviewFragment.smali", + "ProfileActivity$SearchAdapter.smali", + "PremiumPreviewFragment$Adapter.smali", + "ConnectionsManager$GoogleDnsLoadTask.smali", + "ConnectionsManager$ResolveHostByNameTask.smali" + ] + + + # ---------------- is scan Patterns ---------------- + scanPatterns = [ + # ---------------- Bypass SS ---------------- + ( + r'(iget-boolean ([pv]\d+), [pv]\d+, Lorg/telegram/ui/[^;]+;->allowScreenshots:Z)', + r'\1\nconst \2, 0x1', + "Bypass Anti-Screen ", + [] + ), + ( + r'(sget-boolean ([pv]\d+), Lorg/telegram/messenger/SharedConfig;->allowScreenCapture:Z)', + r'\1\nconst \2, 0x1', + "Bypass Anti-Screen ", + [] + ), + + # ---------------- Access Banned Channels [Related] ---------------- + ( + r'(iget-boolean ([pv]\d+), [pv]\d+, Lorg/telegram/[^;]+;->isRestrictedMessage:Z)', + r'\1\n\tconst \2, 0x0', + "Access Banned Channels [Related]", + [] + ), + + # ---------------- Enabling Saving Media Everywhere ---------------- + ( + r'(iget-boolean ([pv]\d+), [pv]\d+, Lorg/telegram/[^;]+;->noforwards:Z)', + r'\1\n\tconst \2, 0x0', + "enableSavingMedia", + [] + ), + + # ---------------- make premiumLocked bool false ---------------- + ( + r'(iget-boolean ([pv]\d+), [pv]\d+, Lorg/telegram/[^;]+;->premiumLocked:Z)', + r'\1\n\tconst \2, 0x0', + "premiumLocked ➢ False", + [] + ) + ] + + + # ---------------- is smali Patterns ( only For Target_Smali ) ---------------- + smaliPatterns = [ + # ---------------- Bypass SS ---------------- + ( + r'(const/16 [pv]\d+, 0x)200(0\s+(.line \d+\s+)*?invoke-virtual \{[^\}]*\}, Landroid/view/Window;->(?:add|set|clear)Flags\((?:I|II)\)V)', + r'\1\2', + "Bypass Anti-Screen <(add|set|clear)Flags>", + None + ), + ( + r'(const/16 [pv]\d+, 0x)200(0\n)', + r'\1\2', + "Bypass Anti-Screen <0x2000>", + ["AndroidUtilities.smali", "TranslateAlert2.smali", "StoryViewer.smali", "PaymentFormActivity.smali"] + ), + ( + r'(invoke-static \{[^\}]*\}, L[^\(]+;->isSecuredNow\(Landroid/view/Window;\)Z\s+(.line \d+\s+)*?move-result [pv]\d+\s+(.line \d+\s+)*?const/16 ([pv]\d+),) 0x2000', + r'\1 0x0', + "Bypass Anti-Screen ", + "FlagSecureReason.smali" + ), + ( + r'(\s+or-int/lit16 [pv]\d+, [pv]\d+,) 0x2000', + r'\1 0x0', + "Bypass Anti-Screen ", + ["PhotoViewer.smali", "SecretMediaViewer.smali"] + ), + ( + r'(invoke-virtual \{([pv]\d+), ([pv]\d+)\}, Landroid/view/SurfaceView;->setSecure\(Z\)V)', + r'const/4 \3, 0x0\n\n\t\1', + "Bypass Anti-Screen ", + "StoryViewer.smali" + ), + + # ---------------- Disable Signature Verification ---------------- + ( + r'(\.method public static getCertificateSHA256Fingerprint\(\)Ljava/lang/String;\n)[\S\s+]*?(\n.end method)', + r'\1\t.locals 1\n' + r' const-string v0, "49C1522548EBACD46CE322B6FD47F6092BB745D0F88082145CAF35E14DCC38E1"\n' + r' return-object v0\2', + "Disable Signature Verification", + "AndroidUtilities.smali" + ), + + # ---------------- markStoryAsRead ---------------- + ( + r'(\.method public markStoryAsRead\((JLorg/telegram/tgnet/tl/TL_stories\$StoryItem;|Lorg/telegram/tgnet/tl/TL_stories\$PeerStories;Lorg/telegram/tgnet/tl/TL_stories\$StoryItem;Z)\)Z\n)[\S\s+]*?(\s+return ([pv]\d+)\n.end method)', + r'\1\t.locals 4\n\tconst/4 \4, 0x0\3', + "markStoryAsRead", + "StoriesController.smali" + ), + + # ---------------- Premium ---------------- + ( + r'(\.method (?:private|public final) isPremium\(J\)Z\n)[\S\s+]*?(\n.end method)', + r'\1\t.locals 3\n\tconst/4 p1, 0x1\n\treturn p1\2', + "isPremium ➢ StoriesController", + "StoriesController.smali" + ), + ( + r'(\.method public isPremium\(\)Z\n)[\S\s]*?(\n.end method)', + r'\1\t.locals 1\n\tconst/4 v0, 0x1\n\treturn v0\2', + "isPremium ➢ UserConfig", + "UserConfig.smali" + ), + ( + r'(\.method (?:private|public final) isPremiumFeatureAvailable\(I\)Z\n(?:(?!\.end method)[\s\S])*?const/4 v1,) 0x0([\S\s+]*?\n.end method)', + r'\1 0x1\2', + "isPremiumFeatureAvailable", + "ProfileActivity$SearchAdapter.smali" + ), + ( + r'(\.method static synthetic access\$3000\(Lorg/telegram/ui/PremiumPreviewFragment;\)Z\n)(?:(?!\.end method)[\s\S])*?iget-boolean [pv]\d+, [pv]\d+, Lorg/telegram/ui/PremiumPreviewFragment;->forcePremium:Z[\S\s+]*?(\s+return ([pv]\d+)\n.end method)', + r'\1\t.locals 1\n\tconst/4 \3, 0x1\2', + "forcePremium", + "PremiumPreviewFragment.smali" + ), + + # ---------------- Secret Media Enable ---------------- + ( + r'(\.method public getSecretTimeLeft\(\)I\n(?:(?!\.end method)[\s\S])*?const/4 v1,) 0x0([\S\s+]*?\n.end method)', + r'\1 0x1\2', + "Secret Media Enable", + "MessageObject.smali" + ), + ( + r'(\.method public isSecretMedia\(\)Z\n(?:(?!\.end method)[\s\S])*?iget-object [pv]\d+, [pv]\d+, Lorg/telegram/messenger/MessageObject;->messageOwner:Lorg/telegram/tgnet/TLRPC\$Message;\s+instance-of [pv]\d+, [pv]\d+, Lorg/telegram/tgnet/TLRPC\$TL_message_secret;\s+)[\S\s+]*?(\n.end method)', + r'\1const/4 v3, 0x0\n\treturn v3\2', + "Secret Media Enable", + "MessageObject.smali" + ), + ( + r'(\.method public static isSecretPhotoOrVideo\(Lorg/telegram/tgnet/TLRPC\$Message;\)Z\n(?:(?!\.end method)[\s\S])*?instance-of [pv]\d+, [pv]\d+, Lorg/telegram/tgnet/TLRPC\$TL_message_secret;\s+)[\S\s+]*?(\n.end method)', + r'\1const/4 v2, 0x0\n\treturn v2\2', + "Secret Media Enable", + "MessageObject.smali" + ), + ( + r'(\.method public static isSecretMedia\(Lorg/telegram/tgnet/TLRPC\$Message;\)Z\n(?:(?!\.end method)[\s\S])*?instance-of [pv]\d+, [pv]\d+, Lorg/telegram/tgnet/TLRPC\$TL_message_secret;\s+)[\S\s+]*?(\n.end method)', + r'\1const/4 v2, 0x0\n\treturn v2\2', + "Secret Media Enable", + "MessageObject.smali" + ), + + # ---------------- isSponsored Check ---------------- + ( + r'(\.method public isSponsored\(\)Z\n)[\S\s]*?(\n.end method)', + r'\1\t.locals 3\n\tconst/4 v0, 0x0\n\treturn v0\2', + "isSponsored ➢ False", + "MessageObject.smali" + ), + ( + r'(\.method public isSponsoredDisabled\(\)Z\n)[\S\s]*?(\n.end method)', + r'\1\t.locals 3\n\tconst/4 v0, 0x1\n\treturn v0\2', + "isSponsoredDisabled ➢ True", + "MessagesController.smali" + ), + ( + r'(\.method private checkPromoInfoInternal\(Z\)V\n)[\S\s]*?(\n.end method)', + r'\1\t.locals 2\n\treturn-void\2', + "Remove Proxy Sponsored Channels", + "MessagesController.smali" + ), + + # ---------------- isChatNoForwards ---------------- + ( + r'(\.method public isChatNoForwards\((?:J|Lorg/telegram/tgnet/TLRPC\$Chat;)\)Z\n)[\S\s+]*?(\n.end method)', + r'\1\t.locals 3\n\tconst/4 p1, 0x0\n\treturn p1\2', + "isChatNoForwards ➢ forceForward", + "MessagesController.smali" + ), + + # ---------------- Access Banned Channels [Main] ---------------- + ( + r'(\.method public checkCanOpenChat\(Landroid/os/Bundle;Lorg/telegram/ui/ActionBar/BaseFragment;.*\)Z\n)[\S\s]*?(\n.end method)', + r'\1\t.locals 3\n\tconst/4 p1, 0x1\n\treturn p1\2', + "Access Banned Channels [Main]", + "MessagesController.smali" + ), + + # ---------------- dnsBooster ( ResolveHostByNameTask ) ---------------- + ( + r'"dns.google.com"', + r'"one.one.one.one"', + "+ CloudFlare DNS", + "ConnectionsManager$ResolveHostByNameTask.smali" + ), + ( + r'"https://www.google.com/resolve\?name="', + r'"https://cloudflare-dns.com/dns-query?name="', + "+ CloudFlare DNS Resolver", + "ConnectionsManager$ResolveHostByNameTask.smali" + ), + ( + r'(invoke-virtual \{[pv]\d+, ([pv]\d+), ([pv]\d+)\}, Ljava/net/URLConnection;->addRequestProperty\(Ljava/lang/String;Ljava/lang/String;\)V)(\s+(.line \d+\s+)*?const/16 [pv]\d+, 0x3e8)', + r'\1\n' + r' const-string \2, "accept"\n' + r' const-string \3, "application/dns-json"\n' + r' \1' + r' \4', + "+ CloudFlare Header", + "ConnectionsManager$ResolveHostByNameTask.smali" + ), + + # ---------------- dnsBooster ( GoogleDnsLoadTask ) ---------------- + ( + r'"https://dns.google.com/resolve\?name="', + r'"https://cloudflare-dns.com/dns-query?name="', + "+ CloudFlare DNS Resolver", + "ConnectionsManager$GoogleDnsLoadTask.smali" + ), + ( + r'("&type=)ANY(&random_padding=")', + r'\1TXT\2', + "DNS Type ANY To TXT", + "ConnectionsManager$GoogleDnsLoadTask.smali" + ), + ( + r'(invoke-virtual \{[pv]\d+, ([pv]\d+), ([pv]\d+)\}, Ljava/net/URLConnection;->addRequestProperty\(Ljava/lang/String;Ljava/lang/String;\)V)', + r'\1\n' + r' const-string \2, "accept"\n' + r' const-string \3, "application/dns-json"\n' + r' \1', + "+ CloudFlare Header", + "ConnectionsManager$GoogleDnsLoadTask.smali" + ), + + # ---------------- updateParams ---------------- + ( + r'(\.method private updateParams\(\)V\n(?:(?!\.end method)[\s\S])*?const/high16 v0,) 0x20000((?:(?!\.end method)[\s\S])*?)const/4 v0, 0x4([\S\s+]*?\n.end method)', + r'\1 0x80000\2const/16 v0, 0x8\3', + "updateParams ➢ SpeedBoost", + "FileLoadOperation.smali" + ), + + # ---------------- markMessagesAsDeleted ---------------- + ( + r'(\.method public markMessagesAsDeleted\(JIZZ\)Ljava/util/ArrayList;\s+\.locals \d+(\s+\.annotation[\s\S]*?.end annotation)?)', + r'\1\n' + r' sget-boolean v0, Lorg/telegram/abhi/Hook;->candelMessages:Z\n' + r' if-eqz v0, :cond_7\n' + r' const/4 p1, 0x0\n' + r' return-object p1\n' + r' :cond_7', + "markMessagesAsDeleted", + "MessagesStorage.smali" + ), + ( + r'(\.method public markMessagesAsDeleted\(JLjava/util/ArrayList;ZZII\)Ljava/util/ArrayList;\s+\.locals \d+(\s+\.annotation[\s\S]*?.end annotation)?)', + r'\1\n' + r' sget-boolean v0, Lorg/telegram/abhi/Hook;->candelMessages:Z\n' + r' if-eqz v0, :cond_7\n' + r' const/4 v1, 0x0\n' + r' return-object v1\n' + r' :cond_7', + "markMessagesAsDeleted", + "MessagesStorage.smali" + ), + + # ---------------- add setTextAndCheck_2 Method ---------------- + ( + r'((\.method public setTextAndCheck)(\(Ljava/lang/CharSequence;ZZ\)V[\S\s]*?)(\s+return-void\n.end method\n))', + r'\1\n\2_2\3\n' + r' invoke-virtual {p0}, Landroid/view/View;->getContext()Landroid/content/Context;\n' + r' move-result-object v1\n' + r' const-string v0, "Turned off"\n' + r' if-eqz p2, :cond_48\n' + r' const-string v0, "Turned on"\n' + r' :cond_48\n' + r' invoke-static {v1, v0, v2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;\n' + r' move-result-object v0\n' + r' invoke-virtual {v0}, Landroid/widget/Toast;->show()V\n' + r' if-eqz p2, :cond_55\n' + r' invoke-static {}, Lorg/telegram/abhi/Hook;->hook()V\n' + r' goto :goto_58\n' + r' :cond_55\n' + r' invoke-static {}, Lorg/telegram/abhi/Hook;->unhook()V\n' + r' :goto_58\n\4', + "add setTextAndCheck_2 Method", + "TextCell.smali" + ), + + # ---------------- Anti-Delete Messages ---------------- + ( + r'(invoke-virtual \{.*\}, Lorg/telegram/ui/Cells/TextCell;->setTextAndCheck)(\(Ljava/lang/CharSequence;ZZ\)V)', + r'\1_2\2', + "Rename setTextAndCheck_2", + "PremiumPreviewFragment$Adapter.smali" + ), + ( + r'sget ([pv]\d+), Lorg/telegram/messenger/R\$string;->ShowAds:I\s+(invoke-static \{.*\}, Lorg/telegram/messenger/LocaleController;->getString\(I\)Ljava/lang/String;\s+move-result-object [pv]\d+)', + r'const-string \1, "Do Not Delete Messages"', + "Do Not Delete Messages", + "PremiumPreviewFragment$Adapter.smali" + ), + ( + r'sget ([pv]\d+), Lorg/telegram/messenger/R\$string;->ShowAdsInfo:I\s+(invoke-static \{.*\}, Lorg/telegram/messenger/LocaleController;->getString\(I\)Ljava/lang/String;\s+move-result-object [pv]\d+)', + r'const-string \1, "After enabling or disabling the feature, ensure you revisit this page for the changes to take effect.\\nMod by Abhi"', + "Mod by Abhi", + "PremiumPreviewFragment$Adapter.smali" + ), + ( + r'sget ([pv]\d+), Lorg/telegram/messenger/R\$string;->ShowAdsTitle:I\s+(invoke-static \{.*\}, Lorg/telegram/messenger/LocaleController;->getString\(I\)Ljava/lang/String;\s+move-result-object [pv]\d+)', + r'const-string \1, "Anti-Delete Messages"\n' + r' invoke-virtual {v1, \1}, Lorg/telegram/ui/Cells/HeaderCell;->setText(Ljava/lang/CharSequence;)V\n' + r' return-void', + "Anti-Delete Messages", + "PremiumPreviewFragment$Adapter.smali" + ) + ] + + Target_Regex = [p[0] for p in scanPatterns] + + for smali_folder in smali_folders: + for root, _, files in M.os.walk(smali_folder): + for file in files: + full_path = M.os.path.join(root, file) + if file.endswith('.smali'): + Smali_Paths.append(full_path) + if file in Target_Smali: + Smali_Files.append(full_path) + + try: + # ---------------- Multiple Threading ---------------- + with M.Manager() as MT: + Count = MT.Value('i', 0); Lock = MT.Lock() + with M.Pool(M.cpu_count()) as PL: + Match_Smali = [path for path in PL.starmap(Regex_Scan, [(Smali_Path, Target_Regex, Count, Lock) for Smali_Path in Smali_Paths]) if path] + + except Exception: + # ---------------- Single Threading ---------------- + Count = [0] + for Smali_Path in Smali_Paths: + result = Regex_Scan(Smali_Path, Target_Regex, Count, None) + + if result: + Match_Smali.append(result) + + print(f" {C.G} ✔\n", flush=True) + + print(f"\n{C.X}{C.C} TG Patch, Script by {C.OG}🇮🇳 AbhiTheM0dder 🇮🇳") + + print(f'\n{C_Line}\n') + + allPatterns = scanPatterns + smaliPatterns + + isMatched = {} + + for is_Path, is_idx in Match_Smali: + if isinstance(is_idx, list): # Multi Match in Single Smali + for index in is_idx: + isMatched.setdefault(index, set()).add(is_Path) + else: + isMatched.setdefault(is_idx, set()).add(is_Path) + + for idx, (pattern, replacement, description, target_files) in enumerate(allPatterns): + + count_applied = 0 + applied_files= set() + + if target_files: + Map_Smali = set() + for Path in Smali_Files: + if isinstance(target_files, list): # Multi Smali + if M.os.path.basename(Path) in target_files: + Map_Smali.add(Path) + else: + if M.os.path.basename(Path) == target_files: + Map_Smali.add(Path) + else: + + if target_files is None: + Map_Smali = {X for X, _ in Match_Smali} + else: + Map_Smali = isMatched.get(idx, set()) + + for File_Path in Map_Smali: + content = open(File_Path, 'r', encoding='utf-8', errors='ignore').read() + + new_content = M.re.sub(pattern, replacement, content) + + if new_content != content: + applied_files.add(File_Path) + + count_applied += 1 + + open(File_Path, 'w', encoding='utf-8', errors='ignore').write(new_content) + + if count_applied > 0: + print(f"\n{C.S} Tag {C.E} {C.G}{description}") + print(f"\n{C.S} Pattern {C.E} {C.OG}➸❥ {C.P}{pattern}") + + for File_Path in applied_files: + print(f"{C.G} |\n └──── {C.CC}~{C.G}$ {C.Y}{M.os.path.basename(File_Path)} {C.G} ✔") + + print( + f"\n{C.S} Pattern Applied {C.E} {C.OG}➸❥ {C.PN}{count_applied} {C.C}Time/Smali {C.G} ✔\n" + f"\n{C_Line}\n" + ) + + Hook_Smali(decompile_dir, isAPKEditor) + + +# ---------------- Hook Smali ---------------- +def Hook_Smali(decompile_dir, isAPKEditor): + + targetSmali_Dir = M.os.path.join(decompile_dir, + *( + ['smali', 'classes'] if isAPKEditor else ['smali'] + ) + ) + + Target_Dest = M.os.path.join(targetSmali_Dir, "org", "telegram", "abhi", 'Hook.smali') + + M.os.makedirs(M.os.path.dirname(Target_Dest), exist_ok=True) + + M.shutil.copy(F.Hook_Smali, Target_Dest) + + print(f"\n{C.S} Generate {C.E} {C.G}Hook.smali {C.OG}➸❥ {C.Y}{M.os.path.relpath(Target_Dest, decompile_dir)} {C.G} ✔\n") \ No newline at end of file diff --git a/ApkPatcher/Patch/__init__.py b/ApkPatcher/Patch/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ApkPatcher/Utils/Anti_Splits.py b/ApkPatcher/Utils/Anti_Splits.py new file mode 100644 index 0000000..f9708d9 --- /dev/null +++ b/ApkPatcher/Utils/Anti_Splits.py @@ -0,0 +1,62 @@ +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + +from .Files_Check import FileCheck + +F = FileCheck(); F.Set_Path() + +C_Line = f"{C.CC}{'_' * 61}" + +Merge_Ext = ['.apks', '.apkm', '.xapk'] + + +# ---------------- Anti Split ---------------- +def Anti_Split(apk_path, isMerge, isCoreX): + + base_name, Ext = M.os.path.splitext(apk_path) + + if apk_path and isCoreX and M.os.path.splitext(apk_path)[-1].lower() not in Merge_Ext: + exit(f"\n{C.X}{C.C} Only Supported Extensions {C.G}{Merge_Ext} with {C.OG}CoreX\n") + + if Ext in Merge_Ext: + output_path = f"{base_name.replace(' ', '_')}.apk" + + print( + f"{C_Line}\n\n" + f"\n{C.X}{C.C} Anti-Split Start..." + ) + + print( + f"{C.G} |\n └──── {C.CC}Decompiling ~{C.G}$ java -jar {M.os.path.basename(F.APKEditor_Path)} m -i {apk_path} -f -o {output_path}" + + (" -extractNativeLibs true" if isCoreX else "") + + f"\n\n{C_Line}{C.G}\n" + ) + + cmd = ["java", "-jar", F.APKEditor_Path, "m", "-i", apk_path, "-f", "-o", output_path] + + if isCoreX: + cmd += ["-extractNativeLibs", "true"] + + try: + result = M.subprocess.run(cmd, check=True) + + print( + f"\n{C.X}{C.C} Anti-Split Successful {C.G} ✔\n" + f"\n{C_Line}\n" + ) + + if isMerge: + exit(0) + + return output_path + + except M.subprocess.CalledProcessError as e: + exit(f"\n{C.ERROR} Anti-Split Failed ! ✘\n") + + if isMerge and Ext not in Merge_Ext: + exit( + f"\n{C.ERROR} Split ✘\n\n" + f"\n{C.INFO} {C.C} Only Supported Extensions {C.G}{Merge_Ext}\n" + ) + + return apk_path \ No newline at end of file diff --git a/ApkPatcher/Utils/CRC.py b/ApkPatcher/Utils/CRC.py new file mode 100644 index 0000000..a26d8a7 --- /dev/null +++ b/ApkPatcher/Utils/CRC.py @@ -0,0 +1,54 @@ +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + + +# ---------------- Format Time ---------------- +def Format_Time(timestamp): + return M.datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S") + + +# ---------------- CRC Fix ---------------- +def CRC_Fix(apk_path, build_dir, file_types): + + Logs = [] + + origin_entries, mod_entries = [ + { + entry.filename: (entry.CRC, entry.date_time) + for entry in M.zipfile.ZipFile(file_path, 'r').infolist() + if any(file_type in entry.filename for file_type in file_types) + } for file_path in (apk_path, build_dir) + ] + + binary_content = open(build_dir, 'rb').read() + + for filename, (origin_crc, origin_time) in origin_entries.items(): + if filename in mod_entries and origin_crc != mod_entries[filename][0]: + origin_crc_bytes = origin_crc.to_bytes(4, 'little') + + mod_crc_bytes = mod_entries[filename][0].to_bytes(4, 'little') + + binary_content = binary_content.replace(mod_crc_bytes, origin_crc_bytes) + + Logs.append( + ( + filename, + f"{origin_crc:08x}", + f"{mod_entries[filename][0]:08x}", + Format_Time(M.datetime(*origin_time).timestamp()), + Format_Time(M.datetime(*mod_entries[filename][1]).timestamp()) + ) + ) + + open(build_dir, 'wb').write(binary_content) + + print(f"\n{'':20}✨ {C.G}CRCFix by {C.OG}Kirlif{C.G}' ✨\n") + + print(f"{C.C}{'File Name':<22}{'CRC':<12}{'FIX':<12}{'Modified'}") + + for e in Logs: + print(f"\n{C.G}{e[0]:<22}{e[1]}{'':<4}{e[2]}{'':<4}{e[4]}\n") + + print(f"{C.CC}{'_' * 61}\n\n") + + return build_dir \ No newline at end of file diff --git a/ApkPatcher/Utils/Credits.py b/ApkPatcher/Utils/Credits.py new file mode 100644 index 0000000..712dc83 --- /dev/null +++ b/ApkPatcher/Utils/Credits.py @@ -0,0 +1,28 @@ +from ..ANSI_COLORS import ANSI; C = ANSI() + + +# ---------------- Credits ---------------- +def Credits(): + exit(f""" + 💢 Credit 💢 + +{C.S} Flutter SSL & TG Patch {C.E}{C.G} 🇮🇳 AbhiTheM0dder 🇮🇳 {C.S}{C.P} @AbhiTheM0dder {C.E} + +{C.S} Pine Hook {C.E}{C.G} 🇮🇳 AbhiTheM0dder 🇮🇳 | 残页 {C.S}{C.P} @AbhiTheM0dder | @canyie {C.E} + +{C.S} MITM {C.E}{C.G} Niklas Higi {C.S}{C.P} https://github.com/shroudedcode/apk-mitm {C.E} + +{C.S} APKTool {C.E}{C.G} Connor Tumbleson {C.S}{C.P} @iBotPeaches {C.E} + +{C.S} APKEditor {C.E}{C.G} REAndroid {C.S}{C.P} @kikfox {C.E} + +{C.S} Uber-Apk-Signer {C.E}{C.G} Patrick Favre {C.S}{C.P} @patrickfav {C.E} + +{C.S} My Channel {C.E}{C.CC} 🇮🇳 ࿗ {C.OG}T̴͢͢e̴͢͢c̴͢͢h̴͢͢n̴͢͢o̴͢͢ {C.B}☣{C.G} I̴͢͢n̴͢͢d̴͢͢i̴͢͢a̴͢͢ {C.CC}࿗ 🇮🇳 {C.S}{C.P} @rktechnoindians {C.E} + +{C.S} CREATOR {C.E}{C.G} 𓄂 Ꭱꫝℑ 𓆐 ︻デ═一 ࿗ Я͓̽K͓̽ ࿗ {C.S}{C.P} @RK_TECHNO_INDIA {C.E} + + +{C.S} NOTE {C.E} {C.Y} Please Maintain Our Credits. 🙏🙏 + + """) \ No newline at end of file diff --git a/ApkPatcher/Utils/Decompile_Compile.py b/ApkPatcher/Utils/Decompile_Compile.py new file mode 100644 index 0000000..c13c7d5 --- /dev/null +++ b/ApkPatcher/Utils/Decompile_Compile.py @@ -0,0 +1,170 @@ +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + +from .Files_Check import FileCheck; + +F = FileCheck(); F.Set_Path(); F.isEmulator() + +C_Line = f"{C.CC}{'_' * 61}" + +SUGGEST = ( + f"{C_Line}\n\n" + f"\n{C.SUGGEST} Try With APKEditor, Flag {C.OG}-a" + f"\n |\n └──── {C.CC}~ Ex. {C.G}$ {C.OG}ApkPatcher {C.Y}{' '.join(M.sys.argv[1:])} {C.OG}-a\n" +) + + +# ---------------- Decompile APK ---------------- +def Decompile_Apk(apk_path, decompile_dir, isEmulator, isAPKEditor, isAES, isPine_Hook, Package_Name): + + A_P = F.APKTool_Path_E if isEmulator else F.APKTool_Path + + AA = f"{'APKEditor' if isAPKEditor else 'APKTool'}" + + print( + f"\n{C_Line}\n\n" + f"\n{C.X}{C.C} Decompile APK with {AA}..." + ) + + if isAPKEditor: + cmd = ["java", "-jar", F.APKEditor_Path, "d", "-i", apk_path, "-o", decompile_dir, "-f", "-no-dex-debug", "-dex-lib", "jf"] + + if isPine_Hook: + cmd += ["-dex"] + + print( + f"{C.G} |\n └──── {C.CC}Decompiling ~{C.G}$ java -jar {M.os.path.basename(F.APKEditor_Path)} d -i {apk_path} -o {M.os.path.basename(decompile_dir)} -f -no-dex-debug -dex-lib jf\n" + f"\n{C_Line}{C.G}\n" + ) + + else: + cmd = ["java", "-jar", A_P, "d", "-f", "--only-main-classes"] + (["--no-debug-info"] if isAES else []) + [apk_path, "-o", decompile_dir, "-p", decompile_dir] + + if isPine_Hook: + cmd += ["-s"] + + print( + f"{C.G} |\n └──── {C.CC}Decompiling ~{C.G}$ java -jar {M.os.path.basename(A_P)} d -f {apk_path} -o {M.os.path.basename(decompile_dir)}\n" + f"\n{C_Line}{C.G}\n" + ) + + try: + M.subprocess.run(cmd, check=True) + + print( + f"\n{C.X}{C.C} Decompile Successful {C.G} ✔\n" + f"\n{C_Line}\n\n" + ) + + except M.subprocess.CalledProcessError: + M.shutil.rmtree(decompile_dir) + + print(f"\n{C.ERROR} Decompile {Package_Name}.apk Failed with {AA} ✘\n") + + if not isAPKEditor: + print(SUGGEST) + + exit(1) + + +# ---------------- Recompile APK ---------------- +def Recompile_Apk(decompile_dir, apk_path, build_dir, isEmulator, isAPKEditor, Package_Name): + + A_P = F.APKTool_Path_E if isEmulator else F.APKTool_Path + + AA = f"{'APKEditor' if isAPKEditor else 'APKTool'}" + + print( + f"{C_Line}\n\n" + f"\n{C.X}{C.C} Recompile APK with {AA}..." + ) + + if isAPKEditor: + cmd = ["java", "-jar", F.APKEditor_Path, "b", "-i", decompile_dir, "-o", build_dir, "-f", "-dex-lib", "jf"] + + print( + f"{C.G} |\n └──── {C.CC}Recompiling ~{C.G}$ java -jar {M.os.path.basename(F.APKEditor_Path)} b -i {M.os.path.basename(decompile_dir)} -o {M.os.path.basename(build_dir)} -f -dex-lib jf\n" + f"\n{C_Line}{C.G}\n" + ) + + else: + cmd = ["java", "-jar", A_P, "b", "-f", decompile_dir, "-o", build_dir, "-p", decompile_dir] + + print( + f"{C.G} |\n └──── {C.CC}Recompiling ~{C.G}$ java -jar {M.os.path.basename(A_P)} b -f {M.os.path.basename(decompile_dir)} -o {M.os.path.basename(build_dir)}\n" + f"\n{C_Line}{C.G}\n" + ) + + try: + M.subprocess.run(cmd, check=True) + + print( + f"\n{C.X}{C.C} Recompile Successful {C.G} ✔\n" + f"\n{C_Line}\n" + ) + + except M.subprocess.CalledProcessError: + M.shutil.rmtree(decompile_dir) + + print(f"\n{C.ERROR} Recompile {Package_Name}.apk Failed with {AA}... ✘\n") + + if not isAPKEditor: + print(SUGGEST) + + exit(1) + + if M.os.path.exists(build_dir): + print( + f"\n{C.S} APK Created {C.E} {C.OG}➸❥ {C.Y}{build_dir} {C.G} ✔\n" + f"\n{C_Line}\n" + ) + + M.shutil.rmtree(decompile_dir) + + +# ---------------- FixSigBlock ---------------- +def FixSigBlock(decompile_dir, apk_path, build_dir, rebuild_dir): + + M.os.rename(build_dir, rebuild_dir) + + sig_dir = decompile_dir.replace('_decompiled', '_SigBlock') + + for operation in ["d", "b"]: + cmd = ["java", "-jar", F.APKEditor_Path, operation, "-t", "sig", "-i", (apk_path if operation == "d" else rebuild_dir), "-f", "-sig", sig_dir] + + if operation == "b": + cmd.extend(["-o", build_dir]) + + M.subprocess.run(cmd, check=True, text=True, capture_output=True) + + M.shutil.rmtree(sig_dir) + + M.os.remove(rebuild_dir) + + +# ---------------- Sign APK ---------------- +def Sign_APK(build_dir): + + cmd = ["java", "-jar", F.Sign_Jar, "-a", build_dir, "--overwrite"] + + print(f"\n{C.X}{C.C} Signing APK...") + + print( + f"{C.G} |\n └──── {C.CC}Signing ~{C.G}$ java -jar {M.os.path.basename(F.Sign_Jar)} --overwrite -a {build_dir}\n" + f"\n{C_Line}{C.G}\n" + ) + + try: + M.subprocess.run(cmd, check=True) + + print(f"\n{C.X}{C.C} Sign Successful {C.G} ✔\n") + + idsig_file = build_dir + ".idsig" + + if M.os.path.exists(idsig_file): + M.os.remove(idsig_file) + + print(f'{C_Line}\n\n') + + except M.subprocess.CalledProcessError: + exit(f"\n{C.ERROR} Sign Failed ! ✘\n") \ No newline at end of file diff --git a/ApkPatcher/Utils/Files/AES.smali b/ApkPatcher/Utils/Files/AES.smali new file mode 100644 index 0000000..f95835e --- /dev/null +++ b/ApkPatcher/Utils/Files/AES.smali @@ -0,0 +1,436 @@ +.class public LRK_TECHNO_INDIA/AES; +.super Ljava/lang/Thread; +# static fields +.field private static final PARAMETER_BUFFER:Ljava/lang/ThreadLocal; +.field private static final QUEUE:Ljava/util/concurrent/LinkedBlockingQueue; +.field private static final TIME_FORMAT1:Ljava/text/SimpleDateFormat; +.field private static final TIME_FORMAT2:Ljava/text/SimpleDateFormat; +# direct methods +.method static constructor ()V + .registers 2 + new-instance v0, Ljava/text/SimpleDateFormat; + const-string v1, "HH:mm:ss.SSS" + invoke-direct {v0, v1}, Ljava/text/SimpleDateFormat;->(Ljava/lang/String;)V + sput-object v0, LRK_TECHNO_INDIA/AES;->TIME_FORMAT1:Ljava/text/SimpleDateFormat; + new-instance v0, Ljava/text/SimpleDateFormat; + const-string v1, "yyyyMMddHHmmssSSS" + invoke-direct {v0, v1}, Ljava/text/SimpleDateFormat;->(Ljava/lang/String;)V + sput-object v0, LRK_TECHNO_INDIA/AES;->TIME_FORMAT2:Ljava/text/SimpleDateFormat; + new-instance v0, Ljava/util/concurrent/LinkedBlockingQueue; + invoke-direct {v0}, Ljava/util/concurrent/LinkedBlockingQueue;->()V + sput-object v0, LRK_TECHNO_INDIA/AES;->QUEUE:Ljava/util/concurrent/LinkedBlockingQueue; + new-instance v0, Ljava/lang/ThreadLocal; + invoke-direct {v0}, Ljava/lang/ThreadLocal;->()V + sput-object v0, LRK_TECHNO_INDIA/AES;->PARAMETER_BUFFER:Ljava/lang/ThreadLocal; + new-instance v0, LRK_TECHNO_INDIA/AES; + invoke-direct {v0}, LRK_TECHNO_INDIA/AES;->()V + const/4 v1, 0x1 + invoke-virtual {v0, v1}, LRK_TECHNO_INDIA/AES;->setDaemon(Z)V + invoke-virtual {v0}, LRK_TECHNO_INDIA/AES;->start()V + return-void +.end method +.method public constructor ()V + .registers 1 + invoke-direct {p0}, Ljava/lang/Thread;->()V + return-void +.end method +.method public static a(Ljava/lang/Object;)V + .registers 2 + invoke-static {p0}, LRK_TECHNO_INDIA/AES;->y(Ljava/lang/Object;)Ljava/lang/String; + move-result-object v0 + invoke-static {v0}, LRK_TECHNO_INDIA/AES;->z(Ljava/lang/String;)V + return-void +.end method +.method public static b()V + .registers 2 + sget-object v0, LRK_TECHNO_INDIA/AES;->PARAMETER_BUFFER:Ljava/lang/ThreadLocal; + invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object; + move-result-object v1 + check-cast v1, Ljava/lang/StringBuilder; + invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v1 + invoke-static {v1}, LRK_TECHNO_INDIA/AES;->z(Ljava/lang/String;)V + invoke-virtual {v0}, Ljava/lang/ThreadLocal;->remove()V + return-void +.end method +.method public static b1(Ljava/lang/Object;)V + .registers 3 + new-instance v0, Ljava/lang/StringBuilder; + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + const-string v1, "𝐃𝐚𝐭𝐚 ︻デ═一 " + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-static {p0}, LRK_TECHNO_INDIA/AES;->y(Ljava/lang/Object;)Ljava/lang/String; + move-result-object v1 + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v0 + invoke-static {v0}, LRK_TECHNO_INDIA/AES;->x(Ljava/lang/String;)V + return-void +.end method +.method public static b2(Ljava/lang/Object;)V + .registers 3 + new-instance v0, Ljava/lang/StringBuilder; + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + const-string v1, "𝐃𝐚𝐭𝐚/𝐊𝐞𝐲 ︻デ═一 " + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-static {p0}, LRK_TECHNO_INDIA/AES;->y(Ljava/lang/Object;)Ljava/lang/String; + move-result-object v1 + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v0 + invoke-static {v0}, LRK_TECHNO_INDIA/AES;->x(Ljava/lang/String;)V + return-void +.end method +.method public static b3(Ljava/lang/Object;)V + .registers 3 + new-instance v0, Ljava/lang/StringBuilder; + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + const-string v1, "𝐈𝐕/𝐊𝐞𝐲 ︻デ═一 " + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-static {p0}, LRK_TECHNO_INDIA/AES;->y(Ljava/lang/Object;)Ljava/lang/String; + move-result-object v1 + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v0 + invoke-static {v0}, LRK_TECHNO_INDIA/AES;->x(Ljava/lang/String;)V + return-void +.end method +.method public static b4(Ljava/lang/Object;)V + .registers 3 + new-instance v0, Ljava/lang/StringBuilder; + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + const-string v1, "𝐏𝐚𝐫𝐚𝐦𝐞𝐭𝐞𝐫 4 ︻デ═一 " + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-static {p0}, LRK_TECHNO_INDIA/AES;->y(Ljava/lang/Object;)Ljava/lang/String; + move-result-object v1 + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v0 + invoke-static {v0}, LRK_TECHNO_INDIA/AES;->x(Ljava/lang/String;)V + return-void +.end method +.method public static b5(Ljava/lang/Object;)V + .registers 3 + new-instance v0, Ljava/lang/StringBuilder; + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + const-string v1, "𝐏𝐚𝐫𝐚𝐦𝐞𝐭𝐞𝐫 5 ︻デ═一 " + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-static {p0}, LRK_TECHNO_INDIA/AES;->y(Ljava/lang/Object;)Ljava/lang/String; + move-result-object v1 + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v0 + invoke-static {v0}, LRK_TECHNO_INDIA/AES;->x(Ljava/lang/String;)V + return-void +.end method +.method public static b6(Ljava/lang/Object;)V + .registers 3 + new-instance v0, Ljava/lang/StringBuilder; + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + const-string v1, "𝐏𝐚𝐫𝐚𝐦𝐞𝐭𝐞𝐫 6 ︻デ═一 " + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-static {p0}, LRK_TECHNO_INDIA/AES;->y(Ljava/lang/Object;)Ljava/lang/String; + move-result-object v1 + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v0 + invoke-static {v0}, LRK_TECHNO_INDIA/AES;->x(Ljava/lang/String;)V + return-void +.end method +.method public static getInstance(Ljava/lang/Object;)V + .registers 3 + new-instance v0, Ljava/lang/StringBuilder; + invoke-direct {v0}, Ljava/lang/StringBuilder;->()V + const-string v1, "\ud835\ude3e\ud835\ude5e\ud835\ude65\ud835\ude5d\ud835\ude5a\ud835\ude67 \ud835\ude3c\ud835\ude61\ud835\ude5c\ud835\ude64\ud835\ude67\ud835\ude5e\ud835\ude69\ud835\ude5d\ud835\ude62 ︻デ═一 " + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-static {p0}, LRK_TECHNO_INDIA/AES;->y(Ljava/lang/Object;)Ljava/lang/String; + move-result-object v1 + invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v0 + invoke-static {v0}, LRK_TECHNO_INDIA/AES;->x(Ljava/lang/String;)V + return-void +.end method +.method private static x(Ljava/lang/String;)V + .registers 4 + sget-object v0, LRK_TECHNO_INDIA/AES;->PARAMETER_BUFFER:Ljava/lang/ThreadLocal; + invoke-virtual {v0}, Ljava/lang/ThreadLocal;->get()Ljava/lang/Object; + move-result-object v1 + check-cast v1, Ljava/lang/StringBuilder; + if-nez v1, :cond_13 + new-instance v2, Ljava/lang/StringBuilder; + invoke-direct {v2}, Ljava/lang/StringBuilder;->()V + move-object v1, v2 + invoke-virtual {v0, v1}, Ljava/lang/ThreadLocal;->set(Ljava/lang/Object;)V + :cond_13 + invoke-virtual {v1}, Ljava/lang/StringBuilder;->length()I + move-result v0 + if-lez v0, :cond_1e + const/16 v0, 0xa + invoke-virtual {v1, v0}, Ljava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder; + :cond_1e + invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + return-void +.end method + +.method private static y(Ljava/lang/Object;)Ljava/lang/String; + .registers 3 + if-nez p0, :cond_5 + const-string v0, "null" + return-object v0 + :cond_5 + invoke-virtual {p0}, Ljava/lang/Object;->getClass()Ljava/lang/Class; + move-result-object v0 + invoke-virtual {v0}, Ljava/lang/Class;->isArray()Z + move-result v1 + if-eqz v1, :cond_77 + const-class v1, [B + if-ne v0, v1, :cond_1b + move-object v1, p0 + check-cast v1, [B + invoke-static {v1}, Ljava/util/Arrays;->toString([B)Ljava/lang/String; + move-result-object v1 + return-object v1 + :cond_1b + const-class v1, [S + if-ne v0, v1, :cond_27 + move-object v1, p0 + check-cast v1, [S + invoke-static {v1}, Ljava/util/Arrays;->toString([S)Ljava/lang/String; + move-result-object v1 + return-object v1 + :cond_27 + const-class v1, [I + if-ne v0, v1, :cond_33 + move-object v1, p0 + check-cast v1, [I + invoke-static {v1}, Ljava/util/Arrays;->toString([I)Ljava/lang/String; + move-result-object v1 + return-object v1 + :cond_33 + const-class v1, [J + if-ne v0, v1, :cond_3f + move-object v1, p0 + check-cast v1, [J + invoke-static {v1}, Ljava/util/Arrays;->toString([J)Ljava/lang/String; + move-result-object v1 + return-object v1 + :cond_3f + const-class v1, [C + if-ne v0, v1, :cond_4b + move-object v1, p0 + check-cast v1, [C + invoke-static {v1}, Ljava/util/Arrays;->toString([C)Ljava/lang/String; + move-result-object v1 + return-object v1 + :cond_4b + const-class v1, [F + if-ne v0, v1, :cond_57 + move-object v1, p0 + check-cast v1, [F + invoke-static {v1}, Ljava/util/Arrays;->toString([F)Ljava/lang/String; + move-result-object v1 + return-object v1 + :cond_57 + const-class v1, [D + if-ne v0, v1, :cond_63 + move-object v1, p0 + check-cast v1, [D + invoke-static {v1}, Ljava/util/Arrays;->toString([D)Ljava/lang/String; + move-result-object v1 + return-object v1 + :cond_63 + const-class v1, [Z + if-ne v0, v1, :cond_6f + move-object v1, p0 + check-cast v1, [Z + invoke-static {v1}, Ljava/util/Arrays;->toString([Z)Ljava/lang/String; + move-result-object v1 + return-object v1 + :cond_6f + move-object v1, p0 + check-cast v1, [Ljava/lang/Object; + invoke-static {v1}, Ljava/util/Arrays;->deepToString([Ljava/lang/Object;)Ljava/lang/String; + move-result-object v1 + return-object v1 + :cond_77 + invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String; + move-result-object v1 + return-object v1 +.end method +.method private static z(Ljava/lang/String;)V + .registers 8 + const-string v0, "================== \ud83c\uddee\ud83c\uddf3 \ud835\ude3f\ud835\ude5a\ud835\ude58\ud835\ude67\ud835\ude6e\ud835\ude65\ud835\ude69\ud835\ude5a\ud835\ude59 \ud835\ude3d\ud835\ude6e \ud835\ude4f\ud835\ude5a\ud835\ude58\ud835\ude5d\ud835\ude63\ud835\ude64 \ud835\ude44\ud835\ude63\ud835\ude59\ud835\ude5e\ud835\ude56 \ud83c\uddee\ud83c\uddf3 ==================\n\n[RESULT]\n\n" + const-string v1, "[TIME]" + invoke-virtual {v0, v1}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z + move-result v2 + if-eqz v2, :cond_1c + sget-object v2, LRK_TECHNO_INDIA/AES;->TIME_FORMAT1:Ljava/text/SimpleDateFormat; + invoke-static {}, Ljava/lang/System;->currentTimeMillis()J + move-result-wide v3 + invoke-static {v3, v4}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long; + move-result-object v3 + invoke-virtual {v2, v3}, Ljava/text/SimpleDateFormat;->format(Ljava/lang/Object;)Ljava/lang/String; + move-result-object v2 + invoke-virtual {v0, v1, v2}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; + move-result-object v0 + :cond_1c + new-instance v1, Ljava/lang/Throwable; + invoke-direct {v1}, Ljava/lang/Throwable;->()V + invoke-virtual {v1}, Ljava/lang/Throwable;->getStackTrace()[Ljava/lang/StackTraceElement; + move-result-object v1 + const/4 v2, 0x2 + aget-object v1, v1, v2 + invoke-virtual {v1}, Ljava/lang/StackTraceElement;->getFileName()Ljava/lang/String; + move-result-object v2 + if-nez v2, :cond_30 + const-string v2, "Unknown Source" + :cond_30 + invoke-virtual {v1}, Ljava/lang/StackTraceElement;->getLineNumber()I + move-result v3 + if-ltz v3, :cond_4a + new-instance v4, Ljava/lang/StringBuilder; + invoke-direct {v4}, Ljava/lang/StringBuilder;->()V + invoke-virtual {v4, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + const-string v5, ":" + invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v4, v3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; + invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v2 + :cond_4a + const-string v4, "[RESULT]" + invoke-virtual {v0, v4, p0}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; + move-result-object v4 + invoke-virtual {v1}, Ljava/lang/StackTraceElement;->getClassName()Ljava/lang/String; + move-result-object v5 + const-string v6, "[CLASS]" + invoke-virtual {v4, v6, v5}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; + move-result-object v4 + invoke-virtual {v1}, Ljava/lang/StackTraceElement;->getMethodName()Ljava/lang/String; + move-result-object v5 + const-string v6, "[METHOD]" + invoke-virtual {v4, v6, v5}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; + move-result-object v4 + const-string v5, "[LOCATION]" + invoke-virtual {v4, v5, v2}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; + move-result-object v0 + sget-object v4, LRK_TECHNO_INDIA/AES;->QUEUE:Ljava/util/concurrent/LinkedBlockingQueue; + invoke-virtual {v4, v0}, Ljava/util/concurrent/LinkedBlockingQueue;->offer(Ljava/lang/Object;)Z + return-void +.end method +# virtual methods +.method public run()V + .registers 10 + const/4 v0, 0x0 + const-string v1, "[SDCARD]/MT2/logs/[PACKAGE]-[TIME].json" + invoke-static {}, Landroid/os/Environment;->getExternalStorageDirectory()Ljava/io/File; + move-result-object v2 + invoke-virtual {v2}, Ljava/io/File;->getPath()Ljava/lang/String; + move-result-object v2 + const-string v3, "[SDCARD]" + invoke-virtual {v1, v3, v2}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; + move-result-object v1 + const-string v2, "[PACKAGE]" + const-string v3, "PACKAGENAME" + invoke-virtual {v1, v2, v3}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; + move-result-object v1 + sget-object v2, LRK_TECHNO_INDIA/AES;->TIME_FORMAT2:Ljava/text/SimpleDateFormat; + invoke-static {}, Ljava/lang/System;->currentTimeMillis()J + move-result-wide v3 + invoke-static {v3, v4}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long; + move-result-object v3 + invoke-virtual {v2, v3}, Ljava/text/SimpleDateFormat;->format(Ljava/lang/Object;)Ljava/lang/String; + move-result-object v2 + const-string v3, "[TIME]" + invoke-virtual {v1, v3, v2}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; + move-result-object v1 + const/16 v2, 0x5c + const/16 v3, 0x2f + invoke-virtual {v1, v2, v3}, Ljava/lang/String;->replace(CC)Ljava/lang/String; + move-result-object v2 + const-string v3, "//" + const-string v4, "/" + invoke-virtual {v2, v3, v4}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; + move-result-object v1 + const/4 v2, 0x0 + :try_start_3e + new-instance v3, Ljava/io/File; + invoke-direct {v3, v1}, Ljava/io/File;->(Ljava/lang/String;)V + invoke-virtual {v3}, Ljava/io/File;->getParentFile()Ljava/io/File; + move-result-object v4 + if-eqz v4, :cond_4c + invoke-virtual {v4}, Ljava/io/File;->mkdirs()Z + :cond_4c + new-instance v5, Ljava/io/FileOutputStream; + const/4 v6, 0x1 + invoke-direct {v5, v3, v6}, Ljava/io/FileOutputStream;->(Ljava/io/File;Z)V + :try_end_52 + .catch Ljava/io/IOException; {:try_start_3e .. :try_end_52} :catch_54 + move-object v0, v5 + goto :goto_59 + :catch_54 + move-exception v3 + invoke-virtual {v3}, Ljava/io/IOException;->printStackTrace()V + move-object v2, v3 + :goto_59 + if-nez v0, :cond_9a + :try_start_5b + new-instance v3, Ljava/io/File; + const-string v4, "/data/data/PACKAGENAME/logs" + invoke-direct {v3, v4}, Ljava/io/File;->(Ljava/lang/String;)V + new-instance v4, Ljava/io/File; + new-instance v5, Ljava/lang/StringBuilder; + invoke-direct {v5}, Ljava/lang/StringBuilder;->()V + sget-object v6, LRK_TECHNO_INDIA/AES;->TIME_FORMAT2:Ljava/text/SimpleDateFormat; + invoke-static {}, Ljava/lang/System;->currentTimeMillis()J + move-result-wide v7 + invoke-static {v7, v8}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long; + move-result-object v7 + invoke-virtual {v6, v7}, Ljava/text/SimpleDateFormat;->format(Ljava/lang/Object;)Ljava/lang/String; + move-result-object v6 + invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + const-string v6, ".log" + invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + move-result-object v5 + invoke-direct {v4, v3, v5}, Ljava/io/File;->(Ljava/io/File;Ljava/lang/String;)V + invoke-virtual {v3}, Ljava/io/File;->mkdirs()Z + new-instance v5, Ljava/io/FileOutputStream; + invoke-direct {v5, v4}, Ljava/io/FileOutputStream;->(Ljava/io/File;)V + :try_end_8e + .catch Ljava/io/IOException; {:try_start_5b .. :try_end_8e} :catch_90 + move-object v0, v5 + goto :goto_9a + :catch_90 + move-exception v3 + invoke-virtual {v3}, Ljava/io/IOException;->printStackTrace()V + new-instance v4, Ljava/lang/RuntimeException; + invoke-direct {v4, v2}, Ljava/lang/RuntimeException;->(Ljava/lang/Throwable;)V + throw v4 + :cond_9a + :goto_9a + :try_start_9a + invoke-static {}, Ljava/nio/charset/Charset;->defaultCharset()Ljava/nio/charset/Charset; + move-result-object v3 + :goto_9e + sget-object v4, LRK_TECHNO_INDIA/AES;->QUEUE:Ljava/util/concurrent/LinkedBlockingQueue; + invoke-virtual {v4}, Ljava/util/concurrent/LinkedBlockingQueue;->take()Ljava/lang/Object; + move-result-object v5 + check-cast v5, Ljava/lang/String; + invoke-virtual {v5, v3}, Ljava/lang/String;->getBytes(Ljava/nio/charset/Charset;)[B + move-result-object v6 + invoke-virtual {v0, v6}, Ljava/io/FileOutputStream;->write([B)V + invoke-virtual {v4}, Ljava/util/concurrent/LinkedBlockingQueue;->isEmpty()Z + move-result v4 + if-eqz v4, :cond_b6 + invoke-virtual {v0}, Ljava/io/FileOutputStream;->flush()V + :try_end_b6 + .catch Ljava/lang/Exception; {:try_start_9a .. :try_end_b6} :catch_b7 + :cond_b6 + goto :goto_9e + :catch_b7 + move-exception v3 + new-instance v4, Ljava/lang/RuntimeException; + invoke-direct {v4, v3}, Ljava/lang/RuntimeException;->(Ljava/lang/Throwable;)V + throw v4 +.end method diff --git a/ApkPatcher/Utils/Files/Hook.smali b/ApkPatcher/Utils/Files/Hook.smali new file mode 100644 index 0000000..8970e89 --- /dev/null +++ b/ApkPatcher/Utils/Files/Hook.smali @@ -0,0 +1,75 @@ +.class public Lorg/telegram/abhi/Hook; +.super Ljava/lang/Object; +.source "SourceFile" + + +# static fields +.field public static candelMessages:Z + + +# direct methods +.method public constructor ()V + .registers 1 + + invoke-direct {p0}, Ljava/lang/Object;->()V + + return-void +.end method + +.method public static hook()V + .registers 1 + + const/4 v0, 0x1 + + .line 17 + invoke-static {v0}, Lorg/telegram/abhi/Hook;->setCanDelMessages(Z)V + + return-void +.end method + +.method public static setCanDelMessages(Z)V + .registers 4 + + sput-boolean p0, Lorg/telegram/abhi/Hook;->candelMessages:Z + + sget-object v0, Lorg/telegram/messenger/ApplicationLoader;->applicationContext:Landroid/content/Context; + + const-string v1, "mainconfig" + + const/4 v2, 0x0 + + invoke-virtual {v0, v1, v2}, Landroid/content/Context;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences; + + move-result-object v0 + + invoke-interface {v0}, Landroid/content/SharedPreferences;->edit()Landroid/content/SharedPreferences$Editor; + + move-result-object v0 + + const-string v1, "candelMessages" + + invoke-interface {v0, v1, p0}, Landroid/content/SharedPreferences$Editor;->putBoolean(Ljava/lang/String;Z)Landroid/content/SharedPreferences$Editor; + + move-result-object v0 + + invoke-interface {v0}, Landroid/content/SharedPreferences$Editor;->apply()V + + return-void +.end method + +.method public static unhook()V + .registers 1 + + .line 23 + sget-boolean v0, Lorg/telegram/abhi/Hook;->candelMessages:Z + + if-eqz v0, :cond_8 + + const/4 v0, 0x0 + + .line 24 + invoke-static {v0}, Lorg/telegram/abhi/Hook;->setCanDelMessages(Z)V + + :cond_8 + return-void +.end method \ No newline at end of file diff --git a/ApkPatcher/Utils/Files/__init__.py b/ApkPatcher/Utils/Files/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ApkPatcher/Utils/Files/lib_Pairip_CoreX.so b/ApkPatcher/Utils/Files/lib_Pairip_CoreX.so new file mode 100644 index 0000000..fabd2cb Binary files /dev/null and b/ApkPatcher/Utils/Files/lib_Pairip_CoreX.so differ diff --git a/ApkPatcher/Utils/Files_Check.py b/ApkPatcher/Utils/Files_Check.py new file mode 100644 index 0000000..dfa4f24 --- /dev/null +++ b/ApkPatcher/Utils/Files_Check.py @@ -0,0 +1,196 @@ +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + +from importlib.metadata import version + +__version__ = version("ApkPatcherX") + + +# ---------------- Set Path ---------------- +run_dir = M.os.path.dirname(M.os.path.abspath(M.sys.argv[0])) +script_dir = M.os.path.dirname(M.os.path.abspath(__file__)) + +files_dir = M.os.path.join(script_dir, "Files") +pine_dir = M.os.path.join(script_dir, "Pine") +M.os.makedirs(files_dir, exist_ok=True) +M.os.makedirs(pine_dir, exist_ok=True) + + +class FileCheck: + # ---------------- Set Jar & Files Paths ---------------- + def Set_Path(self): + + # ---------------- Jar Tools ---------------- + self.APKTool_Path, self.APKEditor_Path, self.Sign_Jar = ( + M.os.path.join(run_dir, jar) + for jar in ("APKTool.jar", "APKEditor.jar", "Uber-Apk-Signer.jar") + ) + + # ---------------- HooK Files ---------------- + self.AES_Smali, self.Hook_Smali, self.Pairip_CoreX = ( + M.os.path.join(files_dir, files) + for files in ("AES.smali", "Hook.smali", "lib_Pairip_CoreX.so") + ) + + # ---------------- Pine HooK ---------------- + self.config, self.libpine32, self.libpine64, self.loader = ( + M.os.path.join(pine_dir, pine) + for pine in ("config.json", "libpine32", "libpine64", "loader.dex") + ) + + + def isEmulator(self): + self.APKTool_Path_E = M.os.path.join(run_dir, "APKTool_OR.jar") + + + # ---------------- SHA-256 CheckSum ---------------- + def Calculate_CheckSum(self, file_path): + sha256_hash = M.hashlib.sha256() + try: + with open(file_path, "rb") as f: + for byte_block in iter(lambda: f.read(4096), b""): + sha256_hash.update(byte_block) + return sha256_hash.hexdigest() + except FileNotFoundError: + return None + + + # ---------------- Download Files ---------------- + def Download_Files(self, Jar_Files): + + import requests + + for File_URL, File_Path, Expected_CheckSum in Jar_Files: + File_Name = M.os.path.basename(File_Path) + + if M.os.path.exists(File_Path): + if self.Calculate_CheckSum(File_Path) == Expected_CheckSum: + continue + else: + print( + f"{C.ERROR} {C.C}{File_Name} {C.R}is Corrupt (Checksum Mismatch). ✘\n" + f"\n{C.INFO} Re-Downloading, Need Internet Connection.\n" + ) + + M.os.remove(File_Path) + + try: + Version = requests.get("https://raw.githubusercontent.com/TechnoIndian/ApkPatcher/main/VERSION").text.strip() + + if Version != str(__version__): + print(f"\n{C.S} Updating {C.E} {C.OG} ApkPatcher ➸❥ {C.G}{Version}...\n\n") + + if M.os.name == "nt": + cmd = "pip install --force-reinstall git+https://github.com/TechnoIndian/ApkPatcher.git" + else: + cmd = "pip install --force-reinstall https://github.com/TechnoIndian/ApkPatcher/archive/refs/heads/main.zip" + + M.subprocess.run(cmd, shell=isinstance(cmd, str), check=True) + + print(f'\n{C.S} Downloading {C.E} {C.G}{File_Name}') + + with requests.get(File_URL, stream=True) as response: + if response.status_code == 200: + total_size = int(response.headers.get('content-length', 0)) + + with open(File_Path, 'wb') as f: + print(f' |') + + for data in response.iter_content(1024 * 64): + f.write(data) + + print(f"\r {C.CC}╰┈ PS {C.OG}➸❥ {C.G}{f.tell()/(1024*1024):.2f}/{total_size/(1024*1024):.2f} MB ({f.tell()/total_size*100:.1f}%)", end='', flush=True) + + print(' ✔\n') + + else: + exit( + f'\n\n{C.ERROR} Failed to download {C.Y}{File_Name} {C.R}Status Code: {response.status_code} ✘\n' + f'\n{C.INFO} Restart Script...\n' + ) + + except requests.exceptions.RequestException: + exit( + f'\n\n{C.ERROR} Got an error while Fetching {C.Y}{File_Path}\n' + f'\n{C.ERROR} No internet Connection\n' + f'\n{C.INFO} Internet Connection is Required to Download {C.Y}{File_Name}\n' + ) + + + # ---------------- Files Download Link ---------------- + def F_D(self): + + self.Download_Files( + [ + ( + "https://github.com/TechnoIndian/Tools/releases/download/Tools/APKEditor.jar", + self.APKEditor_Path, + "6b766e71ed5f4c7cce338e74a1ab786cc1ecc1896d9f37f9f1bf639398e5eadc" + ), + ( + "https://github.com/TechnoIndian/Tools/releases/download/Tools/APKTool.jar" if M.os.name == 'nt' else "https://github.com/TechnoIndian/Tools/releases/download/Tools/APKTool_Termux.jar", + + self.APKTool_Path, + + "d0a81361670b17b713fea45baec3ed04b26bc8b69b30bde9a6f367c13fc25697" if M.os.name == 'nt' else "e00bcfd10d38318e0f52a4666da472cd4e5683a74a0c0d7fc82a362a59b338a9" + ), + ( + "https://github.com/TechnoIndian/Tools/releases/download/Tools/Uber-Apk-Signer.jar", + self.Sign_Jar, + "e1299fd6fcf4da527dd53735b56127e8ea922a321128123b9c32d619bba1d835" + ), + ( + "https://raw.githubusercontent.com/TechnoIndian/Objectlogger/refs/heads/main/Hook.smali", + self.Hook_Smali, + "c62ac39b468eeda30d0732f947ab6c118f44890a51777f7787f1b11f8f3722c4" + ), + ( + "https://raw.githubusercontent.com/TechnoIndian/Objectlogger/refs/heads/main/AES.smali", + self.AES_Smali, + "09db8c8d1b08ec3a2680d2dc096db4aa8dd303e36d0e3c2357ef33226a5e5e52" + ), + ( + "https://github.com/TechnoIndian/Tools/releases/download/Tools/lib_Pairip_CoreX.so", + self.Pairip_CoreX, + "22a7954092001e7c87f0cacb7e2efb1772adbf598ecf73190e88d76edf6a7d2a" + ), + + # ---------------- Pine HooK Source ---------------- + ( + "https://github.com/TechnoIndian/PineHookPlus/releases/download/v1.0/config.json", + self.config, + "da5eef2fa153068e19fca6fabfd144fbb9d7075a61e333814369bd36c51289c1" + ), + ( + "https://github.com/TechnoIndian/PineHookPlus/releases/download/v1.0/libpine32", + self.libpine32, + "94854417f9bbb4e2dc49a5edede51dfc1eafca2c7cbb163f59585da7d97fc5db" + ), + ( + "https://github.com/TechnoIndian/PineHookPlus/releases/download/v1.0/libpine64", + self.libpine64, + "d3e415243b80b866d2c75408cc9a26ba4fcab0775f798442f9a622097d845e0c" + ), + ( + "https://github.com/TechnoIndian/PineHookPlus/releases/download/v1.0/loader.dex", + self.loader, + "c23fcc7aac75d3ea760523876dc837b6506726194c2fe4376d5172c8271b7c46" + ), + ] + ) + + M.os.system('cls' if M.os.name == 'nt' else 'clear') + + + # ---------------- Files Download isEmulator ---------------- + def F_D_A(self): + + self.Download_Files( + [ + ( + "https://github.com/TechnoIndian/Tools/releases/download/Tools/APKTool.jar", + self.APKTool_Path_E, + "d0a81361670b17b713fea45baec3ed04b26bc8b69b30bde9a6f367c13fc25697" + ) + ] + ) \ No newline at end of file diff --git a/ApkPatcher/Utils/Pine/__init__.py b/ApkPatcher/Utils/Pine/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ApkPatcher/Utils/Pine/config.json b/ApkPatcher/Utils/Pine/config.json new file mode 100644 index 0000000..e3f5c34 --- /dev/null +++ b/ApkPatcher/Utils/Pine/config.json @@ -0,0 +1,84 @@ +{ + "com.pinehook.plus.MainActivity": { + "argMethod": { + "paramTypes": [ + "boolean" + ], + "before": { + "args": [ + false + ], + "result": true + }, + "after": { + "result": false + } + }, + "anotherMethod": { + "paramTypes": [ + "int" + ], + "before": { + "args": [ + 100 + ], + "result": 200 + }, + "after": { + "result": 300 + } + }, + "yetAnotherMethod": { + "before": { + "result": true + }, + "after": { + "result": false + } + }, + "beforeOnlyMethod": { + "paramTypes": [ + "java.lang.String" + ], + "before": { + "args": [ + "modifiedBefore" + ] + } + }, + "afterOnlyMethod": { + "paramTypes": [ + "java.lang.String" + ], + "after": { + "result": "modifiedAfter" + } + } + }, + "com.pinehook.plus.ConstructorClass": { + "constructor": { + "paramTypes": [ + "boolean", + "java.lang.String", + "boolean", + "long", + "long", + "java.lang.String", + "java.lang.String", + "java.lang.String" + ], + "before": { + "args": [ + true, + "PlayStore", + false, + 0, + 0, + "null", + "Yearly", + "null" + ] + } + } + } +} \ No newline at end of file diff --git a/ApkPatcher/Utils/Pine/libpine32 b/ApkPatcher/Utils/Pine/libpine32 new file mode 100644 index 0000000..df3856a Binary files /dev/null and b/ApkPatcher/Utils/Pine/libpine32 differ diff --git a/ApkPatcher/Utils/Pine/libpine64 b/ApkPatcher/Utils/Pine/libpine64 new file mode 100644 index 0000000..aee972e Binary files /dev/null and b/ApkPatcher/Utils/Pine/libpine64 differ diff --git a/ApkPatcher/Utils/Pine/loader.dex b/ApkPatcher/Utils/Pine/loader.dex new file mode 100644 index 0000000..4a88a1a Binary files /dev/null and b/ApkPatcher/Utils/Pine/loader.dex differ diff --git a/ApkPatcher/Utils/Scan.py b/ApkPatcher/Utils/Scan.py new file mode 100644 index 0000000..ccae387 --- /dev/null +++ b/ApkPatcher/Utils/Scan.py @@ -0,0 +1,118 @@ +from ..ANSI_COLORS import ANSI; C = ANSI() +from ..MODULES import IMPORT; M = IMPORT() + +from .Files_Check import FileCheck + +F = FileCheck(); F.Set_Path(); + +EX = f"{C.P}\n |\n ╰{C.CC}┈{C.OG}➢ {C.G}ApkPatcher {' '.join(M.sys.argv[1:])} {C.OG}" + + +# ---------------- Scan APK ---------------- +def Scan_Apk(apk_path, isFlutter, isPairip): + + print(f"\n{C.CC}{'_' * 61}\n") + + Package_Name = '' + + if M.os.name == 'posix': + # ---------------- Extract Package Name with AAPT ---------------- + Package_Name = M.subprocess.run( + ['aapt', 'dump', 'badging', apk_path], + capture_output=True, text=True + ).stdout.split("package: name='")[1].split("'")[0] + + if Package_Name: + print(f"\n{C.S} Package Name {C.E} {C.OG}➸❥ {C.P}'{C.G}{Package_Name}{C.P}' {C.G} ✔") + + + # ---------------- Extract Package Name with APKEditor ---------------- + if not Package_Name: + Package_Name = M.subprocess.run( + ["java", "-jar", F.APKEditor_Path, "info", "-package", "-i", apk_path], + capture_output=True, text=True + ).stdout.split('"')[1] + + print(f"\n{C.S} Package Name {C.E} {C.OG}➸❥ {C.P}'{C.G}{Package_Name}{C.P}' {C.G} ✔") + + + + # ---------------- Check Flutter / Pairip Protection ---------------- + isPairip_lib = isFlutter_lib = False + + with M.zipfile.ZipFile(apk_path, 'r') as zip_ref: + for item in zip_ref.infolist(): + if item.filename.startswith('lib/'): + if item.filename.endswith('libpairipcore.so'): + isPairip_lib = True + if item.filename.endswith('libflutter.so'): + isFlutter_lib = True + + + # ---------------- Check Flutter Protection ---------------- + if isFlutter_lib: + def check_java_installation(): + try: + M.subprocess.run(['radare2', '-v'], capture_output=True, text=True) + except (M.subprocess.CalledProcessError, FileNotFoundError): + if M.os.name == 'posix': + for pkg in ['radare2']: + try: + + result = M.subprocess.run(['pkg', 'list-installed'], capture_output=True, text=True) + + if pkg not in result.stdout: + print(f"\n{C.S} Installing {C.E} {C.OG}➸❥ {C.G}{pkg}...\n") + M.subprocess.check_call(['pkg', 'install', '-y', pkg]) + + M.os.system('cls' if M.os.name == 'nt' else 'clear') + + except (M.subprocess.CalledProcessError, Exception): + exit( + f"\n\n{C.ERROR} No Internet Connection. ✘\n" + f"\n{C.INFO} Internet Connection is Required to Installation {C.G} pkg install {pkg}\n" + ) + else: + exit( + f"\n\n{C.ERROR} Radare2 is not installed on Your System. ✘\n" + f"\n{C.INFO} Install Radare2 and Run Script Again in New CMD.\n" + f"\n{C.INFO} Verify Radare2 Installation {C.G} radare2 -v" + ) + + check_java_installation() + + FP = f"\n\n{C.S} Flutter Protection {C.E} {C.OG}➸❥ {C.P}'{C.G}libflutter.so{C.P}' {C.G} ✔" + + if not isFlutter: + exit( + f"{FP}\n\n" + f"\n{C.WARN} This is Flutter APK, So For SSL Bypass , Use {C.G} -f {C.B}Flag:\n\n" + f"\n{C.INFO} If APK is Flutter, Then Use Additional Flag: {C.OG}-f" + f"{EX}-f {C.Y}-c certificate.cert\n" + ) + + else: + if isFlutter: + print(FP) + + + # ---------------- Check Pairip Protection ---------------- + if isPairip_lib: + PP = f"\n\n{C.S} Pairip Protection {C.E} {C.OG}➸❥ {C.P}'{C.G}libpairipcore.so{C.P}' {C.G} ✔" + + if not isPairip: + exit( + f"{PP}\n\n" + f"\n{C.WARN} This is Pairip APK, So For SSL Bypass, Use {C.G} -p {C.C} / {C.G} -p -x {C.C}( ) {C.B}Flag:\n\n" + f"\n{C.INFO} If APK is Pairip, Then Use Additional Flag: {C.OG}-p {C.P}( Without Sign APK Use Only in VM / Multi_App )" + f"{EX}-p {C.Y}-c certificate.cert\n\n" + f"\n{C.INFO} If APK is Pairip, Then Hook CoreX & Use Additional Flag: {C.OG}-p -x {C.P}( Install Directly Only For [ arm64 ] )" + f"{EX}-p -x {C.Y}-c certificate.cert\n\n" + f"\n{C.INFO} Note Both Method Not Stable, May be APK Crash {C.P}( So Try Your Luck ) 😂\n" + ) + + else: + if isPairip: + print(PP) + + return Package_Name, isFlutter_lib, isPairip_lib \ No newline at end of file diff --git a/ApkPatcher/Utils/__init__.py b/ApkPatcher/Utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ApkPatcher/__init__.py b/ApkPatcher/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9cc1137 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Techno India + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 3519e66..29b91ae 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,232 @@ +

+ +

+ + + + # ApkPatcher + +

+ +

+ + +Installation Method +------- +**💢 Requirement PKG 💢** + +```bash +termux-setup-storage +pkg update -y +pkg upgrade -y +pkg install python -y +``` + +**👉🏻 To install ApkPatcher, Run only any one cmd from the Installation Method** + +**💢 PYPI ( Just Testing ) 💢** + + pip install ApkPatcherX + +[![PyPI](https://img.shields.io/badge/pypi-3776AB?style=for-the-badge&logo=python&logoColor=FFD43B)](https://pypi.org/project/ApkPatcherX) [![Version](https://img.shields.io/pypi/v/ApkPatcherX?label=&style=for-the-badge&color=FF8C00&labelColor=FF8C00)](https://pypi.org/project/ApkPatcherX) + + +**1st. Method** + +`💢 For Latest Commit ( From Main  Branch )  💢` + + pip install --force-reinstall https://github.com/TechnoIndian/ApkPatcher/archive/refs/heads/main.zip + +`OR` + + pip install --force-reinstall https://github.com/TechnoIndian/ApkPatcher/archive/refs/heads/main.tar.gz + +`OR` + + curl -Ls https://github.com/TechnoIndian/Tools/releases/download/Tools/ApkPatcher.sh | bash + +**2nd. Method** + + pkg install python git && pip install git+https://github.com/TechnoIndian/ApkPatcher.git + + +Uninstall ApkPatcher +----- + + pip uninstall ApkPatcherX + + +# Usage Example + + +ApkPatcher ( Input Mode ) +----- + +**Mode `-i` ➸ Smali Patcher ( Input Your APK Path )** + +`Default Patch is VPN & SSL Bypass` + + ApkPatcher -i YourApkPath.apk + +**Flag: `-a` ➸ Try with APKEditor ( Default APKTool )** + + ApkPatcher -i YourApkPath.apk -a + +**Flag: `-c` ➸ Embed Your Captural APK's Certificate** + +`With Your Certificate ( Input Your .pem / .crt / .cert Path )` + +`If you have already installed your certificate under CA Certificates in your device settings, then you don’t need to use the "-c YourCertificatePath.cert" parameter, because the user certificate is already trusted by network_security_config.xml` + + ApkPatcher -i YourApkPath.apk -c YourCertificatePath.cert + +`Multiple Certificate` + + ApkPatcher -i YourApkPath.apk -c /sdcard/HttpCanary/certs/HttpCanary.pem /sdcard/Download/Reqable/reqable-ca.crt /sdcard/Download/ProxyPinCA.crt + +**Flag: `-e` ➸ If using emulator on PC** + + ApkPatcher -i YourApkPath.apk -e + +**Flag: `-u` ➸ Keep UnSigned APK** + + ApkPatcher -i YourApkPath.apk -u + + +Smali Patcher ( Additional Flags ) +----- + +**Flag: `-f` / `-p` / `-p -x` ➸ Flutter & Pairip SSL Bypass** + +`For Flutter, Script By 🇮🇳 AbhiTheM0dder 🇮🇳` + + ApkPatcher -i YourApkPath.apk -f + +`For Pairip ( UnSigned APK, Use Only in VM / Multi App )` + + ApkPatcher -i YourApkPath.apk -p + +`CoreX HooK For Pairip ( Install Directly, Only For [ arm64 ] )` + + ApkPatcher -i YourApkPath.apk -p -x + +**Flag: `-D` ➸ Hook Android ID For One Device Login Bypass** + +`Input Your 16 Digit Android ID` + + ApkPatcher -i YourApkPath.apk -D 7e9f51f096bd5c83 + +**Flag: `-pkg` ➸ Spoof Package Detection ( Dex / Manifest / Res )** + + ApkPatcher -i YourApkPath.apk -pkg + +**Flag: `-P` ➸ Purchase / Paid / Price** + + ApkPatcher -i YourApkPath.apk -P + +**Flag: `-rmss` / `-rmusb` ➸ Bypass Screen / USB Restriction** + +`Bypass Screenshot Restriction` + + ApkPatcher -i YourApkPath.apk -rmss + +`Bypass USB Debugging` + + ApkPatcher -i YourApkPath.apk -rmusb + +**Flag: `-skip` ➸ Skip Patch (e.g., getAcceptedIssuers)** + + ApkPatcher -i YourApkPath.apk -skip getAcceptedIssuers + + +AES Patcher ( Additional Flags ) +----- + +**Flag: `-A` ➸ AES MT Logs Inject** + + ApkPatcher -i YourApkPath.apk -A + +`Do U Want Separate AES.smali Dex` + + ApkPatcher -i YourApkPath.apk -A -s + + +Spoof Patcher ( Additional Flags ) +----- + +**Flag: `-r` ➸ Random / Fake / Spoof Device Info** + + ApkPatcher -i YourApkPath.apk -r + +`Input Your 16 Digit Custom Android ID` + + ApkPatcher -i YourApkPath.apk -r -D 7e9f51f096bd5c83 + + +Ads Patcher ( Additional Flags ) +----- + +**Flag: `-rmads` ➸ Remove Ads** + + ApkPatcher -i YourApkPath.apk -rmads + + +TG Patcher ( Additional Flags ) +----- + +**Flag: `-t` ➸ Telegram / Plus Patch, Script By 🇮🇳 AbhiTheM0dder 🇮🇳** + + ApkPatcher -i YourApkPath.apk -t + + +Pine Hook ( Additional Flags ) +----- + +**Flag: `-pine -l` ➸ -pine -l ( Input Path of Xposed & LSP Module )** + +`Mutil Path Supported, But module path should not contain space or symbols.` + + ApkPatcher -i YourApkPath.apk -pine -l NoVPNDetect.apk just.trust.me.apk + + +ApkPatcher ( Merge Mode ) +----- + +**Mode `-m` ➸ Anti-Split ( Only Merge APK )** + +`Supported Extensions ( .apks / .apkm / .xapk )` + + ApkPatcher -m YourApkPath.apks + + +ApkPatcher ( Credits Mode ) +----- + +**Mode `-C` ➸ Credits** + + ApkPatcher -C + + +ApkPatcher Help +----- + + ApkPatcher -h + + +ApkPatcher Other Patch Flags +----- + + ApkPatcher -O + + +# NOTE + + +## 🇮🇳 Welcome By Techno India 🇮🇳 + +[![Telegram](https://img.shields.io/badge/TELEGRAM-CHANNEL-red?style=for-the-badge&logo=telegram)](https://t.me/rktechnoindians) +

+[![Telegram](https://img.shields.io/badge/TELEGRAM-OWNER-red?style=for-the-badge&logo=telegram)](https://t.me/RK_TECHNO_INDIA) +

\ No newline at end of file diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..e6adf3f --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.4 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..f173b5f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,60 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "ApkPatcherX" +dynamic = ["version"] +authors = [ + { name = "RK_TECHNO_INDIA", email = "TechnoIndian786@gmail.com" } +] + +description = "Smali Patcher ( Bypass 𒁍 SSL & Flutter SSL, VPN, USB Debugging, Screen Restrict, One Device Login, Spoof Info & Package Detection, Ads, AES Logs Inject, TG Patch, Pine HooK )" + +license = { text = "MIT" } +readme = "README.md" + +requires-python = ">=3.12" + +dependencies = [ + "requests", + "r2pipe", + "asn1crypto", + "multiprocess" +] + +keywords = ["ApkPatcher"] + +classifiers = [ + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", +] + +[project.scripts] +ApkPatcher = "ApkPatcher.APK_PATCHER:RK_Techno_IND" +apkpatcher = "ApkPatcher.APK_PATCHER:RK_Techno_IND" + +[tool.setuptools] +include-package-data = true + +packages.find = {} + +package-data = { ApkPatcher = [ + "Utils/Files/AES.smali", + "Utils/Files/Hook.smali", + "Utils/Files/lib_Pairip_CoreX.so", + "Utils/Pine/config.json", + "Utils/Pine/libpine32", + "Utils/Pine/libpine64", + "Utils/Pine/loader.dex" +] } + + +[project.urls] +Homepage = "https://github.com/TechnoIndian/ApkPatcher" +Repository = "https://github.com/TechnoIndian/ApkPatcher.git" +Issues = "https://github.com/TechnoIndian/ApkPatcher/issues" + +[tool.setuptools.dynamic] +version = { file = "VERSION" } \ No newline at end of file