# 这是一个示例 Python 脚本。 # 按 Shift+F10 执行或将其替换为您的代码。 # 按 双击 Shift 在所有地方搜索类、文件、工具窗口、操作和设置。 import glob import json import logging import os import re import shutil import subprocess import threading import xml.etree.ElementTree as ET import zipfile import win32api import win32con import yaml import requests test_dir = "D:\\work\\llfz_60027_朱雀2_2" game_path = r"\\10.8.230.114\public\测试组\20230228\三国战纪2Y\jskc_60031_zhuq2_1.0.5.apk" work_path = "D:\\work" def list_file(): smali_list = [i for i in os.listdir(test_dir) if 'smali' in i] print(smali_list) for dirpath, dirnames, filenames in os.walk(test_dir): # print('dirpath:', dirpath) # print('dirnames:', dirnames) if 'smali' in dirpath and 'gson' in dirnames: print(dirpath, dirnames) new_smali_dir = os.path.join(test_dir, f'smali_classes{len(smali_list) + 1}', 'com\\google') os.makedirs(new_smali_dir) shutil.move(os.path.join(dirpath, 'gson'), new_smali_dir) break def move_game_apk_to_work(): cmd_move_str = f'copy {game_path} {work_path}' print(cmd_move_str) result = subprocess.getoutput(cmd_move_str) print(result) def isNeedReplaceApplicationLine(line): return '.super Landroid/app/Application;' in line \ or 'invoke-direct {p0}, Landroid/app/Application;->()V' in line \ or 'invoke-super {p0, p1}, Landroid/app/Application;->attachBaseContext(Landroid/content/Context;)V' in line \ or 'invoke-super {p0, p1}, Landroid/app/Application;->onConfigurationChanged(Landroid/content/res/Configuration;)V' in line \ or 'invoke-super {p0}, Landroid/app/Application;->onLowMemory()V' in line \ or 'invoke-super {p0}, Landroid/app/Application;->onTerminate()V' in line \ or 'invoke-super {p0, p1}, Landroid/app/Application;->onTrimMemory(I)V' in line \ or 'invoke-super {p0}, Landroid/app/Application;->onCreate()V' in line def is_kf_replace_application(line): return '.super Lcom/kf/framework/KFApplication;' in line \ or 'invoke-direct {p0}, Lcom/kf/framework/KFApplication;->()V' in line \ or 'invoke-super {p0, p1}, Lcom/kf/framework/KFApplication;->attachBaseContext(Landroid/content/Context;)V' in line \ or 'invoke-super {p0, p1}, Lcom/kf/framework/KFApplication;->onConfigurationChanged(Landroid/content/res/Configuration;)V' in line \ or 'invoke-super {p0}, Lcom/kf/framework/KFApplication;->onLowMemory()V' in line \ or 'invoke-super {p0}, Lcom/kf/framework/KFApplication;->onTerminate()V' in line \ or 'invoke-super {p0, p1}, Lcom/kf/framework/KFApplication;->onTrimMemory(I)V' in line \ or 'invoke-super {p0}, Lcom/kf/framework/KFApplication;->onCreate()V' in line def replace_application_verify_xmy_bug(decompile_dir): for dirpath, dirnames, filenames in os.walk(decompile_dir): if r'com\oasis\android' in dirpath and 'OasisApplication.smali' in filenames: application_path = os.path.join(dirpath, "OasisApplication.smali") print(application_path) with open(application_path, "r") as f: smali_str_arr = f.readlines() for line in smali_str_arr: if not is_kf_replace_application(line) and 'Lcom/kf/framework/KFApplication' in line: smali_str_arr[smali_str_arr.index(line)] = line.replace('Lcom/kf/framework/KFApplication', 'Landroid/app/Application') if isNeedReplaceApplicationLine(line): smali_str_arr[smali_str_arr.index(line)] = line.replace('Landroid/app/Application', 'Lcom/kf/framework/KFApplication') with open(application_path, "w") as f: f.write(''.join(smali_str_arr)) def is_rose_replace_application(line): return '.super Lcom/ydzs/framework/YDZSApplication;' in line \ or 'invoke-direct {p0}, Lcom/ydzs/framework/YDZSApplication;->()V' in line \ or 'invoke-super {p0, p1}, Lcom/ydzs/framework/YDZSApplication;->attachBaseContext(Landroid/content/Context;)V' in line \ or 'invoke-super {p0, p1}, Lcom/ydzs/framework/YDZSApplication;->onConfigurationChanged(Landroid/content/res/Configuration;)V' in line \ or 'invoke-super {p0}, Lcom/ydzs/framework/YDZSApplication;->onLowMemory()V' in line \ or 'invoke-super {p0}, Lcom/ydzs/framework/YDZSApplication;->onTerminate()V' in line \ or 'invoke-super {p0, p1}, Lcom/ydzs/framework/YDZSApplication;->onTrimMemory(I)V' in line \ or 'invoke-super {p0}, Lcom/ydzs/framework/YDZSApplication;->onCreate()V' in line def replace_application_verify_rose_bug(decompile_dir): for dirpath, dirnames, filenames in os.walk(decompile_dir): if r'com\oasis\android' in dirpath and 'OasisApplication.smali' in filenames: application_path = os.path.join(dirpath, "OasisApplication.smali") print(application_path) with open(application_path, "r") as f: smali_str_arr = f.readlines() for line in smali_str_arr: if not is_rose_replace_application(line) and 'Lcom/ydzs/framework/YDZSApplication' in line: smali_str_arr[smali_str_arr.index(line)] = line.replace('Lcom/ydzs/framework/YDZSApplication', 'Landroid/app/Application') if isNeedReplaceApplicationLine(line): smali_str_arr[smali_str_arr.index(line)] = line.replace('Landroid/app/Application', 'Lcom/ydzs/framework/YDZSApplication') with open(application_path, "w") as f: f.write(''.join(smali_str_arr)) r_regex_str = r'sget[^\n]*R\$layout[^\n]*I|sget[^\n]*R\$id[^\n]*I|sget[^\n]*R\$drawable[^\n]*I|sget[^\n]*R\$string[^\n]*I|sget[^\n]*R\$array[^\n]*I|sget[^\n]*R\$bool[^\n]*I|sget[^\n]*R\$integer[^\n]*I' def find_kf_resource_and_replace(smali_file_path, regex_str): with open(smali_file_path, 'r') as f: smali_str = f.read() pattern = re.compile(regex_str) resource_arr = pattern.findall(smali_str) for r_str in resource_arr: virtual_name = r_str[r_str.index(' ') + 1:r_str.index(',')] print(virtual_name) resource_type = r_str[r_str.index('R$') + 2:r_str.index(';')].capitalize() print(resource_type) resource_name = r_str[r_str.index('->') + 2:r_str.index(':')] print(resource_name) new_r_str = "const-string %s, \"%s\"\n\n\tinvoke-static {%s}, Lcom/kf/framework/MommyUtils;->get%sId(Ljava/lang/String;)I\n\n\tmove-result %s" % ( virtual_name, resource_name, virtual_name, resource_type, virtual_name) print(new_r_str) smali_str = smali_str.replace(r_str, new_r_str) with open(smali_file_path, 'w') as f: f.write(smali_str) def find_rose_resource_and_replace(smali_file_path, regex_str): with open(smali_file_path, 'r') as f: smali_str = f.read() pattern = re.compile(regex_str) resource_arr = pattern.findall(smali_str) for r_str in resource_arr: virtual_name = r_str[r_str.index(' ') + 1:r_str.index(',')] print(virtual_name) resource_type = r_str[r_str.index('R$') + 2:r_str.index(';')].capitalize() print(resource_type) resource_name = r_str[r_str.index('->') + 2:r_str.index(':')] print(resource_name) new_r_str = "const-string %s, \"%s\"\n\n\tinvoke-static {%s}, Lcom/ydzs/framework/MommyUtils;->get%sId(Ljava/lang/String;)I\n\n\tmove-result %s" % ( virtual_name, resource_name, virtual_name, resource_type, virtual_name) print(new_r_str) smali_str = smali_str.replace(r_str, new_r_str) with open(smali_file_path, 'w') as f: f.write(smali_str) def replaceRoseResource(d_dir): for dirpath, dirnames, filenames in os.walk(d_dir): if r'com\wm\shh\zx' in dirpath: for smali_file in filenames: smali_file_path = os.path.join(dirpath, smali_file) print(smali_file_path) find_rose_resource_and_replace(smali_file_path, r_regex_str) def meta_constructor(loader, node): value = loader.construct_mapping(node) return value def modifyYaml(yaml_path): yaml.add_constructor(u'tag:yaml.org,2002:brut.androlib.meta.MetaInfo', meta_constructor) file = open(yaml_path, 'r', encoding='utf-8') yaml_result = yaml.load(file) print(yaml_result) # print(yaml_result) def modify_json(json_path): with open(json_path, 'r+', encoding='utf-8') as jsonFile: data = json.load(jsonFile) data['app']['is_need_privacy_protection'] = False jsonFile.seek(0) json.dump(data, jsonFile, ensure_ascii=False) jsonFile.truncate() def unZipAndCopyCl(game_dir): game_name = '' for name in os.listdir(game_dir): if '小绵羊' not in name and '朱雀' not in name and '九狐' not in name: game_name = name print(game_name) file_name = os.path.join(game_dir, game_name) print(file_name) yb_unzip_path = r"D:\work\yb_files" zip_file = zipfile.ZipFile(file_name) if os.path.isdir(file_name + "_files"): pass else: print('Problem occurred during generating libdoc for', os.mkdir(yb_unzip_path)) for names in zip_file.namelist(): zip_file.extract(names, yb_unzip_path) zip_file.close() os.rename(os.path.join(yb_unzip_path, 'classes.dex'), os.path.join(yb_unzip_path, 'cl')) shutil.copy(os.path.join(yb_unzip_path, 'cl'), r'D:\special_problem\破天一剑') shutil.rmtree(yb_unzip_path) # 解决酷派新sdk在android6.0闪退问题 def fix_kupai_android6_crash(decompile_dir): insert_str_list = [ '\n\t.locals 0\n\n', '\tinvoke-static {}, Ljava/util/Locale;->getDefault()Ljava/util/Locale;\n\n', '\tmove-result-object p0\n\n', '\treturn-object p0\n\n'] for dirpath, dirnames, filenames in os.walk(decompile_dir): if r'com\yulong\appdata\a' in dirpath and 'e.smali' in filenames: smali_path = os.path.join(dirpath, 'e.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = '.method public static d(Landroid/content/Context;)Ljava/util/Locale;' end_method_str = '.end method' insert_str = ''.join(insert_str_list) on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break print(on_create_index, insert_index) del smali_str_arr[on_create_index + 1:insert_index] smali_str_arr.insert(on_create_index + 1, insert_str) with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) break def fix_old_kupai_recharge_phone_permission_crash(decompile_dir): insert_str_list = [ '\n\t.locals 1\n\n', '\tconst-string v0, ""\n\n', '\treturn-object v0\n\n'] for dirpath, dirnames, filenames in os.walk(decompile_dir): if r'com\yulong\android\paysdk\base\b\c' in dirpath and 'e.smali' in filenames: smali_path = os.path.join(dirpath, 'e.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = '.method public static b(Landroid/content/Context;)Ljava/lang/String;' end_method_str = '.end method' insert_str = ''.join(insert_str_list) on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break print(on_create_index, insert_index) del smali_str_arr[on_create_index + 1:insert_index] smali_str_arr.insert(on_create_index + 1, insert_str) with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) break def fix_android8_bug_xmy(decompile_dir): style_xml_path = os.path.join(decompile_dir, 'res', 'values', 'styles.xml') xml_tree = ET.parse(style_xml_path) xml_root = xml_tree.getroot() style_roots = xml_root.findall('./style') for style_root in style_roots: if style_root.get('name') == 'kf_splash_translucent': items = style_root.findall('./item') for item in items: print('item name', item.get('name')) print(item.findtext('.')) if item.get('name') == 'android:windowIsTranslucent': item.text = 'false' xml_tree.write(style_xml_path, encoding='utf-8', xml_declaration=True) break namespace = '{http://schemas.android.com/apk/res/android}' ET.register_namespace('android', 'http://schemas.android.com/apk/res/android') manifest_path = os.path.join(decompile_dir, 'AndroidManifest.xml') xml_tree = ET.parse(manifest_path) xml_root = xml_tree.getroot() act_list = xml_root.findall('.//activity') for act in act_list: act_name = act.get(f'{namespace}name') print(act_name) if 'com.yog.kothoth.view.activity.SSShoppingMallActivity' == act_name or 'com.yog.kothoth.view.activity.SSRechargeActivity' == act_name: act_theme = act.get(f'{namespace}theme') print('act_theme', act_theme) act.set(f'{namespace}theme', '@style/kf_splash_translucent') xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True) break def fix_android8_bug_rose(decompile_dir): style_xml_path = os.path.join(decompile_dir, 'res', 'values', 'styles.xml') xml_tree = ET.parse(style_xml_path) xml_root = xml_tree.getroot() style_roots = xml_root.findall('./style') for style_root in style_roots: if style_root.get('name') == 'ydzs_splash_translucent': items = style_root.findall('./item') for item in items: print('item name', item.get('name')) print(item.findtext('.')) if item.get('name') == 'android:windowIsTranslucent': item.text = 'false' xml_tree.write(style_xml_path, encoding='utf-8', xml_declaration=True) break namespace = '{http://schemas.android.com/apk/res/android}' ET.register_namespace('android', 'http://schemas.android.com/apk/res/android') manifest_path = os.path.join(decompile_dir, 'AndroidManifest.xml') xml_tree = ET.parse(manifest_path) xml_root = xml_tree.getroot() act_list = xml_root.findall('.//activity') for act in act_list: act_name = act.get(f'{namespace}name') print(act_name) if 'com.wanwu.sdkkit.gameplatform.activity.RechargeActivity' == act_name: act_theme = act.get(f'{namespace}theme') print('act_theme', act_theme) act.set(f'{namespace}theme', '@style/ydzs_splash_translucent') xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True) break # # 新版sdk取消登录调不起登录,并且关闭了新增 # def modify_cancel_login_and_fubiao_and_close_login(decompile_dir): # insert_str_list = [ # '\n\tconst-string v0, "\\u670d\\u52a1\\u5668\\u8fd4\\u56de\\u9519\\u8bef"\n\n', # '\tinvoke-virtual {p2, v0}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z\n\n', # '\tmove-result v0\n\n', # '\tif-nez v0, :cond_1\n\n', # '\tinvoke-static {}, Lcom/yog/kothoth/YogSDK;->getInstance()Lcom/yog/kothoth/YogSDK;\n\n', # '\tmove-result-object v0\n\n', # '\tiget-object v1, p0, Lcom/yulong/sdk/promoter/PromoterGameAuthApi$4;->val$activity:Landroid/app/Activity;\n\n', # '\tcheck-cast v1, Landroid/content/Context;\n\n', # '\tinvoke-virtual {v0, v1}, Lcom/yog/kothoth/YogSDK;->login(Landroid/content/Context;)V\n\n', # '\t:cond_1\n\n'] # for dirpath, dirnames, filenames in os.walk(decompile_dir): # if r'com\yulong\sdk\promoter' in dirpath and 'PromoterGameAuthApi$4.smali' in filenames: # smali_path = os.path.join(dirpath, 'PromoterGameAuthApi$4.smali') # print(smali_path) # with open(smali_path, 'r', encoding='utf-8') as f: # smali_str_arr = f.readlines() # index_str = r'sdk\u767b\u9646\u5931\u8d25:' # end_method_str = 'Lcom/yulong/sdk/promoter/PromoterGameAuthApi;->showLog(Ljava/lang/String;)V' # insert_str = ''.join(insert_str_list) # on_create_index = 0 # insert_index = 0 # for line in smali_str_arr: # if index_str in line: # on_create_index = smali_str_arr.index(line) # print('on_create_index', on_create_index, line) # break # for index, value in enumerate(smali_str_arr): # if index > on_create_index and end_method_str in value: # insert_index = index # print('insert_index', index) # break # print(on_create_index, insert_index) # smali_str_arr.insert(insert_index+1, insert_str) # with open(smali_path, 'w', encoding='utf-8') as f: # f.write(''.join(smali_str_arr)) # # if r'com\yog\kothoth\floatwindow' in dirpath and 'YogFloatWindow.smali' in filenames: # smali_path = os.path.join(dirpath, 'YogFloatWindow.smali') # with open(smali_path, 'r', encoding='utf-8') as f: # smali_str_arr = f.readlines() # for line in smali_str_arr: # if '0x1f4' in line: # smali_str_arr[smali_str_arr.index(line)] = line.replace('0x1f4', '0xa') # break # with open(smali_path, 'w', encoding='utf-8') as f: # f.write(''.join(smali_str_arr)) # if r'com\yog\kothoth\data\bean' in dirpath and 'UserResult.smali' in filenames: # smali_path = os.path.join(dirpath, 'UserResult.smali') # with open(smali_path, 'r', encoding='utf-8') as f: # smali_str_arr = f.readlines() # index_str = '.method public constructor (ZLjava/lang/String;)V' # end_method_str = '.end method' # on_create_index = 0 # insert_index = 0 # for line in smali_str_arr: # if index_str in line: # on_create_index = smali_str_arr.index(line) # print('on_create_index', on_create_index, line) # break # for index, value in enumerate(smali_str_arr): # if index > on_create_index and end_method_str in value: # insert_index = index # print('insert_index', index) # break # for index, value in enumerate(smali_str_arr): # if on_create_index < index < insert_index: # if '0x0' in value: # print(value) # smali_str_arr[index] = value.replace('0x0', '0x1') # break # with open(smali_path, 'w', encoding='utf-8') as f: # f.write(''.join(smali_str_arr)) # # if r'com\yog\kothoth' in dirpath and 'YogSDKSelf.smali' in filenames: # smali_path = os.path.join(dirpath, 'YogSDKSelf.smali') # with open(smali_path, 'r', encoding='utf-8') as f: # smali_str_arr = f.readlines() # index_str = '.method public static isFastDoubleClick(J)Z' # end_method_str = '.end method' # on_create_index = 0 # insert_index = 0 # for line in smali_str_arr: # if index_str in line: # on_create_index = smali_str_arr.index(line) # print('on_create_index', on_create_index, line) # break # for index, value in enumerate(smali_str_arr): # if index > on_create_index and end_method_str in value: # insert_index = index # print('insert_index', index) # break # for index, value in enumerate(smali_str_arr): # if on_create_index < index < insert_index: # if '0x1' in value: # print(value) # smali_str_arr[index] = value.replace('0x1', '0x0') # break # with open(smali_path, 'w', encoding='utf-8') as f: # f.write(''.join(smali_str_arr)) # # # 新版sdk取消登录调不起登录 # def modify_cancel_login_and_fubiao(decompile_dir): # insert_str_list = [ # '\n\tinvoke-static {}, Lcom/yog/kothoth/YogSDK;->getInstance()Lcom/yog/kothoth/YogSDK;\n\n', # '\tmove-result-object v0\n\n', # '\tiget-object v1, p0, Lcom/yulong/sdk/promoter/PromoterGameAuthApi$4;->val$activity:Landroid/app/Activity;\n\n', # '\tcheck-cast v1, Landroid/content/Context;\n\n', # '\tinvoke-virtual {v0, v1}, Lcom/yog/kothoth/YogSDK;->login(Landroid/content/Context;)V\n\n'] # for dirpath, dirnames, filenames in os.walk(decompile_dir): # if r'com\yulong\sdk\promoter' in dirpath and 'PromoterGameAuthApi$4.smali' in filenames: # smali_path = os.path.join(dirpath, 'PromoterGameAuthApi$4.smali') # print(smali_path) # with open(smali_path, 'r', encoding='utf-8') as f: # smali_str_arr = f.readlines() # index_str = r'sdk\u767b\u9646\u5931\u8d25:' # end_method_str = 'Lcom/yulong/sdk/promoter/PromoterGameAuthApi;->showLog(Ljava/lang/String;)V' # insert_str = ''.join(insert_str_list) # on_create_index = 0 # insert_index = 0 # for line in smali_str_arr: # if index_str in line: # on_create_index = smali_str_arr.index(line) # print('on_create_index', on_create_index, line) # break # for index, value in enumerate(smali_str_arr): # if index > on_create_index and end_method_str in value: # insert_index = index # print('insert_index', index) # break # print(on_create_index, insert_index) # smali_str_arr.insert(insert_index+1, insert_str) # with open(smali_path, 'w', encoding='utf-8') as f: # f.write(''.join(smali_str_arr)) # # if r'com\yog\kothoth\floatwindow' in dirpath and 'YogFloatWindow.smali' in filenames: # smali_path = os.path.join(dirpath, 'YogFloatWindow.smali') # with open(smali_path, 'r', encoding='utf-8') as f: # smali_str_arr = f.readlines() # for line in smali_str_arr: # if '0x1f4' in line: # smali_str_arr[smali_str_arr.index(line)] = line.replace('0x1f4', '0xa') # break # with open(smali_path, 'w', encoding='utf-8') as f: # f.write(''.join(smali_str_arr)) # if r'com\yog\kothoth\data\bean' in dirpath and 'UserResult.smali' in filenames: # smali_path = os.path.join(dirpath, 'UserResult.smali') # with open(smali_path, 'r', encoding='utf-8') as f: # smali_str_arr = f.readlines() # index_str = '.method public constructor (ZLjava/lang/String;)V' # end_method_str = '.end method' # on_create_index = 0 # insert_index = 0 # for line in smali_str_arr: # if index_str in line: # on_create_index = smali_str_arr.index(line) # print('on_create_index', on_create_index, line) # break # for index, value in enumerate(smali_str_arr): # if index > on_create_index and end_method_str in value: # insert_index = index # print('insert_index', index) # break # for index, value in enumerate(smali_str_arr): # if on_create_index < index < insert_index: # if '0x0' in value: # print(value) # smali_str_arr[index] = value.replace('0x0', '0x1') # break # with open(smali_path, 'w', encoding='utf-8') as f: # f.write(''.join(smali_str_arr)) # # if r'com\yog\kothoth' in dirpath and 'YogSDKSelf.smali' in filenames: # smali_path = os.path.join(dirpath, 'YogSDKSelf.smali') # with open(smali_path, 'r', encoding='utf-8') as f: # smali_str_arr = f.readlines() # index_str = '.method public static isFastDoubleClick(J)Z' # end_method_str = '.end method' # on_create_index = 0 # insert_index = 0 # for line in smali_str_arr: # if index_str in line: # on_create_index = smali_str_arr.index(line) # print('on_create_index', on_create_index, line) # break # for index, value in enumerate(smali_str_arr): # if index > on_create_index and end_method_str in value: # insert_index = index # print('insert_index', index) # break # for index, value in enumerate(smali_str_arr): # if on_create_index < index < insert_index: # if '0x1' in value: # print(value) # smali_str_arr[index] = value.replace('0x1', '0x0') # break # with open(smali_path, 'w', encoding='utf-8') as f: # f.write(''.join(smali_str_arr)) # 老板sdk取消登录调不起登录并且不需要延迟初始化 def fix_old_cancel_login_bug_no_post_delay_login(decompile_dir_path): insert_str_list = [ '\n\tinvoke-static {}, Lcom/yog/kothoth/YogSDK;->getInstance()Lcom/yog/kothoth/YogSDK;\n\n', '\tmove-result-object v0\n\n', '\tiget-object v1, p0, Lcom/coolcloud/uac/android/api/Coolcloud$3;->val$appctx:Landroid/content/Context;\n\n', '\tinvoke-virtual {v0, v1}, Lcom/yog/kothoth/YogSDK;->login(Landroid/content/Context;)V\n\n'] for dirpath, dirnames, filenames in os.walk(decompile_dir_path): if r'com\coolcloud\uac\android\api' in dirpath and 'Coolcloud$3.smali' in filenames: smali_path = os.path.join(dirpath, 'Coolcloud$3.smali') print(smali_path) with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = r'sdk\u767b\u9646\u5931\u8d25:' end_method_str = 'Lcom/coolcloud/uac/android/api/Coolcloud;->showLog(Ljava/lang/String;)V' insert_str = ''.join(insert_str_list) on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break print(on_create_index, insert_index) smali_str_arr.insert(insert_index + 1, insert_str) with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) if r'com\yog\kothoth\floatwindow' in dirpath and 'YogFloatWindow.smali' in filenames: smali_path = os.path.join(dirpath, 'YogFloatWindow.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() for line in smali_str_arr: if '0x1f4' in line: smali_str_arr[smali_str_arr.index(line)] = line.replace('0x1f4', '0xa') break with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) if r'com\yog\kothoth\data\bean' in dirpath and 'UserResult.smali' in filenames: smali_path = os.path.join(dirpath, 'UserResult.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = '.method public constructor (ZLjava/lang/String;)V' end_method_str = '.end method' on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break for index, value in enumerate(smali_str_arr): if on_create_index < index < insert_index: if '0x0' in value: print(value) smali_str_arr[index] = value.replace('0x0', '0x1') break with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) if r'com\yog\kothoth' in dirpath and 'YogSDKSelf.smali' in filenames: smali_path = os.path.join(dirpath, 'YogSDKSelf.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = '.method public static isFastDoubleClick(J)Z' end_method_str = '.end method' on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break for index, value in enumerate(smali_str_arr): if on_create_index < index < insert_index: if '0x1' in value: print(value) smali_str_arr[index] = value.replace('0x1', '0x0') break with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) # 老板sdk取消登录调不起登录并且需要延迟初始化 def fix_old_cancel_login_bug_has_post_delay_login(decompile_dir_path): insert_str_list = [ '\n\tinvoke-static {}, Lcom/yog/kothoth/YogSDK;->getInstance()Lcom/yog/kothoth/YogSDK;\n\n', '\tmove-result-object v0\n\n', '\tiget-object v1, p0, Lcom/coolcloud/uac/android/api/Coolcloud$4;->val$appctx:Landroid/content/Context;\n\n', '\tinvoke-virtual {v0, v1}, Lcom/yog/kothoth/YogSDK;->login(Landroid/content/Context;)V\n\n'] for dirpath, dirnames, filenames in os.walk(decompile_dir_path): if r'com\coolcloud\uac\android\api' in dirpath and 'Coolcloud$4.smali' in filenames: smali_path = os.path.join(dirpath, 'Coolcloud$4.smali') print(smali_path) with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = r'sdk\u767b\u9646\u5931\u8d25:' end_method_str = 'Lcom/coolcloud/uac/android/api/Coolcloud;->showLog(Ljava/lang/String;)V' insert_str = ''.join(insert_str_list) on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break print(on_create_index, insert_index) smali_str_arr.insert(insert_index + 1, insert_str) with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) if r'com\yog\kothoth\floatwindow' in dirpath and 'YogFloatWindow.smali' in filenames: smali_path = os.path.join(dirpath, 'YogFloatWindow.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() for line in smali_str_arr: if '0x1f4' in line: smali_str_arr[smali_str_arr.index(line)] = line.replace('0x1f4', '0xa') break with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) if r'com\yog\kothoth\data\bean' in dirpath and 'UserResult.smali' in filenames: smali_path = os.path.join(dirpath, 'UserResult.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = '.method public constructor (ZLjava/lang/String;)V' end_method_str = '.end method' on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break for index, value in enumerate(smali_str_arr): if on_create_index < index < insert_index: if '0x0' in value: print(value) smali_str_arr[index] = value.replace('0x0', '0x1') break with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) if r'com\yog\kothoth' in dirpath and 'YogSDKSelf.smali' in filenames: smali_path = os.path.join(dirpath, 'YogSDKSelf.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = '.method public static isFastDoubleClick(J)Z' end_method_str = '.end method' on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break for index, value in enumerate(smali_str_arr): if on_create_index < index < insert_index: if '0x1' in value: print(value) smali_str_arr[index] = value.replace('0x1', '0x0') break with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) def add_lifecycle_method_for_rose_fubiao(decompile_dir): for dirpath, dirnames, filenames in os.walk(decompile_dir): if r'com\cy\xngame' in dirpath and 'XNGameNativeActivity.smali' in filenames: smali_path = os.path.join(dirpath, 'XNGameNativeActivity.smali') print(smali_path) with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() resume_index_str = r'.method public onResume()V' resume_protected_index_str = r'.method protected onResume()V' resume_insert_str = '\n\tinvoke-static {}, Lcom/ydzs/framework/SDKPluginWrapper;->onResume()V\n\n' pause_insert_str = '\n\tinvoke-static {}, Lcom/ydzs/framework/SDKPluginWrapper;->onPause()V\n\n' pause_index_str = r'.method public onPause()V' pause_protected_index_str = r'.method protected onPause()V' for index, value in enumerate(smali_str_arr): if resume_index_str in value or resume_protected_index_str in value: smali_str_arr.insert(index+2, resume_insert_str) if pause_index_str in value or pause_protected_index_str in value: smali_str_arr.insert(index+2, pause_insert_str) with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) def add_lifecycle_method_for_xmy_fubiao(decompile_dir): for dirpath, dirnames, filenames in os.walk(decompile_dir): if r'com\cy\xngame' in dirpath and 'XNGameNativeActivity.smali' in filenames: smali_path = os.path.join(dirpath, 'XNGameNativeActivity.smali') print(smali_path) with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() resume_index_str = r'.method public onResume()V' resume_protected_index_str = r'.method protected onResume()V' resume_insert_str = '\n\tinvoke-static {}, Lcom/kf/framework/SDKPluginWrapper;->onResume()V\n\n' pause_insert_str = '\n\tinvoke-static {}, Lcom/kf/framework/SDKPluginWrapper;->onPause()V\n\n' pause_index_str = r'.method public onPause()V' pause_protected_index_str = r'.method protected onPause()V' for index, value in enumerate(smali_str_arr): if resume_index_str in value or resume_protected_index_str in value: smali_str_arr.insert(index+2, resume_insert_str) if pause_index_str in value or pause_protected_index_str in value: smali_str_arr.insert(index+2, pause_insert_str) with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) def fix_kf_application_getinstance_null_bug(decompile_dir): insert_str_list = [ '\n\t.locals 1\n\n', '\tsget-object v0, Lcom/kf/framework/KFApplication;->application:Landroid/content/Context;\n\n', '\tcheck-cast v0, Lcom/kf/framework/KFApplication;\n\n', '\treturn-object v0\n\n'] for dirpath, dirnames, filenames in os.walk(decompile_dir): if r'com\kf\framework' in dirpath and 'KFApplication.smali' in filenames: smali_path = os.path.join(dirpath, 'KFApplication.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = '.method public static getInstance()Lcom/kf/framework/KFApplication;' end_method_str = '.end method' insert_str = ''.join(insert_str_list) on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break print(on_create_index, insert_index) del smali_str_arr[on_create_index + 1:insert_index] smali_str_arr.insert(on_create_index + 1, insert_str) with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) break def fix_ydzs_application_getinstance_null_bug(decompile_dir): insert_str_list = [ '\n\t.locals 1\n\n', '\tsget-object v0, Lcom/ydzs/framework/YDZSApplication;->application:Landroid/content/Context;\n\n', '\tcheck-cast v0, Lcom/ydzs/framework/YDZSApplication;\n\n', '\treturn-object v0\n\n'] for dirpath, dirnames, filenames in os.walk(decompile_dir): if r'com\ydzs\framework' in dirpath and 'YDZSApplication.smali' in filenames: smali_path = os.path.join(dirpath, 'YDZSApplication.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = '.method public static getInstance()Lcom/ydzs/framework/YDZSApplication;' end_method_str = '.end method' insert_str = ''.join(insert_str_list) on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break print(on_create_index, insert_index) del smali_str_arr[on_create_index + 1:insert_index] smali_str_arr.insert(on_create_index + 1, insert_str) with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) break def hook_signature(decompile_dir_path): # 加固情况并且脱不了壳的情况下,使用{apktool d -s xxx.apk -f -o xxx解包后}先用此方法hook签名看能带壳跑不,能带壳跑可以使用插件形式解决 sign_char_str = '3082036f30820257a00302010202046d8fe9e1300d06092a864886f70d01010b05003067310b300906035504061302434e3110300e060355040813076265696a696e673110300e060355040713076265696a696e673110300e060355040a13076e6578746a6f793110300e060355040b13076e6578746a6f793110300e060355040313076e6578746a6f793020170d3137303832343038353833315a180f32313137303733313038353833315a3067310b300906035504061302434e3110300e060355040813076265696a696e673110300e060355040713076265696a696e673110300e060355040a13076e6578746a6f793110300e060355040b13076e6578746a6f793110300e060355040313076e6578746a6f7930820122300d06092a864886f70d01010105000382010f003082010a0282010100ac8b3f6bfae5f922c6b58aa74d1b43d1ce249c218da159b9cda0b588105972bd5c3c62eed75c1f42f21c0da220a9ad8f0b95a93217a054d39b24ef01c991229823766dc31dc6788c8bfbb5c332ec803ac44b55782832d043734cb877925a055f9e9ab3e5e6922b16347fa09c1fd405a8de27dcc569558de5eea9ee4b88af2bb3eea250a11793c06be31d66e439c42c11d572284a018f89117a6ffcf8c087d63548b69f41e24a99b89868325e9b8812a16d2331656a0083b8f7926e342a557fb3341180f1906977ba077c53fafb62697aef2138c0413fe3a582ee39798fbe64248d22a55d58427f63ca9487663e755bda7df3dee4139ac7561a0f212d120a15610203010001a321301f301d0603551d0e04160414830df07605e2e34eb47704be53f3b727bfcc8f6e300d06092a864886f70d01010b05000382010100009d636543987810cc66d97ed42353d02c802c181bbd1ae13f98b92341c7aebd4ce77b2aa34c5fa77c8ddf718b0d0afb258bcd38474e2672f7217ee863a30f1f186208596df006b6e1b0f53a3577ab2b47fae46074f58a167617f167a06513a09084a4ba4bce31e93dfa87587422c72ad65941b18b500d71fd517783cec79919e05b19da6b37b5058ac5cca0a7023675f1cf4118c19da7d31fb4a3d39c8e2472fccd50277aa20cf809197e4e506440d6d1a775e3abb5e17daac2830b42454673346525c195b345f6268325798855cbc579c14b6e18ca98adc648c245f9b1f344c7ba4af73fbf86928e2e97abb1b2fa63b14e3947639dfc076d4fc5d396ad8332' hook_sign_path = r'D:\special_problem\hook签名不带so' # 拷贝smali文件 print(os.listdir(decompile_dir_path)) smali_list = [i for i in os.listdir(decompile_dir_path) if 'smali' in i] print(smali_list) if len(smali_list) == 0: smali_list = [i for i in os.listdir(decompile_dir_path) if 'classes' in i] # 修改hook签名中的smali文件夹名称 old_smali_path = os.path.join(hook_sign_path, 'smali_classes') new_smali_path = os.path.join(hook_sign_path, f'smali_classes{len(smali_list) + 1}') print(new_smali_path) os.rename(old_smali_path, new_smali_path) shutil.copytree(new_smali_path, os.path.join(decompile_dir_path, f'smali_classes{len(smali_list) + 1}')) os.rename(new_smali_path, old_smali_path) # 拷贝签名到拷贝签名到xpatch_asset sign_info_path = os.path.join(hook_sign_path, 'xpatch_asset', 'original_signature_info.ini') print(sign_info_path) with open(sign_info_path, 'w') as f: f.write(sign_char_str) # 找出application拷贝到拷贝签名到xpatch_asset application_path = os.path.join(hook_sign_path, 'xpatch_asset', 'original_application_name.ini') namespace = '{http://schemas.android.com/apk/res/android}' ET.register_namespace('android', 'http://schemas.android.com/apk/res/android') manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml') xml_tree = ET.parse(manifest_path) xml_root = xml_tree.getroot() application_node = xml_root.find('./application') print(application_node) application_name = application_node.get(f'{namespace}name') print(application_name) with open(application_path, 'w') as f: f.write(application_name) # 拷贝xpatch_asset shutil.copytree(os.path.join(hook_sign_path, 'xpatch_asset'), os.path.join(decompile_dir_path, 'assets', 'xpatch_asset')) # 写入hook application application_node.set(f'{namespace}name', 'com.wind.xpatch.proxy.XpatchProxyApplication') xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True) # 老版本酷派sdk初始化未完成就调登录 def del_old_coolcloud_fix_login_fail(decompile_dir_path): for dirpath, dirnames, filenames in os.walk(decompile_dir_path): # print(dirnames) for dirname in dirnames: if dirname == 'coolcloud': coolcloud_path = os.path.join(dirpath,dirname) print(coolcloud_path) shutil.rmtree(coolcloud_path) shutil.copytree(r'D:\special_problem\老版本酷派快发初始化未完成就登录\coolcloud', coolcloud_path) def add_resource_method_in_mommy_util(decompile_dir_path,resource_type): insert_str_list = [ '\n\tinvoke-static {}, Lcom/yog/kothoth/YogSDK;->getInstance()Lcom/yog/kothoth/YogSDK;\n\n', '\tmove-result-object v0\n\n', '\tiget-object v1, p0, Lcom/coolcloud/uac/android/api/Coolcloud$4;->val$appctx:Landroid/content/Context;\n\n', '\tinvoke-virtual {v0, v1}, Lcom/yog/kothoth/YogSDK;->login(Landroid/content/Context;)V\n\n'] for dirpath, dirnames, filenames in os.walk(decompile_dir_path): if r'com\coolcloud\uac\android\api' in dirpath and 'Coolcloud$4.smali' in filenames: smali_path = os.path.join(dirpath, 'Coolcloud$4.smali') print(smali_path) with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = r'sdk\u767b\u9646\u5931\u8d25:' end_method_str = 'Lcom/coolcloud/uac/android/api/Coolcloud;->showLog(Ljava/lang/String;)V' insert_str = ''.join(insert_str_list) on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break print(on_create_index, insert_index) smali_str_arr.insert(insert_index + 1, insert_str) with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) def fix_2_launch_icon_bug(decompile_dir_path): namespace = '{http://schemas.android.com/apk/res/android}' ET.register_namespace('android', 'http://schemas.android.com/apk/res/android') manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml') xml_tree = ET.parse(manifest_path) xml_root = xml_tree.getroot() act_list = xml_root.findall('.//activity') act_alias_list = xml_root.findall('.//activity-alias') for act in act_list: act_name = act.get(f'{namespace}name') if 'com.ydzssdk.wake.SplashYDZSActivity' != act_name and 'com.kfsdk.wake.SplashKFActivity' != act_name: intent_nodes = act.findall('./intent-filter') if intent_nodes is not None: for intent_node in intent_nodes: action_node = intent_node.find('./action') category_node = intent_node.find('./category') if action_node is not None and category_node is not None: action_name = action_node.get(f'{namespace}name') category_name = category_node.get(f'{namespace}name') if action_name == 'android.intent.action.MAIN' and category_name == 'android.intent.category.LAUNCHER': print('act_name', act_name) act.remove(intent_node) xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True) for act in act_alias_list: act_name = act.get(f'{namespace}name') if 'com.ydzssdk.wake.SplashYDZSActivity' != act_name and 'com.kfsdk.wake.SplashKFActivity' != act_name: intent_nodes = act.findall('./intent-filter') if intent_nodes is not None: for intent_node in intent_nodes: action_node = intent_node.find('./action') category_node = intent_node.find('./category') if action_node is not None and category_node is not None: action_name = action_node.get(f'{namespace}name') category_name = category_node.get(f'{namespace}name') if action_name == 'android.intent.action.MAIN' and category_name == 'android.intent.category.LAUNCHER': print('act_name', act_name) act.remove(intent_node) xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True) def fix_game(decompile_dir_path): namespace = '{http://schemas.android.com/apk/res/android}' ET.register_namespace('android', 'http://schemas.android.com/apk/res/android') manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml') xml_tree = ET.parse(manifest_path) xml_root = xml_tree.getroot() act_list = xml_root.findall('.//activity') for act in act_list: act_name = act.get(f'{namespace}name') if 'com.ydzssdk.wake.SplashYDZSActivity' != act_name and 'com.kfsdk.wake.SplashKFActivity' != act_name: intent_nodes = act.findall('./intent-filter') if intent_nodes is not None: for intent_node in intent_nodes: action_node = intent_node.find('./action') category_node = intent_node.find('./category') if action_node is not None and category_node is not None: action_name = action_node.get(f'{namespace}name') category_name = category_node.get(f'{namespace}name') if action_name == 'android.intent.action.MAIN' and category_name == 'android.intent.category.LAUNCHER': print('act_name', act_name) act.remove(intent_node) xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True) def fix_coolpad_version_3_method_name_change_bug(decompile_dir): is_version_3_sdk = False for dirpath, dirnames, filenames in os.walk(decompile_dir): if r'com\yulong\sdk\promoter' in dirpath and 'OnGameAuthListener.smali' in filenames: auth_listener_path = os.path.join(dirpath, 'OnGameAuthListener.smali') with open(auth_listener_path, 'r', encoding='utf-8') as f: smali_str_arr = f.read() if 'onSuccess' in smali_str_arr: is_version_3_sdk = True break for dirpath, dirnames, filenames in os.walk(decompile_dir): if is_version_3_sdk and r'com\yulong\sdk\promoter' in dirpath and 'PromoterGameAuthApi$1.smali' in filenames: smali_path = os.path.join(dirpath, 'PromoterGameAuthApi$1.smali') print(smali_path) with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = r'onResult' for line in smali_str_arr: if index_str in line: print(line) index = smali_str_arr.index(line) smali_str_arr[index] = line.replace(index_str, 'onSuccess') print(smali_str_arr[index]) break with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) break def fix_install_fail_bug(decompile_dir_path): namespace = '{http://schemas.android.com/apk/res/android}' ET.register_namespace('android', 'http://schemas.android.com/apk/res/android') manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml') xml_tree = ET.parse(manifest_path) xml_root = xml_tree.getroot() application_node = xml_root.find('./application') etract_value = application_node.get(f'{namespace}extractNativeLibs') if etract_value is not None and etract_value == 'false': # 修改extractNativeLib application_node.set(f'{namespace}extractNativeLibs', 'true') xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True) yaml_path = os.path.join(decompile_dir_path, 'apktool.yml') file = open(yaml_path, 'r', encoding='utf-8') yaml_result = yaml.load(file, Loader=yaml.BaseLoader) sdk_info = yaml_result['sdkInfo'] yaml_result['packageInfo']['renameManifestPackage'] = None print(sdk_info) if int(sdk_info['targetSdkVersion']) > 29: sdk_info['targetSdkVersion'] = '29' print(sdk_info) file.close() with open(yaml_path, 'w', encoding='utf-8') as f: yaml.dump(yaml_result, f) def fix_xmy_recharge_screen_orientation(decompile_dir_path): namespace = '{http://schemas.android.com/apk/res/android}' ET.register_namespace('android', 'http://schemas.android.com/apk/res/android') manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml') xml_tree = ET.parse(manifest_path) xml_root = xml_tree.getroot() activity_nodes = xml_root.findall('.//activity') print(activity_nodes) for activity_node in activity_nodes: print(activity_node.attrib) activity_name = activity_node.get(f'{namespace}name') print(activity_name) if 'com.yog.kothoth.view.activity.SSRechargeActivity' == activity_name: activity_node.set(f'{namespace}screenOrientation', 'landscape') xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True) break def fix_xmy_recharge_screen_orientation_portrait(decompile_dir_path): namespace = '{http://schemas.android.com/apk/res/android}' ET.register_namespace('android', 'http://schemas.android.com/apk/res/android') manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml') xml_tree = ET.parse(manifest_path) xml_root = xml_tree.getroot() activity_nodes = xml_root.findall('.//activity') print(activity_nodes) for activity_node in activity_nodes: print(activity_node.attrib) activity_name = activity_node.get(f'{namespace}name') print(activity_name) if 'com.yog.kothoth.view.activity.SSRechargeActivity' == activity_name: activity_node.set(f'{namespace}screenOrientation', 'portrait') xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True) break def fix_rose_recharge_screen_orientation(decompile_dir_path): namespace = '{http://schemas.android.com/apk/res/android}' ET.register_namespace('android', 'http://schemas.android.com/apk/res/android') manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml') xml_tree = ET.parse(manifest_path) xml_root = xml_tree.getroot() activity_nodes = xml_root.findall('.//activity') print(activity_nodes) for activity_node in activity_nodes: print(activity_node.attrib) activity_name = activity_node.get(f'{namespace}name') print(activity_name) if 'com.wanwu.sdkkit.gameplatform.activity.RechargeActivity' == activity_name: activity_node.set(f'{namespace}screenOrientation', 'landscape') xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True) break def fix_rose_recharge_screen_orientation_portrait(decompile_dir_path): namespace = '{http://schemas.android.com/apk/res/android}' ET.register_namespace('android', 'http://schemas.android.com/apk/res/android') manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml') xml_tree = ET.parse(manifest_path) xml_root = xml_tree.getroot() activity_nodes = xml_root.findall('.//activity') print(activity_nodes) for activity_node in activity_nodes: print(activity_node.attrib) activity_name = activity_node.get(f'{namespace}name') print(activity_name) if 'com.wanwu.sdkkit.gameplatform.activity.RechargeActivity' == activity_name: activity_node.set(f'{namespace}screenOrientation', 'portrait') xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True) break def fix_fake_recharge_screen_orientation(decompile_dir_path): namespace = '{http://schemas.android.com/apk/res/android}' ET.register_namespace('android', 'http://schemas.android.com/apk/res/android') manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml') xml_tree = ET.parse(manifest_path) xml_root = xml_tree.getroot() activity_nodes = xml_root.findall('.//activity') print(activity_nodes) for activity_node in activity_nodes: print(activity_node.attrib) activity_name = activity_node.get(f'{namespace}name') print(activity_name) if 'com.wanwu.sdkkit.gameplatform.paysdk.view.activity.CoolPaySDKActivity' == activity_name: activity_node.set(f'{namespace}screenOrientation', 'landscape') xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True) break def fix_fake_recharge_screen_orientation_portrait(decompile_dir_path): namespace = '{http://schemas.android.com/apk/res/android}' ET.register_namespace('android', 'http://schemas.android.com/apk/res/android') manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml') xml_tree = ET.parse(manifest_path) xml_root = xml_tree.getroot() activity_nodes = xml_root.findall('.//activity') print(activity_nodes) for activity_node in activity_nodes: print(activity_node.attrib) activity_name = activity_node.get(f'{namespace}name') print(activity_name) if 'com.wanwu.sdkkit.gameplatform.paysdk.view.activity.CoolPaySDKActivity' == activity_name: activity_node.set(f'{namespace}screenOrientation', 'portrait') xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True) break def fix_kf_not_show_fubiao_permission(decompile_dir_path): for dirpath, dirnames, filenames in os.walk(decompile_dir_path): if r'com\kfsdk\wake' in dirpath and 'SplashKFActivity.smali' in filenames: htprotect_dir_path = dirpath print(htprotect_dir_path) shutil.copy(os.path.join(r'D:\special_problem\首次安装未获取悬浮窗权限问题\xmy', 'SplashKFActivity.smali'), htprotect_dir_path) if r'com\kfsdk\wake' in dirpath and 'SplashKFActivity$1.smali' in filenames: htprotect_dir_path = dirpath print(htprotect_dir_path) shutil.copy(os.path.join(r'D:\special_problem\首次安装未获取悬浮窗权限问题\xmy', 'SplashKFActivity$1.smali'), htprotect_dir_path) def fix_ydzs_not_show_fubiao_permission(decompile_dir_path): for dirpath,dirnames,filenames in os.walk(decompile_dir_path): # 拷贝HTProtect.smali if r'com\ydzssdk\wake' in dirpath and 'SplashYDZSActivity.smali' in filenames: htprotect_dir_path = dirpath print(htprotect_dir_path) shutil.copy(os.path.join(r'D:\special_problem\首次安装未获取悬浮窗权限问题\rose', 'SplashYDZSActivity.smali'), htprotect_dir_path) if r'com\ydzssdk\wake' in dirpath and 'SplashYDZSActivity$1.smali' in filenames: htprotect_dir_path = dirpath print(htprotect_dir_path) shutil.copy(os.path.join(r'D:\special_problem\首次安装未获取悬浮窗权限问题\rose', 'SplashYDZSActivity$1.smali'), htprotect_dir_path) def fix_coolpad_version_3_login_fail_bug(decompile_dir_path): insert_str_list = [ '\n\t.locals 0\n\n', '\treturn-void\n\n'] for dirpath, dirnames, filenames in os.walk(decompile_dir_path): if r'com\yulong\account\auth' in dirpath and 'AuthCodeApiImpl.smali' in filenames: smali_path = os.path.join(dirpath, 'AuthCodeApiImpl.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = '.method private returnAuthError(Lcom/yulong/account/common/info/ErrorInfo;)V' end_method_str = '.end method' insert_str = ''.join(insert_str_list) on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break print(on_create_index, insert_index) del smali_str_arr[on_create_index + 1:insert_index] smali_str_arr.insert(on_create_index + 1, insert_str) with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) break def decode_yb_and_del_v4_and_copy_yb_res_and_modify_colors_v31(decompile_dir_path, yb_path): yb_decode_path = r'D:\work\game_yb' # aapt2_output_dir = r'D:\work\output' aapt2_output_dir = r'D:\work\wlxxkp_30181_朱雀2_1' # cmd_decode_yb = f'apktool d {yb_path} -f -o {yb_decode_path} --only-main-classes' # os.system(cmd_decode_yb) # 用原包中的abc_screen_simple、abc_screen_content_include、abc_action_menu_item_layout.xml替换小绵包中的 shutil.copy(os.path.join(yb_decode_path, "res", 'layout', 'abc_screen_simple.xml'), os.path.join(decompile_dir_path, "res", 'layout')) shutil.copy(os.path.join(yb_decode_path, "res", 'layout', 'abc_screen_content_include.xml'), os.path.join(decompile_dir_path, "res", 'layout')) shutil.copy(os.path.join(yb_decode_path, "res", 'layout', 'abc_action_menu_item_layout.xml'), os.path.join(decompile_dir_path, "res", 'layout')) # # 将原包中的values-v31和color-v31拷贝到xmy\res目录下 # shutil.copytree(os.path.join(yb_decode_path,'res','navigation'),os.path.join(decompile_dir_path,'res','navigation')) # #删除drawable-v4、mipmap-v4等含有v4的文件夹 # for res_dir_name in os.listdir(os.path.join(decompile_dir_path, 'res')): # if 'v4' in res_dir_name and ('drawable' in res_dir_name or 'mipmap' in res_dir_name): # drawable_v4_path = os.path.join(decompile_dir_path, 'res', res_dir_name) # print('delete:', drawable_v4_path) # shutil.rmtree(drawable_v4_path) # # # # # colors_xml_path = os.path.join(decompile_dir_path, 'res', 'values-v31', 'colors.xml') # # xml_tree = ET.parse(colors_xml_path) # # xml_root = xml_tree.getroot() # # color_roots = xml_root.findall('./color') # # for style_root in color_roots: # # style_root.text = '@android:color/white' # # xml_tree.write(colors_xml_path, encoding='utf-8', xml_declaration=True) # # if not os.path.exists(aapt2_output_dir): # os.makedirs(aapt2_output_dir) # print("make dir:", aapt2_output_dir) # # aapt2不支持中文路径,拷贝渠道包res到output # shutil.copytree(os.path.join(decompile_dir_path, "res"), os.path.join(aapt2_output_dir, "res")) # # 重新编译资源 # channel_apk_res_path = os.path.join(aapt2_output_dir, "res") # aapt2_res_zip_path = os.path.join(aapt2_output_dir, "res.zip") # cmd_aapt2_compile = rf'F:\Android\as_sdk\build-tools\30.0.2\aapt2.exe compile --dir {channel_apk_res_path} -o {aapt2_res_zip_path} -v' # print(cmd_aapt2_compile) # os.system(cmd_aapt2_compile) # aapt2_apk_path = os.path.join(aapt2_output_dir, "aapt.apk") # cmd_aapt2_link = rf'F:\Android\as_sdk\build-tools\30.0.2\aapt2.exe link {aapt2_res_zip_path} -I F:\Android\as_sdk\platforms\android-30\android.jar -o {aapt2_apk_path} --manifest {os.path.join(decompile_dir_path, "AndroidManifest.xml")} -v' # print(cmd_aapt2_link) # os.system(cmd_aapt2_link) # cmd_decode_output_apk = rf'apktool d {os.path.join(aapt2_output_dir, "aapt.apk")} -f -o {os.path.join(aapt2_output_dir, "aapt")} --only-main-classes' # print(cmd_decode_output_apk) # os.system(cmd_decode_output_apk) yb_public_path = os.path.join(yb_decode_path, "res", "values", "public.xml") # build_public_path = os.path.join(aapt2_output_dir, "aapt", "res", "values", "public.xml") build_public_path = os.path.join(aapt2_output_dir, "res", "values", "public.xml") apk_path = decompile_dir_path cmd_run_refresh_resource = rf'python F:\python_learn\day_1\learn\refresh_resource_wlxx.py {yb_public_path} {build_public_path} {apk_path}' print(cmd_run_refresh_resource) os.system(cmd_run_refresh_resource) cmd_build_apk = rf'apktool b {decompile_dir_path} -f -o D:\work\test.apk --only-main-classes' os.system(cmd_build_apk) cmd_sign_str = rf'ydzs_sign D:\work\test.apk' os.system(cmd_sign_str) cmd_install_str = r'adb install D:\work\test.apk' os.system(cmd_install_str) # shutil.copy(build_public_path, os.path.join(decompile_dir_path, "res", "values")) # shutil.rmtree(aapt2_output_dir) # shutil.rmtree(yb_decode_path) def change_old_kupai_loginNew_to_logout(decompile_dir_path): for dirpath, dirnames, filenames in os.walk(decompile_dir_path): if r'com\coolcloud\uac\android\api' in dirpath and 'Coolcloud.smali' in filenames: smali_path = os.path.join(dirpath, 'Coolcloud.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = '.method public loginNew(' end_method_str = '.end method' # insert_str = ''.join(insert_str_list) on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index != 0 and 'login(' in value: print('index =', index, 'value=', value) smali_str_arr[index] = smali_str_arr[index].replace('login', 'logout') print('after replace value=', value) break with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) break def fix_xmy_webview_recharge_bug(decompile_dir_path): for dirpath, dirnames, filenames in os.walk(decompile_dir_path): if r'com\yog\kothoth\view\activity' in dirpath and 'SSRechargeActivity.smali' in filenames: smali_path = os.path.join(dirpath, 'SSRechargeActivity.smali') print(smali_path) with open(smali_path, 'r') as f: smali_str_arr = f.readlines() for line in smali_str_arr: if 'invoke-virtual {v0}, Lcom/yog/kothoth/view/widget/AdvancedWebView;->onPause()V' in line: smali_str_arr[smali_str_arr.index( line)] = '\t#invoke-virtual {v0}, Lcom/yog/kothoth/view/widget/AdvancedWebView;->onPause()V\n' with open(smali_path, 'w') as f: f.write(''.join(smali_str_arr)) if r'com\yog\kothoth\view\activity' in dirpath and 'SSUserCenterActivity.smali' in filenames: smali_path = os.path.join(dirpath, 'SSUserCenterActivity.smali') print(smali_path) with open(smali_path, 'r') as f: smali_str_arr = f.readlines() for line in smali_str_arr: if 'invoke-virtual {v0}, Lcom/yog/kothoth/view/widget/AdvancedWebView;->onPause()V' in line: smali_str_arr[smali_str_arr.index( line)] = '\t#invoke-virtual {v0}, Lcom/yog/kothoth/view/widget/AdvancedWebView;->onPause()V\n' with open(smali_path, 'w') as f: f.write(''.join(smali_str_arr)) def close_xmy_realname(decompile_dir_path): developer_path = os.path.join(decompile_dir_path, 'assets', 'developer.properties') print(developer_path) with open(developer_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() for line in smali_str_arr: if 'isRealname' in line: smali_str_arr[smali_str_arr.index(line)] = line.replace('0', '1') break with open(developer_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) def open_xmy_realname(decompile_dir_path): developer_path = os.path.join(decompile_dir_path, 'assets', 'developer.properties') print(developer_path) with open(developer_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() for line in smali_str_arr: if 'isRealname' in line: smali_str_arr[smali_str_arr.index(line)] = line.replace('1', '0') break with open(developer_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) def find_top_application_path(decompile_dir,application_path): super_application_regex = re.compile(r'.*?\.super\s+(.*?);.*?') # .super Lcom/wf/sdk/WFApplication; top_application_path = '' super_application_name = '' with open(application_path, 'r') as f: str = f.read() super_application_name = re.findall(super_application_regex, str)[0] print('super_application_name', super_application_name) super_application_name = super_application_name[1:] + '.smali' path_list = glob.glob(os.path.join(decompile_dir, 'smali*/%s' % super_application_name)) if len(path_list) != 0: top_application_path = path_list[0] print('super_application_path', top_application_path) if super_application_name == ' Landroid/support/multidex/MultiDexApplication': print('top_super_application_name', super_application_name) return top_application_path else: find_top_application_path(decompile_dir,top_application_path) def test(decompile_dir): namespace = '{http://schemas.android.com/apk/res/android}' ET.register_namespace('android', 'http://schemas.android.com/apk/res/android') manifest_path = os.path.join(decompile_dir, 'AndroidManifest.xml') xml_tree = ET.parse(manifest_path) xml_root = xml_tree.getroot() application_node = xml_root.find('./application') application_name = application_node.get('%sname' % namespace) application_name_split_list = application_name.split('.') print('application_name_split_list', application_name_split_list) application_path = '/'.join(application_name_split_list) + '.smali' application_path = glob.glob(os.path.join(decompile_dir, 'smali*/%s' % application_path))[0] print('application_path', application_path) print('application_name', application_name) top_application_path = find_top_application_path(decompile_dir, application_path) print('top_application_path',top_application_path) # for dirpath, dirnames, filenames in os.walk(decompile_dir): # if r'androidx\startup' in dirpath or r'androidx\work\impl' in dirpath or r'com\snyu\ddcr' in dirpath \ # or r'com\kingsoft\shiyou\omnisdk\project\ui' in dirpath or r'com\sharry\lib\album' in dirpath: # for smali_file in filenames: # smali_file_path = os.path.join(dirpath, smali_file) # print(smali_file_path) # find_rose_resource_and_replace(smali_file_path, r_regex_str) # # attachBaseContext提前赋值 def delete_bugly_init_method(decompile_dir_path): insert_str_list = [ '\n\t.locals 0\n\n', '\treturn-void\n\n'] for dirpath, dirnames, filenames in os.walk(decompile_dir_path): if r'com\tencent\bugly\agent' in dirpath and 'GameAgent.smali' in filenames: smali_path = os.path.join(dirpath, 'GameAgent.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_str = '.method private static initCrashReport(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V' end_method_str = '.end method' insert_str = ''.join(insert_str_list) on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break print(on_create_index, insert_index) del smali_str_arr[on_create_index + 1:insert_index] smali_str_arr.insert(on_create_index + 1, insert_str) with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) break for dirpath, dirnames, filenames in os.walk(decompile_dir_path): if r'com\tencent\bugly\crashreport' in dirpath and 'CrashReport.smali' in filenames: smali_path = os.path.join(dirpath, 'CrashReport.smali') with open(smali_path, 'r', encoding='utf-8') as f: smali_str_arr = f.readlines() index_strs = ['.method public static initCrashReport(Landroid/content/Context;)V', '.method public static initCrashReport(Landroid/content/Context;Lcom/tencent/bugly/crashreport/CrashReport$UserStrategy;)V', '.method public static initCrashReport(Landroid/content/Context;Ljava/lang/String;Z)V', '.method public static initCrashReport(Landroid/content/Context;Ljava/lang/String;ZLcom/tencent/bugly/crashreport/CrashReport$UserStrategy;)V'] end_method_str = '.end method' insert_str = ''.join(insert_str_list) for index_str in index_strs: on_create_index = 0 insert_index = 0 for line in smali_str_arr: if index_str in line: on_create_index = smali_str_arr.index(line) print('on_create_index', on_create_index, line) break for index, value in enumerate(smali_str_arr): if index > on_create_index and end_method_str in value: insert_index = index print('insert_index', index) break print(on_create_index, insert_index) del smali_str_arr[on_create_index + 1:insert_index] smali_str_arr.insert(on_create_index + 1, insert_str) with open(smali_path, 'w', encoding='utf-8') as f: f.write(''.join(smali_str_arr)) break # 按间距中的绿色按钮以运行脚本。 if __name__ == '__main__': hook_signature(r'D:\work\yb') # 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助