main.py 80 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464
  1. # 这是一个示例 Python 脚本。
  2. # 按 Shift+F10 执行或将其替换为您的代码。
  3. # 按 双击 Shift 在所有地方搜索类、文件、工具窗口、操作和设置。
  4. import glob
  5. import json
  6. import logging
  7. import os
  8. import re
  9. import shutil
  10. import subprocess
  11. import threading
  12. import xml.etree.ElementTree as ET
  13. import zipfile
  14. import win32api
  15. import win32con
  16. import yaml
  17. import requests
  18. test_dir = "D:\\work\\llfz_60027_朱雀2_2"
  19. game_path = r"\\10.8.230.114\public\测试组\20230228\三国战纪2Y\jskc_60031_zhuq2_1.0.5.apk"
  20. work_path = "D:\\work"
  21. def list_file():
  22. smali_list = [i for i in os.listdir(test_dir) if 'smali' in i]
  23. print(smali_list)
  24. for dirpath, dirnames, filenames in os.walk(test_dir):
  25. # print('dirpath:', dirpath)
  26. # print('dirnames:', dirnames)
  27. if 'smali' in dirpath and 'gson' in dirnames:
  28. print(dirpath, dirnames)
  29. new_smali_dir = os.path.join(test_dir, f'smali_classes{len(smali_list) + 1}', 'com\\google')
  30. os.makedirs(new_smali_dir)
  31. shutil.move(os.path.join(dirpath, 'gson'), new_smali_dir)
  32. break
  33. def move_game_apk_to_work():
  34. cmd_move_str = f'copy {game_path} {work_path}'
  35. print(cmd_move_str)
  36. result = subprocess.getoutput(cmd_move_str)
  37. print(result)
  38. def isNeedReplaceApplicationLine(line):
  39. return '.super Landroid/app/Application;' in line \
  40. or 'invoke-direct {p0}, Landroid/app/Application;-><init>()V' in line \
  41. or 'invoke-super {p0, p1}, Landroid/app/Application;->attachBaseContext(Landroid/content/Context;)V' in line \
  42. or 'invoke-super {p0, p1}, Landroid/app/Application;->onConfigurationChanged(Landroid/content/res/Configuration;)V' in line \
  43. or 'invoke-super {p0}, Landroid/app/Application;->onLowMemory()V' in line \
  44. or 'invoke-super {p0}, Landroid/app/Application;->onTerminate()V' in line \
  45. or 'invoke-super {p0, p1}, Landroid/app/Application;->onTrimMemory(I)V' in line \
  46. or 'invoke-super {p0}, Landroid/app/Application;->onCreate()V' in line
  47. def is_kf_replace_application(line):
  48. return '.super Lcom/kf/framework/KFApplication;' in line \
  49. or 'invoke-direct {p0}, Lcom/kf/framework/KFApplication;-><init>()V' in line \
  50. or 'invoke-super {p0, p1}, Lcom/kf/framework/KFApplication;->attachBaseContext(Landroid/content/Context;)V' in line \
  51. or 'invoke-super {p0, p1}, Lcom/kf/framework/KFApplication;->onConfigurationChanged(Landroid/content/res/Configuration;)V' in line \
  52. or 'invoke-super {p0}, Lcom/kf/framework/KFApplication;->onLowMemory()V' in line \
  53. or 'invoke-super {p0}, Lcom/kf/framework/KFApplication;->onTerminate()V' in line \
  54. or 'invoke-super {p0, p1}, Lcom/kf/framework/KFApplication;->onTrimMemory(I)V' in line \
  55. or 'invoke-super {p0}, Lcom/kf/framework/KFApplication;->onCreate()V' in line
  56. def replace_application_verify_xmy_bug(decompile_dir):
  57. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  58. if r'com\oasis\android' in dirpath and 'OasisApplication.smali' in filenames:
  59. application_path = os.path.join(dirpath, "OasisApplication.smali")
  60. print(application_path)
  61. with open(application_path, "r") as f:
  62. smali_str_arr = f.readlines()
  63. for line in smali_str_arr:
  64. if not is_kf_replace_application(line) and 'Lcom/kf/framework/KFApplication' in line:
  65. smali_str_arr[smali_str_arr.index(line)] = line.replace('Lcom/kf/framework/KFApplication',
  66. 'Landroid/app/Application')
  67. if isNeedReplaceApplicationLine(line):
  68. smali_str_arr[smali_str_arr.index(line)] = line.replace('Landroid/app/Application',
  69. 'Lcom/kf/framework/KFApplication')
  70. with open(application_path, "w") as f:
  71. f.write(''.join(smali_str_arr))
  72. def is_rose_replace_application(line):
  73. return '.super Lcom/ydzs/framework/YDZSApplication;' in line \
  74. or 'invoke-direct {p0}, Lcom/ydzs/framework/YDZSApplication;-><init>()V' in line \
  75. or 'invoke-super {p0, p1}, Lcom/ydzs/framework/YDZSApplication;->attachBaseContext(Landroid/content/Context;)V' in line \
  76. or 'invoke-super {p0, p1}, Lcom/ydzs/framework/YDZSApplication;->onConfigurationChanged(Landroid/content/res/Configuration;)V' in line \
  77. or 'invoke-super {p0}, Lcom/ydzs/framework/YDZSApplication;->onLowMemory()V' in line \
  78. or 'invoke-super {p0}, Lcom/ydzs/framework/YDZSApplication;->onTerminate()V' in line \
  79. or 'invoke-super {p0, p1}, Lcom/ydzs/framework/YDZSApplication;->onTrimMemory(I)V' in line \
  80. or 'invoke-super {p0}, Lcom/ydzs/framework/YDZSApplication;->onCreate()V' in line
  81. def replace_application_verify_rose_bug(decompile_dir):
  82. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  83. if r'com\oasis\android' in dirpath and 'OasisApplication.smali' in filenames:
  84. application_path = os.path.join(dirpath, "OasisApplication.smali")
  85. print(application_path)
  86. with open(application_path, "r") as f:
  87. smali_str_arr = f.readlines()
  88. for line in smali_str_arr:
  89. if not is_rose_replace_application(line) and 'Lcom/ydzs/framework/YDZSApplication' in line:
  90. smali_str_arr[smali_str_arr.index(line)] = line.replace('Lcom/ydzs/framework/YDZSApplication',
  91. 'Landroid/app/Application')
  92. if isNeedReplaceApplicationLine(line):
  93. smali_str_arr[smali_str_arr.index(line)] = line.replace('Landroid/app/Application',
  94. 'Lcom/ydzs/framework/YDZSApplication')
  95. with open(application_path, "w") as f:
  96. f.write(''.join(smali_str_arr))
  97. 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'
  98. def find_kf_resource_and_replace(smali_file_path, regex_str):
  99. with open(smali_file_path, 'r') as f:
  100. smali_str = f.read()
  101. pattern = re.compile(regex_str)
  102. resource_arr = pattern.findall(smali_str)
  103. for r_str in resource_arr:
  104. virtual_name = r_str[r_str.index(' ') + 1:r_str.index(',')]
  105. print(virtual_name)
  106. resource_type = r_str[r_str.index('R$') + 2:r_str.index(';')].capitalize()
  107. print(resource_type)
  108. resource_name = r_str[r_str.index('->') + 2:r_str.index(':')]
  109. print(resource_name)
  110. 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" % (
  111. virtual_name, resource_name, virtual_name, resource_type, virtual_name)
  112. print(new_r_str)
  113. smali_str = smali_str.replace(r_str, new_r_str)
  114. with open(smali_file_path, 'w') as f:
  115. f.write(smali_str)
  116. def find_rose_resource_and_replace(smali_file_path, regex_str):
  117. with open(smali_file_path, 'r') as f:
  118. smali_str = f.read()
  119. pattern = re.compile(regex_str)
  120. resource_arr = pattern.findall(smali_str)
  121. for r_str in resource_arr:
  122. virtual_name = r_str[r_str.index(' ') + 1:r_str.index(',')]
  123. print(virtual_name)
  124. resource_type = r_str[r_str.index('R$') + 2:r_str.index(';')].capitalize()
  125. print(resource_type)
  126. resource_name = r_str[r_str.index('->') + 2:r_str.index(':')]
  127. print(resource_name)
  128. 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" % (
  129. virtual_name, resource_name, virtual_name, resource_type, virtual_name)
  130. print(new_r_str)
  131. smali_str = smali_str.replace(r_str, new_r_str)
  132. with open(smali_file_path, 'w') as f:
  133. f.write(smali_str)
  134. def replaceRoseResource(d_dir):
  135. for dirpath, dirnames, filenames in os.walk(d_dir):
  136. if r'com\wm\shh\zx' in dirpath:
  137. for smali_file in filenames:
  138. smali_file_path = os.path.join(dirpath, smali_file)
  139. print(smali_file_path)
  140. find_rose_resource_and_replace(smali_file_path, r_regex_str)
  141. def meta_constructor(loader, node):
  142. value = loader.construct_mapping(node)
  143. return value
  144. def modifyYaml(yaml_path):
  145. yaml.add_constructor(u'tag:yaml.org,2002:brut.androlib.meta.MetaInfo', meta_constructor)
  146. file = open(yaml_path, 'r', encoding='utf-8')
  147. yaml_result = yaml.load(file)
  148. print(yaml_result)
  149. # print(yaml_result)
  150. def modify_json(json_path):
  151. with open(json_path, 'r+', encoding='utf-8') as jsonFile:
  152. data = json.load(jsonFile)
  153. data['app']['is_need_privacy_protection'] = False
  154. jsonFile.seek(0)
  155. json.dump(data, jsonFile, ensure_ascii=False)
  156. jsonFile.truncate()
  157. def unZipAndCopyCl(game_dir):
  158. game_name = ''
  159. for name in os.listdir(game_dir):
  160. if '小绵羊' not in name and '朱雀' not in name and '九狐' not in name:
  161. game_name = name
  162. print(game_name)
  163. file_name = os.path.join(game_dir, game_name)
  164. print(file_name)
  165. yb_unzip_path = r"D:\work\yb_files"
  166. zip_file = zipfile.ZipFile(file_name)
  167. if os.path.isdir(file_name + "_files"):
  168. pass
  169. else:
  170. print('Problem occurred during generating libdoc for', os.mkdir(yb_unzip_path))
  171. for names in zip_file.namelist():
  172. zip_file.extract(names, yb_unzip_path)
  173. zip_file.close()
  174. os.rename(os.path.join(yb_unzip_path, 'classes.dex'), os.path.join(yb_unzip_path, 'cl'))
  175. shutil.copy(os.path.join(yb_unzip_path, 'cl'), r'D:\special_problem\破天一剑')
  176. shutil.rmtree(yb_unzip_path)
  177. # 解决酷派新sdk在android6.0闪退问题
  178. def fix_kupai_android6_crash(decompile_dir):
  179. insert_str_list = [
  180. '\n\t.locals 0\n\n',
  181. '\tinvoke-static {}, Ljava/util/Locale;->getDefault()Ljava/util/Locale;\n\n',
  182. '\tmove-result-object p0\n\n',
  183. '\treturn-object p0\n\n']
  184. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  185. if r'com\yulong\appdata\a' in dirpath and 'e.smali' in filenames:
  186. smali_path = os.path.join(dirpath, 'e.smali')
  187. with open(smali_path, 'r', encoding='utf-8') as f:
  188. smali_str_arr = f.readlines()
  189. index_str = '.method public static d(Landroid/content/Context;)Ljava/util/Locale;'
  190. end_method_str = '.end method'
  191. insert_str = ''.join(insert_str_list)
  192. on_create_index = 0
  193. insert_index = 0
  194. for line in smali_str_arr:
  195. if index_str in line:
  196. on_create_index = smali_str_arr.index(line)
  197. print('on_create_index', on_create_index, line)
  198. break
  199. for index, value in enumerate(smali_str_arr):
  200. if index > on_create_index and end_method_str in value:
  201. insert_index = index
  202. print('insert_index', index)
  203. break
  204. print(on_create_index, insert_index)
  205. del smali_str_arr[on_create_index + 1:insert_index]
  206. smali_str_arr.insert(on_create_index + 1, insert_str)
  207. with open(smali_path, 'w', encoding='utf-8') as f:
  208. f.write(''.join(smali_str_arr))
  209. break
  210. def fix_old_kupai_recharge_phone_permission_crash(decompile_dir):
  211. insert_str_list = [
  212. '\n\t.locals 1\n\n',
  213. '\tconst-string v0, ""\n\n',
  214. '\treturn-object v0\n\n']
  215. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  216. if r'com\yulong\android\paysdk\base\b\c' in dirpath and 'e.smali' in filenames:
  217. smali_path = os.path.join(dirpath, 'e.smali')
  218. with open(smali_path, 'r', encoding='utf-8') as f:
  219. smali_str_arr = f.readlines()
  220. index_str = '.method public static b(Landroid/content/Context;)Ljava/lang/String;'
  221. end_method_str = '.end method'
  222. insert_str = ''.join(insert_str_list)
  223. on_create_index = 0
  224. insert_index = 0
  225. for line in smali_str_arr:
  226. if index_str in line:
  227. on_create_index = smali_str_arr.index(line)
  228. print('on_create_index', on_create_index, line)
  229. break
  230. for index, value in enumerate(smali_str_arr):
  231. if index > on_create_index and end_method_str in value:
  232. insert_index = index
  233. print('insert_index', index)
  234. break
  235. print(on_create_index, insert_index)
  236. del smali_str_arr[on_create_index + 1:insert_index]
  237. smali_str_arr.insert(on_create_index + 1, insert_str)
  238. with open(smali_path, 'w', encoding='utf-8') as f:
  239. f.write(''.join(smali_str_arr))
  240. break
  241. def fix_android8_bug_xmy(decompile_dir):
  242. style_xml_path = os.path.join(decompile_dir, 'res', 'values', 'styles.xml')
  243. xml_tree = ET.parse(style_xml_path)
  244. xml_root = xml_tree.getroot()
  245. style_roots = xml_root.findall('./style')
  246. for style_root in style_roots:
  247. if style_root.get('name') == 'kf_splash_translucent':
  248. items = style_root.findall('./item')
  249. for item in items:
  250. print('item name', item.get('name'))
  251. print(item.findtext('.'))
  252. if item.get('name') == 'android:windowIsTranslucent':
  253. item.text = 'false'
  254. xml_tree.write(style_xml_path, encoding='utf-8', xml_declaration=True)
  255. break
  256. namespace = '{http://schemas.android.com/apk/res/android}'
  257. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  258. manifest_path = os.path.join(decompile_dir, 'AndroidManifest.xml')
  259. xml_tree = ET.parse(manifest_path)
  260. xml_root = xml_tree.getroot()
  261. act_list = xml_root.findall('.//activity')
  262. for act in act_list:
  263. act_name = act.get(f'{namespace}name')
  264. print(act_name)
  265. if 'com.yog.kothoth.view.activity.SSShoppingMallActivity' == act_name or 'com.yog.kothoth.view.activity.SSRechargeActivity' == act_name:
  266. act_theme = act.get(f'{namespace}theme')
  267. print('act_theme', act_theme)
  268. act.set(f'{namespace}theme', '@style/kf_splash_translucent')
  269. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  270. break
  271. def fix_android8_bug_rose(decompile_dir):
  272. style_xml_path = os.path.join(decompile_dir, 'res', 'values', 'styles.xml')
  273. xml_tree = ET.parse(style_xml_path)
  274. xml_root = xml_tree.getroot()
  275. style_roots = xml_root.findall('./style')
  276. for style_root in style_roots:
  277. if style_root.get('name') == 'ydzs_splash_translucent':
  278. items = style_root.findall('./item')
  279. for item in items:
  280. print('item name', item.get('name'))
  281. print(item.findtext('.'))
  282. if item.get('name') == 'android:windowIsTranslucent':
  283. item.text = 'false'
  284. xml_tree.write(style_xml_path, encoding='utf-8', xml_declaration=True)
  285. break
  286. namespace = '{http://schemas.android.com/apk/res/android}'
  287. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  288. manifest_path = os.path.join(decompile_dir, 'AndroidManifest.xml')
  289. xml_tree = ET.parse(manifest_path)
  290. xml_root = xml_tree.getroot()
  291. act_list = xml_root.findall('.//activity')
  292. for act in act_list:
  293. act_name = act.get(f'{namespace}name')
  294. print(act_name)
  295. if 'com.wanwu.sdkkit.gameplatform.activity.RechargeActivity' == act_name:
  296. act_theme = act.get(f'{namespace}theme')
  297. print('act_theme', act_theme)
  298. act.set(f'{namespace}theme', '@style/ydzs_splash_translucent')
  299. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  300. break
  301. # # 新版sdk取消登录调不起登录,并且关闭了新增
  302. # def modify_cancel_login_and_fubiao_and_close_login(decompile_dir):
  303. # insert_str_list = [
  304. # '\n\tconst-string v0, "\\u670d\\u52a1\\u5668\\u8fd4\\u56de\\u9519\\u8bef"\n\n',
  305. # '\tinvoke-virtual {p2, v0}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z\n\n',
  306. # '\tmove-result v0\n\n',
  307. # '\tif-nez v0, :cond_1\n\n',
  308. # '\tinvoke-static {}, Lcom/yog/kothoth/YogSDK;->getInstance()Lcom/yog/kothoth/YogSDK;\n\n',
  309. # '\tmove-result-object v0\n\n',
  310. # '\tiget-object v1, p0, Lcom/yulong/sdk/promoter/PromoterGameAuthApi$4;->val$activity:Landroid/app/Activity;\n\n',
  311. # '\tcheck-cast v1, Landroid/content/Context;\n\n',
  312. # '\tinvoke-virtual {v0, v1}, Lcom/yog/kothoth/YogSDK;->login(Landroid/content/Context;)V\n\n',
  313. # '\t:cond_1\n\n']
  314. # for dirpath, dirnames, filenames in os.walk(decompile_dir):
  315. # if r'com\yulong\sdk\promoter' in dirpath and 'PromoterGameAuthApi$4.smali' in filenames:
  316. # smali_path = os.path.join(dirpath, 'PromoterGameAuthApi$4.smali')
  317. # print(smali_path)
  318. # with open(smali_path, 'r', encoding='utf-8') as f:
  319. # smali_str_arr = f.readlines()
  320. # index_str = r'sdk\u767b\u9646\u5931\u8d25:'
  321. # end_method_str = 'Lcom/yulong/sdk/promoter/PromoterGameAuthApi;->showLog(Ljava/lang/String;)V'
  322. # insert_str = ''.join(insert_str_list)
  323. # on_create_index = 0
  324. # insert_index = 0
  325. # for line in smali_str_arr:
  326. # if index_str in line:
  327. # on_create_index = smali_str_arr.index(line)
  328. # print('on_create_index', on_create_index, line)
  329. # break
  330. # for index, value in enumerate(smali_str_arr):
  331. # if index > on_create_index and end_method_str in value:
  332. # insert_index = index
  333. # print('insert_index', index)
  334. # break
  335. # print(on_create_index, insert_index)
  336. # smali_str_arr.insert(insert_index+1, insert_str)
  337. # with open(smali_path, 'w', encoding='utf-8') as f:
  338. # f.write(''.join(smali_str_arr))
  339. #
  340. # if r'com\yog\kothoth\floatwindow' in dirpath and 'YogFloatWindow.smali' in filenames:
  341. # smali_path = os.path.join(dirpath, 'YogFloatWindow.smali')
  342. # with open(smali_path, 'r', encoding='utf-8') as f:
  343. # smali_str_arr = f.readlines()
  344. # for line in smali_str_arr:
  345. # if '0x1f4' in line:
  346. # smali_str_arr[smali_str_arr.index(line)] = line.replace('0x1f4', '0xa')
  347. # break
  348. # with open(smali_path, 'w', encoding='utf-8') as f:
  349. # f.write(''.join(smali_str_arr))
  350. # if r'com\yog\kothoth\data\bean' in dirpath and 'UserResult.smali' in filenames:
  351. # smali_path = os.path.join(dirpath, 'UserResult.smali')
  352. # with open(smali_path, 'r', encoding='utf-8') as f:
  353. # smali_str_arr = f.readlines()
  354. # index_str = '.method public constructor <init>(ZLjava/lang/String;)V'
  355. # end_method_str = '.end method'
  356. # on_create_index = 0
  357. # insert_index = 0
  358. # for line in smali_str_arr:
  359. # if index_str in line:
  360. # on_create_index = smali_str_arr.index(line)
  361. # print('on_create_index', on_create_index, line)
  362. # break
  363. # for index, value in enumerate(smali_str_arr):
  364. # if index > on_create_index and end_method_str in value:
  365. # insert_index = index
  366. # print('insert_index', index)
  367. # break
  368. # for index, value in enumerate(smali_str_arr):
  369. # if on_create_index < index < insert_index:
  370. # if '0x0' in value:
  371. # print(value)
  372. # smali_str_arr[index] = value.replace('0x0', '0x1')
  373. # break
  374. # with open(smali_path, 'w', encoding='utf-8') as f:
  375. # f.write(''.join(smali_str_arr))
  376. #
  377. # if r'com\yog\kothoth' in dirpath and 'YogSDKSelf.smali' in filenames:
  378. # smali_path = os.path.join(dirpath, 'YogSDKSelf.smali')
  379. # with open(smali_path, 'r', encoding='utf-8') as f:
  380. # smali_str_arr = f.readlines()
  381. # index_str = '.method public static isFastDoubleClick(J)Z'
  382. # end_method_str = '.end method'
  383. # on_create_index = 0
  384. # insert_index = 0
  385. # for line in smali_str_arr:
  386. # if index_str in line:
  387. # on_create_index = smali_str_arr.index(line)
  388. # print('on_create_index', on_create_index, line)
  389. # break
  390. # for index, value in enumerate(smali_str_arr):
  391. # if index > on_create_index and end_method_str in value:
  392. # insert_index = index
  393. # print('insert_index', index)
  394. # break
  395. # for index, value in enumerate(smali_str_arr):
  396. # if on_create_index < index < insert_index:
  397. # if '0x1' in value:
  398. # print(value)
  399. # smali_str_arr[index] = value.replace('0x1', '0x0')
  400. # break
  401. # with open(smali_path, 'w', encoding='utf-8') as f:
  402. # f.write(''.join(smali_str_arr))
  403. #
  404. # # 新版sdk取消登录调不起登录
  405. # def modify_cancel_login_and_fubiao(decompile_dir):
  406. # insert_str_list = [
  407. # '\n\tinvoke-static {}, Lcom/yog/kothoth/YogSDK;->getInstance()Lcom/yog/kothoth/YogSDK;\n\n',
  408. # '\tmove-result-object v0\n\n',
  409. # '\tiget-object v1, p0, Lcom/yulong/sdk/promoter/PromoterGameAuthApi$4;->val$activity:Landroid/app/Activity;\n\n',
  410. # '\tcheck-cast v1, Landroid/content/Context;\n\n',
  411. # '\tinvoke-virtual {v0, v1}, Lcom/yog/kothoth/YogSDK;->login(Landroid/content/Context;)V\n\n']
  412. # for dirpath, dirnames, filenames in os.walk(decompile_dir):
  413. # if r'com\yulong\sdk\promoter' in dirpath and 'PromoterGameAuthApi$4.smali' in filenames:
  414. # smali_path = os.path.join(dirpath, 'PromoterGameAuthApi$4.smali')
  415. # print(smali_path)
  416. # with open(smali_path, 'r', encoding='utf-8') as f:
  417. # smali_str_arr = f.readlines()
  418. # index_str = r'sdk\u767b\u9646\u5931\u8d25:'
  419. # end_method_str = 'Lcom/yulong/sdk/promoter/PromoterGameAuthApi;->showLog(Ljava/lang/String;)V'
  420. # insert_str = ''.join(insert_str_list)
  421. # on_create_index = 0
  422. # insert_index = 0
  423. # for line in smali_str_arr:
  424. # if index_str in line:
  425. # on_create_index = smali_str_arr.index(line)
  426. # print('on_create_index', on_create_index, line)
  427. # break
  428. # for index, value in enumerate(smali_str_arr):
  429. # if index > on_create_index and end_method_str in value:
  430. # insert_index = index
  431. # print('insert_index', index)
  432. # break
  433. # print(on_create_index, insert_index)
  434. # smali_str_arr.insert(insert_index+1, insert_str)
  435. # with open(smali_path, 'w', encoding='utf-8') as f:
  436. # f.write(''.join(smali_str_arr))
  437. #
  438. # if r'com\yog\kothoth\floatwindow' in dirpath and 'YogFloatWindow.smali' in filenames:
  439. # smali_path = os.path.join(dirpath, 'YogFloatWindow.smali')
  440. # with open(smali_path, 'r', encoding='utf-8') as f:
  441. # smali_str_arr = f.readlines()
  442. # for line in smali_str_arr:
  443. # if '0x1f4' in line:
  444. # smali_str_arr[smali_str_arr.index(line)] = line.replace('0x1f4', '0xa')
  445. # break
  446. # with open(smali_path, 'w', encoding='utf-8') as f:
  447. # f.write(''.join(smali_str_arr))
  448. # if r'com\yog\kothoth\data\bean' in dirpath and 'UserResult.smali' in filenames:
  449. # smali_path = os.path.join(dirpath, 'UserResult.smali')
  450. # with open(smali_path, 'r', encoding='utf-8') as f:
  451. # smali_str_arr = f.readlines()
  452. # index_str = '.method public constructor <init>(ZLjava/lang/String;)V'
  453. # end_method_str = '.end method'
  454. # on_create_index = 0
  455. # insert_index = 0
  456. # for line in smali_str_arr:
  457. # if index_str in line:
  458. # on_create_index = smali_str_arr.index(line)
  459. # print('on_create_index', on_create_index, line)
  460. # break
  461. # for index, value in enumerate(smali_str_arr):
  462. # if index > on_create_index and end_method_str in value:
  463. # insert_index = index
  464. # print('insert_index', index)
  465. # break
  466. # for index, value in enumerate(smali_str_arr):
  467. # if on_create_index < index < insert_index:
  468. # if '0x0' in value:
  469. # print(value)
  470. # smali_str_arr[index] = value.replace('0x0', '0x1')
  471. # break
  472. # with open(smali_path, 'w', encoding='utf-8') as f:
  473. # f.write(''.join(smali_str_arr))
  474. #
  475. # if r'com\yog\kothoth' in dirpath and 'YogSDKSelf.smali' in filenames:
  476. # smali_path = os.path.join(dirpath, 'YogSDKSelf.smali')
  477. # with open(smali_path, 'r', encoding='utf-8') as f:
  478. # smali_str_arr = f.readlines()
  479. # index_str = '.method public static isFastDoubleClick(J)Z'
  480. # end_method_str = '.end method'
  481. # on_create_index = 0
  482. # insert_index = 0
  483. # for line in smali_str_arr:
  484. # if index_str in line:
  485. # on_create_index = smali_str_arr.index(line)
  486. # print('on_create_index', on_create_index, line)
  487. # break
  488. # for index, value in enumerate(smali_str_arr):
  489. # if index > on_create_index and end_method_str in value:
  490. # insert_index = index
  491. # print('insert_index', index)
  492. # break
  493. # for index, value in enumerate(smali_str_arr):
  494. # if on_create_index < index < insert_index:
  495. # if '0x1' in value:
  496. # print(value)
  497. # smali_str_arr[index] = value.replace('0x1', '0x0')
  498. # break
  499. # with open(smali_path, 'w', encoding='utf-8') as f:
  500. # f.write(''.join(smali_str_arr))
  501. # 老板sdk取消登录调不起登录并且不需要延迟初始化
  502. def fix_old_cancel_login_bug_no_post_delay_login(decompile_dir_path):
  503. insert_str_list = [
  504. '\n\tinvoke-static {}, Lcom/yog/kothoth/YogSDK;->getInstance()Lcom/yog/kothoth/YogSDK;\n\n',
  505. '\tmove-result-object v0\n\n',
  506. '\tiget-object v1, p0, Lcom/coolcloud/uac/android/api/Coolcloud$3;->val$appctx:Landroid/content/Context;\n\n',
  507. '\tinvoke-virtual {v0, v1}, Lcom/yog/kothoth/YogSDK;->login(Landroid/content/Context;)V\n\n']
  508. for dirpath, dirnames, filenames in os.walk(decompile_dir_path):
  509. if r'com\coolcloud\uac\android\api' in dirpath and 'Coolcloud$3.smali' in filenames:
  510. smali_path = os.path.join(dirpath, 'Coolcloud$3.smali')
  511. print(smali_path)
  512. with open(smali_path, 'r', encoding='utf-8') as f:
  513. smali_str_arr = f.readlines()
  514. index_str = r'sdk\u767b\u9646\u5931\u8d25:'
  515. end_method_str = 'Lcom/coolcloud/uac/android/api/Coolcloud;->showLog(Ljava/lang/String;)V'
  516. insert_str = ''.join(insert_str_list)
  517. on_create_index = 0
  518. insert_index = 0
  519. for line in smali_str_arr:
  520. if index_str in line:
  521. on_create_index = smali_str_arr.index(line)
  522. print('on_create_index', on_create_index, line)
  523. break
  524. for index, value in enumerate(smali_str_arr):
  525. if index > on_create_index and end_method_str in value:
  526. insert_index = index
  527. print('insert_index', index)
  528. break
  529. print(on_create_index, insert_index)
  530. smali_str_arr.insert(insert_index + 1, insert_str)
  531. with open(smali_path, 'w', encoding='utf-8') as f:
  532. f.write(''.join(smali_str_arr))
  533. if r'com\yog\kothoth\floatwindow' in dirpath and 'YogFloatWindow.smali' in filenames:
  534. smali_path = os.path.join(dirpath, 'YogFloatWindow.smali')
  535. with open(smali_path, 'r', encoding='utf-8') as f:
  536. smali_str_arr = f.readlines()
  537. for line in smali_str_arr:
  538. if '0x1f4' in line:
  539. smali_str_arr[smali_str_arr.index(line)] = line.replace('0x1f4', '0xa')
  540. break
  541. with open(smali_path, 'w', encoding='utf-8') as f:
  542. f.write(''.join(smali_str_arr))
  543. if r'com\yog\kothoth\data\bean' in dirpath and 'UserResult.smali' in filenames:
  544. smali_path = os.path.join(dirpath, 'UserResult.smali')
  545. with open(smali_path, 'r', encoding='utf-8') as f:
  546. smali_str_arr = f.readlines()
  547. index_str = '.method public constructor <init>(ZLjava/lang/String;)V'
  548. end_method_str = '.end method'
  549. on_create_index = 0
  550. insert_index = 0
  551. for line in smali_str_arr:
  552. if index_str in line:
  553. on_create_index = smali_str_arr.index(line)
  554. print('on_create_index', on_create_index, line)
  555. break
  556. for index, value in enumerate(smali_str_arr):
  557. if index > on_create_index and end_method_str in value:
  558. insert_index = index
  559. print('insert_index', index)
  560. break
  561. for index, value in enumerate(smali_str_arr):
  562. if on_create_index < index < insert_index:
  563. if '0x0' in value:
  564. print(value)
  565. smali_str_arr[index] = value.replace('0x0', '0x1')
  566. break
  567. with open(smali_path, 'w', encoding='utf-8') as f:
  568. f.write(''.join(smali_str_arr))
  569. if r'com\yog\kothoth' in dirpath and 'YogSDKSelf.smali' in filenames:
  570. smali_path = os.path.join(dirpath, 'YogSDKSelf.smali')
  571. with open(smali_path, 'r', encoding='utf-8') as f:
  572. smali_str_arr = f.readlines()
  573. index_str = '.method public static isFastDoubleClick(J)Z'
  574. end_method_str = '.end method'
  575. on_create_index = 0
  576. insert_index = 0
  577. for line in smali_str_arr:
  578. if index_str in line:
  579. on_create_index = smali_str_arr.index(line)
  580. print('on_create_index', on_create_index, line)
  581. break
  582. for index, value in enumerate(smali_str_arr):
  583. if index > on_create_index and end_method_str in value:
  584. insert_index = index
  585. print('insert_index', index)
  586. break
  587. for index, value in enumerate(smali_str_arr):
  588. if on_create_index < index < insert_index:
  589. if '0x1' in value:
  590. print(value)
  591. smali_str_arr[index] = value.replace('0x1', '0x0')
  592. break
  593. with open(smali_path, 'w', encoding='utf-8') as f:
  594. f.write(''.join(smali_str_arr))
  595. # 老板sdk取消登录调不起登录并且需要延迟初始化
  596. def fix_old_cancel_login_bug_has_post_delay_login(decompile_dir_path):
  597. insert_str_list = [
  598. '\n\tinvoke-static {}, Lcom/yog/kothoth/YogSDK;->getInstance()Lcom/yog/kothoth/YogSDK;\n\n',
  599. '\tmove-result-object v0\n\n',
  600. '\tiget-object v1, p0, Lcom/coolcloud/uac/android/api/Coolcloud$4;->val$appctx:Landroid/content/Context;\n\n',
  601. '\tinvoke-virtual {v0, v1}, Lcom/yog/kothoth/YogSDK;->login(Landroid/content/Context;)V\n\n']
  602. for dirpath, dirnames, filenames in os.walk(decompile_dir_path):
  603. if r'com\coolcloud\uac\android\api' in dirpath and 'Coolcloud$4.smali' in filenames:
  604. smali_path = os.path.join(dirpath, 'Coolcloud$4.smali')
  605. print(smali_path)
  606. with open(smali_path, 'r', encoding='utf-8') as f:
  607. smali_str_arr = f.readlines()
  608. index_str = r'sdk\u767b\u9646\u5931\u8d25:'
  609. end_method_str = 'Lcom/coolcloud/uac/android/api/Coolcloud;->showLog(Ljava/lang/String;)V'
  610. insert_str = ''.join(insert_str_list)
  611. on_create_index = 0
  612. insert_index = 0
  613. for line in smali_str_arr:
  614. if index_str in line:
  615. on_create_index = smali_str_arr.index(line)
  616. print('on_create_index', on_create_index, line)
  617. break
  618. for index, value in enumerate(smali_str_arr):
  619. if index > on_create_index and end_method_str in value:
  620. insert_index = index
  621. print('insert_index', index)
  622. break
  623. print(on_create_index, insert_index)
  624. smali_str_arr.insert(insert_index + 1, insert_str)
  625. with open(smali_path, 'w', encoding='utf-8') as f:
  626. f.write(''.join(smali_str_arr))
  627. if r'com\yog\kothoth\floatwindow' in dirpath and 'YogFloatWindow.smali' in filenames:
  628. smali_path = os.path.join(dirpath, 'YogFloatWindow.smali')
  629. with open(smali_path, 'r', encoding='utf-8') as f:
  630. smali_str_arr = f.readlines()
  631. for line in smali_str_arr:
  632. if '0x1f4' in line:
  633. smali_str_arr[smali_str_arr.index(line)] = line.replace('0x1f4', '0xa')
  634. break
  635. with open(smali_path, 'w', encoding='utf-8') as f:
  636. f.write(''.join(smali_str_arr))
  637. if r'com\yog\kothoth\data\bean' in dirpath and 'UserResult.smali' in filenames:
  638. smali_path = os.path.join(dirpath, 'UserResult.smali')
  639. with open(smali_path, 'r', encoding='utf-8') as f:
  640. smali_str_arr = f.readlines()
  641. index_str = '.method public constructor <init>(ZLjava/lang/String;)V'
  642. end_method_str = '.end method'
  643. on_create_index = 0
  644. insert_index = 0
  645. for line in smali_str_arr:
  646. if index_str in line:
  647. on_create_index = smali_str_arr.index(line)
  648. print('on_create_index', on_create_index, line)
  649. break
  650. for index, value in enumerate(smali_str_arr):
  651. if index > on_create_index and end_method_str in value:
  652. insert_index = index
  653. print('insert_index', index)
  654. break
  655. for index, value in enumerate(smali_str_arr):
  656. if on_create_index < index < insert_index:
  657. if '0x0' in value:
  658. print(value)
  659. smali_str_arr[index] = value.replace('0x0', '0x1')
  660. break
  661. with open(smali_path, 'w', encoding='utf-8') as f:
  662. f.write(''.join(smali_str_arr))
  663. if r'com\yog\kothoth' in dirpath and 'YogSDKSelf.smali' in filenames:
  664. smali_path = os.path.join(dirpath, 'YogSDKSelf.smali')
  665. with open(smali_path, 'r', encoding='utf-8') as f:
  666. smali_str_arr = f.readlines()
  667. index_str = '.method public static isFastDoubleClick(J)Z'
  668. end_method_str = '.end method'
  669. on_create_index = 0
  670. insert_index = 0
  671. for line in smali_str_arr:
  672. if index_str in line:
  673. on_create_index = smali_str_arr.index(line)
  674. print('on_create_index', on_create_index, line)
  675. break
  676. for index, value in enumerate(smali_str_arr):
  677. if index > on_create_index and end_method_str in value:
  678. insert_index = index
  679. print('insert_index', index)
  680. break
  681. for index, value in enumerate(smali_str_arr):
  682. if on_create_index < index < insert_index:
  683. if '0x1' in value:
  684. print(value)
  685. smali_str_arr[index] = value.replace('0x1', '0x0')
  686. break
  687. with open(smali_path, 'w', encoding='utf-8') as f:
  688. f.write(''.join(smali_str_arr))
  689. def add_lifecycle_method_for_rose_fubiao(decompile_dir):
  690. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  691. if r'com\cy\xngame' in dirpath and 'XNGameNativeActivity.smali' in filenames:
  692. smali_path = os.path.join(dirpath, 'XNGameNativeActivity.smali')
  693. print(smali_path)
  694. with open(smali_path, 'r', encoding='utf-8') as f:
  695. smali_str_arr = f.readlines()
  696. resume_index_str = r'.method public onResume()V'
  697. resume_protected_index_str = r'.method protected onResume()V'
  698. resume_insert_str = '\n\tinvoke-static {}, Lcom/ydzs/framework/SDKPluginWrapper;->onResume()V\n\n'
  699. pause_insert_str = '\n\tinvoke-static {}, Lcom/ydzs/framework/SDKPluginWrapper;->onPause()V\n\n'
  700. pause_index_str = r'.method public onPause()V'
  701. pause_protected_index_str = r'.method protected onPause()V'
  702. for index, value in enumerate(smali_str_arr):
  703. if resume_index_str in value or resume_protected_index_str in value:
  704. smali_str_arr.insert(index+2, resume_insert_str)
  705. if pause_index_str in value or pause_protected_index_str in value:
  706. smali_str_arr.insert(index+2, pause_insert_str)
  707. with open(smali_path, 'w', encoding='utf-8') as f:
  708. f.write(''.join(smali_str_arr))
  709. def add_lifecycle_method_for_xmy_fubiao(decompile_dir):
  710. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  711. if r'com\cy\xngame' in dirpath and 'XNGameNativeActivity.smali' in filenames:
  712. smali_path = os.path.join(dirpath, 'XNGameNativeActivity.smali')
  713. print(smali_path)
  714. with open(smali_path, 'r', encoding='utf-8') as f:
  715. smali_str_arr = f.readlines()
  716. resume_index_str = r'.method public onResume()V'
  717. resume_protected_index_str = r'.method protected onResume()V'
  718. resume_insert_str = '\n\tinvoke-static {}, Lcom/kf/framework/SDKPluginWrapper;->onResume()V\n\n'
  719. pause_insert_str = '\n\tinvoke-static {}, Lcom/kf/framework/SDKPluginWrapper;->onPause()V\n\n'
  720. pause_index_str = r'.method public onPause()V'
  721. pause_protected_index_str = r'.method protected onPause()V'
  722. for index, value in enumerate(smali_str_arr):
  723. if resume_index_str in value or resume_protected_index_str in value:
  724. smali_str_arr.insert(index+2, resume_insert_str)
  725. if pause_index_str in value or pause_protected_index_str in value:
  726. smali_str_arr.insert(index+2, pause_insert_str)
  727. with open(smali_path, 'w', encoding='utf-8') as f:
  728. f.write(''.join(smali_str_arr))
  729. def fix_kf_application_getinstance_null_bug(decompile_dir):
  730. insert_str_list = [
  731. '\n\t.locals 1\n\n',
  732. '\tsget-object v0, Lcom/kf/framework/KFApplication;->application:Landroid/content/Context;\n\n',
  733. '\tcheck-cast v0, Lcom/kf/framework/KFApplication;\n\n',
  734. '\treturn-object v0\n\n']
  735. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  736. if r'com\kf\framework' in dirpath and 'KFApplication.smali' in filenames:
  737. smali_path = os.path.join(dirpath, 'KFApplication.smali')
  738. with open(smali_path, 'r', encoding='utf-8') as f:
  739. smali_str_arr = f.readlines()
  740. index_str = '.method public static getInstance()Lcom/kf/framework/KFApplication;'
  741. end_method_str = '.end method'
  742. insert_str = ''.join(insert_str_list)
  743. on_create_index = 0
  744. insert_index = 0
  745. for line in smali_str_arr:
  746. if index_str in line:
  747. on_create_index = smali_str_arr.index(line)
  748. print('on_create_index', on_create_index, line)
  749. break
  750. for index, value in enumerate(smali_str_arr):
  751. if index > on_create_index and end_method_str in value:
  752. insert_index = index
  753. print('insert_index', index)
  754. break
  755. print(on_create_index, insert_index)
  756. del smali_str_arr[on_create_index + 1:insert_index]
  757. smali_str_arr.insert(on_create_index + 1, insert_str)
  758. with open(smali_path, 'w', encoding='utf-8') as f:
  759. f.write(''.join(smali_str_arr))
  760. break
  761. def fix_ydzs_application_getinstance_null_bug(decompile_dir):
  762. insert_str_list = [
  763. '\n\t.locals 1\n\n',
  764. '\tsget-object v0, Lcom/ydzs/framework/YDZSApplication;->application:Landroid/content/Context;\n\n',
  765. '\tcheck-cast v0, Lcom/ydzs/framework/YDZSApplication;\n\n',
  766. '\treturn-object v0\n\n']
  767. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  768. if r'com\ydzs\framework' in dirpath and 'YDZSApplication.smali' in filenames:
  769. smali_path = os.path.join(dirpath, 'YDZSApplication.smali')
  770. with open(smali_path, 'r', encoding='utf-8') as f:
  771. smali_str_arr = f.readlines()
  772. index_str = '.method public static getInstance()Lcom/ydzs/framework/YDZSApplication;'
  773. end_method_str = '.end method'
  774. insert_str = ''.join(insert_str_list)
  775. on_create_index = 0
  776. insert_index = 0
  777. for line in smali_str_arr:
  778. if index_str in line:
  779. on_create_index = smali_str_arr.index(line)
  780. print('on_create_index', on_create_index, line)
  781. break
  782. for index, value in enumerate(smali_str_arr):
  783. if index > on_create_index and end_method_str in value:
  784. insert_index = index
  785. print('insert_index', index)
  786. break
  787. print(on_create_index, insert_index)
  788. del smali_str_arr[on_create_index + 1:insert_index]
  789. smali_str_arr.insert(on_create_index + 1, insert_str)
  790. with open(smali_path, 'w', encoding='utf-8') as f:
  791. f.write(''.join(smali_str_arr))
  792. break
  793. def hook_signature(decompile_dir_path):
  794. # 加固情况并且脱不了壳的情况下,使用{apktool d -s xxx.apk -f -o xxx解包后}先用此方法hook签名看能带壳跑不,能带壳跑可以使用插件形式解决
  795. sign_char_str = '3082036f30820257a00302010202046d8fe9e1300d06092a864886f70d01010b05003067310b300906035504061302434e3110300e060355040813076265696a696e673110300e060355040713076265696a696e673110300e060355040a13076e6578746a6f793110300e060355040b13076e6578746a6f793110300e060355040313076e6578746a6f793020170d3137303832343038353833315a180f32313137303733313038353833315a3067310b300906035504061302434e3110300e060355040813076265696a696e673110300e060355040713076265696a696e673110300e060355040a13076e6578746a6f793110300e060355040b13076e6578746a6f793110300e060355040313076e6578746a6f7930820122300d06092a864886f70d01010105000382010f003082010a0282010100ac8b3f6bfae5f922c6b58aa74d1b43d1ce249c218da159b9cda0b588105972bd5c3c62eed75c1f42f21c0da220a9ad8f0b95a93217a054d39b24ef01c991229823766dc31dc6788c8bfbb5c332ec803ac44b55782832d043734cb877925a055f9e9ab3e5e6922b16347fa09c1fd405a8de27dcc569558de5eea9ee4b88af2bb3eea250a11793c06be31d66e439c42c11d572284a018f89117a6ffcf8c087d63548b69f41e24a99b89868325e9b8812a16d2331656a0083b8f7926e342a557fb3341180f1906977ba077c53fafb62697aef2138c0413fe3a582ee39798fbe64248d22a55d58427f63ca9487663e755bda7df3dee4139ac7561a0f212d120a15610203010001a321301f301d0603551d0e04160414830df07605e2e34eb47704be53f3b727bfcc8f6e300d06092a864886f70d01010b05000382010100009d636543987810cc66d97ed42353d02c802c181bbd1ae13f98b92341c7aebd4ce77b2aa34c5fa77c8ddf718b0d0afb258bcd38474e2672f7217ee863a30f1f186208596df006b6e1b0f53a3577ab2b47fae46074f58a167617f167a06513a09084a4ba4bce31e93dfa87587422c72ad65941b18b500d71fd517783cec79919e05b19da6b37b5058ac5cca0a7023675f1cf4118c19da7d31fb4a3d39c8e2472fccd50277aa20cf809197e4e506440d6d1a775e3abb5e17daac2830b42454673346525c195b345f6268325798855cbc579c14b6e18ca98adc648c245f9b1f344c7ba4af73fbf86928e2e97abb1b2fa63b14e3947639dfc076d4fc5d396ad8332'
  796. hook_sign_path = r'D:\special_problem\hook签名不带so'
  797. # 拷贝smali文件
  798. print(os.listdir(decompile_dir_path))
  799. smali_list = [i for i in os.listdir(decompile_dir_path) if 'smali' in i]
  800. print(smali_list)
  801. if len(smali_list) == 0:
  802. smali_list = [i for i in os.listdir(decompile_dir_path) if 'classes' in i]
  803. # 修改hook签名中的smali文件夹名称
  804. old_smali_path = os.path.join(hook_sign_path, 'smali_classes')
  805. new_smali_path = os.path.join(hook_sign_path, f'smali_classes{len(smali_list) + 1}')
  806. print(new_smali_path)
  807. os.rename(old_smali_path, new_smali_path)
  808. shutil.copytree(new_smali_path, os.path.join(decompile_dir_path, f'smali_classes{len(smali_list) + 1}'))
  809. os.rename(new_smali_path, old_smali_path)
  810. # 拷贝签名到拷贝签名到xpatch_asset
  811. sign_info_path = os.path.join(hook_sign_path, 'xpatch_asset', 'original_signature_info.ini')
  812. print(sign_info_path)
  813. with open(sign_info_path, 'w') as f:
  814. f.write(sign_char_str)
  815. # 找出application拷贝到拷贝签名到xpatch_asset
  816. application_path = os.path.join(hook_sign_path, 'xpatch_asset', 'original_application_name.ini')
  817. namespace = '{http://schemas.android.com/apk/res/android}'
  818. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  819. manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml')
  820. xml_tree = ET.parse(manifest_path)
  821. xml_root = xml_tree.getroot()
  822. application_node = xml_root.find('./application')
  823. print(application_node)
  824. application_name = application_node.get(f'{namespace}name')
  825. print(application_name)
  826. with open(application_path, 'w') as f:
  827. f.write(application_name)
  828. # 拷贝xpatch_asset
  829. shutil.copytree(os.path.join(hook_sign_path, 'xpatch_asset'),
  830. os.path.join(decompile_dir_path, 'assets', 'xpatch_asset'))
  831. # 写入hook application
  832. application_node.set(f'{namespace}name', 'com.wind.xpatch.proxy.XpatchProxyApplication')
  833. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  834. # 老版本酷派sdk初始化未完成就调登录
  835. def del_old_coolcloud_fix_login_fail(decompile_dir_path):
  836. for dirpath, dirnames, filenames in os.walk(decompile_dir_path):
  837. # print(dirnames)
  838. for dirname in dirnames:
  839. if dirname == 'coolcloud':
  840. coolcloud_path = os.path.join(dirpath,dirname)
  841. print(coolcloud_path)
  842. shutil.rmtree(coolcloud_path)
  843. shutil.copytree(r'D:\special_problem\老版本酷派快发初始化未完成就登录\coolcloud', coolcloud_path)
  844. def add_resource_method_in_mommy_util(decompile_dir_path,resource_type):
  845. insert_str_list = [
  846. '\n\tinvoke-static {}, Lcom/yog/kothoth/YogSDK;->getInstance()Lcom/yog/kothoth/YogSDK;\n\n',
  847. '\tmove-result-object v0\n\n',
  848. '\tiget-object v1, p0, Lcom/coolcloud/uac/android/api/Coolcloud$4;->val$appctx:Landroid/content/Context;\n\n',
  849. '\tinvoke-virtual {v0, v1}, Lcom/yog/kothoth/YogSDK;->login(Landroid/content/Context;)V\n\n']
  850. for dirpath, dirnames, filenames in os.walk(decompile_dir_path):
  851. if r'com\coolcloud\uac\android\api' in dirpath and 'Coolcloud$4.smali' in filenames:
  852. smali_path = os.path.join(dirpath, 'Coolcloud$4.smali')
  853. print(smali_path)
  854. with open(smali_path, 'r', encoding='utf-8') as f:
  855. smali_str_arr = f.readlines()
  856. index_str = r'sdk\u767b\u9646\u5931\u8d25:'
  857. end_method_str = 'Lcom/coolcloud/uac/android/api/Coolcloud;->showLog(Ljava/lang/String;)V'
  858. insert_str = ''.join(insert_str_list)
  859. on_create_index = 0
  860. insert_index = 0
  861. for line in smali_str_arr:
  862. if index_str in line:
  863. on_create_index = smali_str_arr.index(line)
  864. print('on_create_index', on_create_index, line)
  865. break
  866. for index, value in enumerate(smali_str_arr):
  867. if index > on_create_index and end_method_str in value:
  868. insert_index = index
  869. print('insert_index', index)
  870. break
  871. print(on_create_index, insert_index)
  872. smali_str_arr.insert(insert_index + 1, insert_str)
  873. with open(smali_path, 'w', encoding='utf-8') as f:
  874. f.write(''.join(smali_str_arr))
  875. def fix_2_launch_icon_bug(decompile_dir_path):
  876. namespace = '{http://schemas.android.com/apk/res/android}'
  877. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  878. manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml')
  879. xml_tree = ET.parse(manifest_path)
  880. xml_root = xml_tree.getroot()
  881. act_list = xml_root.findall('.//activity')
  882. act_alias_list = xml_root.findall('.//activity-alias')
  883. for act in act_list:
  884. act_name = act.get(f'{namespace}name')
  885. if 'com.ydzssdk.wake.SplashYDZSActivity' != act_name and 'com.kfsdk.wake.SplashKFActivity' != act_name:
  886. intent_nodes = act.findall('./intent-filter')
  887. if intent_nodes is not None:
  888. for intent_node in intent_nodes:
  889. action_node = intent_node.find('./action')
  890. category_node = intent_node.find('./category')
  891. if action_node is not None and category_node is not None:
  892. action_name = action_node.get(f'{namespace}name')
  893. category_name = category_node.get(f'{namespace}name')
  894. if action_name == 'android.intent.action.MAIN' and category_name == 'android.intent.category.LAUNCHER':
  895. print('act_name', act_name)
  896. act.remove(intent_node)
  897. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  898. for act in act_alias_list:
  899. act_name = act.get(f'{namespace}name')
  900. if 'com.ydzssdk.wake.SplashYDZSActivity' != act_name and 'com.kfsdk.wake.SplashKFActivity' != act_name:
  901. intent_nodes = act.findall('./intent-filter')
  902. if intent_nodes is not None:
  903. for intent_node in intent_nodes:
  904. action_node = intent_node.find('./action')
  905. category_node = intent_node.find('./category')
  906. if action_node is not None and category_node is not None:
  907. action_name = action_node.get(f'{namespace}name')
  908. category_name = category_node.get(f'{namespace}name')
  909. if action_name == 'android.intent.action.MAIN' and category_name == 'android.intent.category.LAUNCHER':
  910. print('act_name', act_name)
  911. act.remove(intent_node)
  912. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  913. def fix_game(decompile_dir_path):
  914. namespace = '{http://schemas.android.com/apk/res/android}'
  915. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  916. manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml')
  917. xml_tree = ET.parse(manifest_path)
  918. xml_root = xml_tree.getroot()
  919. act_list = xml_root.findall('.//activity')
  920. for act in act_list:
  921. act_name = act.get(f'{namespace}name')
  922. if 'com.ydzssdk.wake.SplashYDZSActivity' != act_name and 'com.kfsdk.wake.SplashKFActivity' != act_name:
  923. intent_nodes = act.findall('./intent-filter')
  924. if intent_nodes is not None:
  925. for intent_node in intent_nodes:
  926. action_node = intent_node.find('./action')
  927. category_node = intent_node.find('./category')
  928. if action_node is not None and category_node is not None:
  929. action_name = action_node.get(f'{namespace}name')
  930. category_name = category_node.get(f'{namespace}name')
  931. if action_name == 'android.intent.action.MAIN' and category_name == 'android.intent.category.LAUNCHER':
  932. print('act_name', act_name)
  933. act.remove(intent_node)
  934. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  935. def fix_coolpad_version_3_method_name_change_bug(decompile_dir):
  936. is_version_3_sdk = False
  937. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  938. if r'com\yulong\sdk\promoter' in dirpath and 'OnGameAuthListener.smali' in filenames:
  939. auth_listener_path = os.path.join(dirpath, 'OnGameAuthListener.smali')
  940. with open(auth_listener_path, 'r', encoding='utf-8') as f:
  941. smali_str_arr = f.read()
  942. if 'onSuccess' in smali_str_arr:
  943. is_version_3_sdk = True
  944. break
  945. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  946. if is_version_3_sdk and r'com\yulong\sdk\promoter' in dirpath and 'PromoterGameAuthApi$1.smali' in filenames:
  947. smali_path = os.path.join(dirpath, 'PromoterGameAuthApi$1.smali')
  948. print(smali_path)
  949. with open(smali_path, 'r', encoding='utf-8') as f:
  950. smali_str_arr = f.readlines()
  951. index_str = r'onResult'
  952. for line in smali_str_arr:
  953. if index_str in line:
  954. print(line)
  955. index = smali_str_arr.index(line)
  956. smali_str_arr[index] = line.replace(index_str, 'onSuccess')
  957. print(smali_str_arr[index])
  958. break
  959. with open(smali_path, 'w', encoding='utf-8') as f:
  960. f.write(''.join(smali_str_arr))
  961. break
  962. def fix_install_fail_bug(decompile_dir_path):
  963. namespace = '{http://schemas.android.com/apk/res/android}'
  964. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  965. manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml')
  966. xml_tree = ET.parse(manifest_path)
  967. xml_root = xml_tree.getroot()
  968. application_node = xml_root.find('./application')
  969. etract_value = application_node.get(f'{namespace}extractNativeLibs')
  970. if etract_value is not None and etract_value == 'false':
  971. # 修改extractNativeLib
  972. application_node.set(f'{namespace}extractNativeLibs', 'true')
  973. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  974. yaml_path = os.path.join(decompile_dir_path, 'apktool.yml')
  975. file = open(yaml_path, 'r', encoding='utf-8')
  976. yaml_result = yaml.load(file, Loader=yaml.BaseLoader)
  977. sdk_info = yaml_result['sdkInfo']
  978. yaml_result['packageInfo']['renameManifestPackage'] = None
  979. print(sdk_info)
  980. if int(sdk_info['targetSdkVersion']) > 29:
  981. sdk_info['targetSdkVersion'] = '29'
  982. print(sdk_info)
  983. file.close()
  984. with open(yaml_path, 'w', encoding='utf-8') as f:
  985. yaml.dump(yaml_result, f)
  986. def fix_xmy_recharge_screen_orientation(decompile_dir_path):
  987. namespace = '{http://schemas.android.com/apk/res/android}'
  988. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  989. manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml')
  990. xml_tree = ET.parse(manifest_path)
  991. xml_root = xml_tree.getroot()
  992. activity_nodes = xml_root.findall('.//activity')
  993. print(activity_nodes)
  994. for activity_node in activity_nodes:
  995. print(activity_node.attrib)
  996. activity_name = activity_node.get(f'{namespace}name')
  997. print(activity_name)
  998. if 'com.yog.kothoth.view.activity.SSRechargeActivity' == activity_name:
  999. activity_node.set(f'{namespace}screenOrientation', 'landscape')
  1000. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  1001. break
  1002. def fix_xmy_recharge_screen_orientation_portrait(decompile_dir_path):
  1003. namespace = '{http://schemas.android.com/apk/res/android}'
  1004. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  1005. manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml')
  1006. xml_tree = ET.parse(manifest_path)
  1007. xml_root = xml_tree.getroot()
  1008. activity_nodes = xml_root.findall('.//activity')
  1009. print(activity_nodes)
  1010. for activity_node in activity_nodes:
  1011. print(activity_node.attrib)
  1012. activity_name = activity_node.get(f'{namespace}name')
  1013. print(activity_name)
  1014. if 'com.yog.kothoth.view.activity.SSRechargeActivity' == activity_name:
  1015. activity_node.set(f'{namespace}screenOrientation', 'portrait')
  1016. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  1017. break
  1018. def fix_rose_recharge_screen_orientation(decompile_dir_path):
  1019. namespace = '{http://schemas.android.com/apk/res/android}'
  1020. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  1021. manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml')
  1022. xml_tree = ET.parse(manifest_path)
  1023. xml_root = xml_tree.getroot()
  1024. activity_nodes = xml_root.findall('.//activity')
  1025. print(activity_nodes)
  1026. for activity_node in activity_nodes:
  1027. print(activity_node.attrib)
  1028. activity_name = activity_node.get(f'{namespace}name')
  1029. print(activity_name)
  1030. if 'com.wanwu.sdkkit.gameplatform.activity.RechargeActivity' == activity_name:
  1031. activity_node.set(f'{namespace}screenOrientation', 'landscape')
  1032. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  1033. break
  1034. def fix_rose_recharge_screen_orientation_portrait(decompile_dir_path):
  1035. namespace = '{http://schemas.android.com/apk/res/android}'
  1036. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  1037. manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml')
  1038. xml_tree = ET.parse(manifest_path)
  1039. xml_root = xml_tree.getroot()
  1040. activity_nodes = xml_root.findall('.//activity')
  1041. print(activity_nodes)
  1042. for activity_node in activity_nodes:
  1043. print(activity_node.attrib)
  1044. activity_name = activity_node.get(f'{namespace}name')
  1045. print(activity_name)
  1046. if 'com.wanwu.sdkkit.gameplatform.activity.RechargeActivity' == activity_name:
  1047. activity_node.set(f'{namespace}screenOrientation', 'portrait')
  1048. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  1049. break
  1050. def fix_fake_recharge_screen_orientation(decompile_dir_path):
  1051. namespace = '{http://schemas.android.com/apk/res/android}'
  1052. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  1053. manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml')
  1054. xml_tree = ET.parse(manifest_path)
  1055. xml_root = xml_tree.getroot()
  1056. activity_nodes = xml_root.findall('.//activity')
  1057. print(activity_nodes)
  1058. for activity_node in activity_nodes:
  1059. print(activity_node.attrib)
  1060. activity_name = activity_node.get(f'{namespace}name')
  1061. print(activity_name)
  1062. if 'com.wanwu.sdkkit.gameplatform.paysdk.view.activity.CoolPaySDKActivity' == activity_name:
  1063. activity_node.set(f'{namespace}screenOrientation', 'landscape')
  1064. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  1065. break
  1066. def fix_fake_recharge_screen_orientation_portrait(decompile_dir_path):
  1067. namespace = '{http://schemas.android.com/apk/res/android}'
  1068. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  1069. manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml')
  1070. xml_tree = ET.parse(manifest_path)
  1071. xml_root = xml_tree.getroot()
  1072. activity_nodes = xml_root.findall('.//activity')
  1073. print(activity_nodes)
  1074. for activity_node in activity_nodes:
  1075. print(activity_node.attrib)
  1076. activity_name = activity_node.get(f'{namespace}name')
  1077. print(activity_name)
  1078. if 'com.wanwu.sdkkit.gameplatform.paysdk.view.activity.CoolPaySDKActivity' == activity_name:
  1079. activity_node.set(f'{namespace}screenOrientation', 'portrait')
  1080. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  1081. break
  1082. def fix_kf_not_show_fubiao_permission(decompile_dir_path):
  1083. for dirpath, dirnames, filenames in os.walk(decompile_dir_path):
  1084. if r'com\kfsdk\wake' in dirpath and 'SplashKFActivity.smali' in filenames:
  1085. htprotect_dir_path = dirpath
  1086. print(htprotect_dir_path)
  1087. shutil.copy(os.path.join(r'D:\special_problem\首次安装未获取悬浮窗权限问题\xmy', 'SplashKFActivity.smali'),
  1088. htprotect_dir_path)
  1089. if r'com\kfsdk\wake' in dirpath and 'SplashKFActivity$1.smali' in filenames:
  1090. htprotect_dir_path = dirpath
  1091. print(htprotect_dir_path)
  1092. shutil.copy(os.path.join(r'D:\special_problem\首次安装未获取悬浮窗权限问题\xmy', 'SplashKFActivity$1.smali'),
  1093. htprotect_dir_path)
  1094. def fix_ydzs_not_show_fubiao_permission(decompile_dir_path):
  1095. for dirpath,dirnames,filenames in os.walk(decompile_dir_path):
  1096. # 拷贝HTProtect.smali
  1097. if r'com\ydzssdk\wake' in dirpath and 'SplashYDZSActivity.smali' in filenames:
  1098. htprotect_dir_path = dirpath
  1099. print(htprotect_dir_path)
  1100. shutil.copy(os.path.join(r'D:\special_problem\首次安装未获取悬浮窗权限问题\rose', 'SplashYDZSActivity.smali'),
  1101. htprotect_dir_path)
  1102. if r'com\ydzssdk\wake' in dirpath and 'SplashYDZSActivity$1.smali' in filenames:
  1103. htprotect_dir_path = dirpath
  1104. print(htprotect_dir_path)
  1105. shutil.copy(os.path.join(r'D:\special_problem\首次安装未获取悬浮窗权限问题\rose', 'SplashYDZSActivity$1.smali'),
  1106. htprotect_dir_path)
  1107. def fix_coolpad_version_3_login_fail_bug(decompile_dir_path):
  1108. insert_str_list = [
  1109. '\n\t.locals 0\n\n',
  1110. '\treturn-void\n\n']
  1111. for dirpath, dirnames, filenames in os.walk(decompile_dir_path):
  1112. if r'com\yulong\account\auth' in dirpath and 'AuthCodeApiImpl.smali' in filenames:
  1113. smali_path = os.path.join(dirpath, 'AuthCodeApiImpl.smali')
  1114. with open(smali_path, 'r', encoding='utf-8') as f:
  1115. smali_str_arr = f.readlines()
  1116. index_str = '.method private returnAuthError(Lcom/yulong/account/common/info/ErrorInfo;)V'
  1117. end_method_str = '.end method'
  1118. insert_str = ''.join(insert_str_list)
  1119. on_create_index = 0
  1120. insert_index = 0
  1121. for line in smali_str_arr:
  1122. if index_str in line:
  1123. on_create_index = smali_str_arr.index(line)
  1124. print('on_create_index', on_create_index, line)
  1125. break
  1126. for index, value in enumerate(smali_str_arr):
  1127. if index > on_create_index and end_method_str in value:
  1128. insert_index = index
  1129. print('insert_index', index)
  1130. break
  1131. print(on_create_index, insert_index)
  1132. del smali_str_arr[on_create_index + 1:insert_index]
  1133. smali_str_arr.insert(on_create_index + 1, insert_str)
  1134. with open(smali_path, 'w', encoding='utf-8') as f:
  1135. f.write(''.join(smali_str_arr))
  1136. break
  1137. def decode_yb_and_del_v4_and_copy_yb_res_and_modify_colors_v31(decompile_dir_path, yb_path):
  1138. yb_decode_path = r'D:\work\game_yb'
  1139. # aapt2_output_dir = r'D:\work\output'
  1140. aapt2_output_dir = r'D:\work\wlxxkp_30181_朱雀2_1'
  1141. # cmd_decode_yb = f'apktool d {yb_path} -f -o {yb_decode_path} --only-main-classes'
  1142. # os.system(cmd_decode_yb)
  1143. # 用原包中的abc_screen_simple、abc_screen_content_include、abc_action_menu_item_layout.xml替换小绵包中的
  1144. shutil.copy(os.path.join(yb_decode_path, "res", 'layout', 'abc_screen_simple.xml'), os.path.join(decompile_dir_path, "res", 'layout'))
  1145. shutil.copy(os.path.join(yb_decode_path, "res", 'layout', 'abc_screen_content_include.xml'), os.path.join(decompile_dir_path, "res", 'layout'))
  1146. shutil.copy(os.path.join(yb_decode_path, "res", 'layout', 'abc_action_menu_item_layout.xml'), os.path.join(decompile_dir_path, "res", 'layout'))
  1147. # # 将原包中的values-v31和color-v31拷贝到xmy\res目录下
  1148. # shutil.copytree(os.path.join(yb_decode_path,'res','navigation'),os.path.join(decompile_dir_path,'res','navigation'))
  1149. # #删除drawable-v4、mipmap-v4等含有v4的文件夹
  1150. # for res_dir_name in os.listdir(os.path.join(decompile_dir_path, 'res')):
  1151. # if 'v4' in res_dir_name and ('drawable' in res_dir_name or 'mipmap' in res_dir_name):
  1152. # drawable_v4_path = os.path.join(decompile_dir_path, 'res', res_dir_name)
  1153. # print('delete:', drawable_v4_path)
  1154. # shutil.rmtree(drawable_v4_path)
  1155. # # #
  1156. # # colors_xml_path = os.path.join(decompile_dir_path, 'res', 'values-v31', 'colors.xml')
  1157. # # xml_tree = ET.parse(colors_xml_path)
  1158. # # xml_root = xml_tree.getroot()
  1159. # # color_roots = xml_root.findall('./color')
  1160. # # for style_root in color_roots:
  1161. # # style_root.text = '@android:color/white'
  1162. # # xml_tree.write(colors_xml_path, encoding='utf-8', xml_declaration=True)
  1163. #
  1164. # if not os.path.exists(aapt2_output_dir):
  1165. # os.makedirs(aapt2_output_dir)
  1166. # print("make dir:", aapt2_output_dir)
  1167. # # aapt2不支持中文路径,拷贝渠道包res到output
  1168. # shutil.copytree(os.path.join(decompile_dir_path, "res"), os.path.join(aapt2_output_dir, "res"))
  1169. # # 重新编译资源
  1170. # channel_apk_res_path = os.path.join(aapt2_output_dir, "res")
  1171. # aapt2_res_zip_path = os.path.join(aapt2_output_dir, "res.zip")
  1172. # 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'
  1173. # print(cmd_aapt2_compile)
  1174. # os.system(cmd_aapt2_compile)
  1175. # aapt2_apk_path = os.path.join(aapt2_output_dir, "aapt.apk")
  1176. # 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'
  1177. # print(cmd_aapt2_link)
  1178. # os.system(cmd_aapt2_link)
  1179. # 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'
  1180. # print(cmd_decode_output_apk)
  1181. # os.system(cmd_decode_output_apk)
  1182. yb_public_path = os.path.join(yb_decode_path, "res", "values", "public.xml")
  1183. # build_public_path = os.path.join(aapt2_output_dir, "aapt", "res", "values", "public.xml")
  1184. build_public_path = os.path.join(aapt2_output_dir, "res", "values", "public.xml")
  1185. apk_path = decompile_dir_path
  1186. cmd_run_refresh_resource = rf'python F:\python_learn\day_1\learn\refresh_resource_wlxx.py {yb_public_path} {build_public_path} {apk_path}'
  1187. print(cmd_run_refresh_resource)
  1188. os.system(cmd_run_refresh_resource)
  1189. cmd_build_apk = rf'apktool b {decompile_dir_path} -f -o D:\work\test.apk --only-main-classes'
  1190. os.system(cmd_build_apk)
  1191. cmd_sign_str = rf'ydzs_sign D:\work\test.apk'
  1192. os.system(cmd_sign_str)
  1193. cmd_install_str = r'adb install D:\work\test.apk'
  1194. os.system(cmd_install_str)
  1195. # shutil.copy(build_public_path, os.path.join(decompile_dir_path, "res", "values"))
  1196. # shutil.rmtree(aapt2_output_dir)
  1197. # shutil.rmtree(yb_decode_path)
  1198. def change_old_kupai_loginNew_to_logout(decompile_dir_path):
  1199. for dirpath, dirnames, filenames in os.walk(decompile_dir_path):
  1200. if r'com\coolcloud\uac\android\api' in dirpath and 'Coolcloud.smali' in filenames:
  1201. smali_path = os.path.join(dirpath, 'Coolcloud.smali')
  1202. with open(smali_path, 'r', encoding='utf-8') as f:
  1203. smali_str_arr = f.readlines()
  1204. index_str = '.method public loginNew('
  1205. end_method_str = '.end method'
  1206. # insert_str = ''.join(insert_str_list)
  1207. on_create_index = 0
  1208. insert_index = 0
  1209. for line in smali_str_arr:
  1210. if index_str in line:
  1211. on_create_index = smali_str_arr.index(line)
  1212. print('on_create_index', on_create_index, line)
  1213. break
  1214. for index, value in enumerate(smali_str_arr):
  1215. if index > on_create_index != 0 and 'login(' in value:
  1216. print('index =', index, 'value=', value)
  1217. smali_str_arr[index] = smali_str_arr[index].replace('login', 'logout')
  1218. print('after replace value=', value)
  1219. break
  1220. with open(smali_path, 'w', encoding='utf-8') as f:
  1221. f.write(''.join(smali_str_arr))
  1222. break
  1223. def fix_xmy_webview_recharge_bug(decompile_dir_path):
  1224. for dirpath, dirnames, filenames in os.walk(decompile_dir_path):
  1225. if r'com\yog\kothoth\view\activity' in dirpath and 'SSRechargeActivity.smali' in filenames:
  1226. smali_path = os.path.join(dirpath, 'SSRechargeActivity.smali')
  1227. print(smali_path)
  1228. with open(smali_path, 'r') as f:
  1229. smali_str_arr = f.readlines()
  1230. for line in smali_str_arr:
  1231. if 'invoke-virtual {v0}, Lcom/yog/kothoth/view/widget/AdvancedWebView;->onPause()V' in line:
  1232. smali_str_arr[smali_str_arr.index(
  1233. line)] = '\t#invoke-virtual {v0}, Lcom/yog/kothoth/view/widget/AdvancedWebView;->onPause()V\n'
  1234. with open(smali_path, 'w') as f:
  1235. f.write(''.join(smali_str_arr))
  1236. if r'com\yog\kothoth\view\activity' in dirpath and 'SSUserCenterActivity.smali' in filenames:
  1237. smali_path = os.path.join(dirpath, 'SSUserCenterActivity.smali')
  1238. print(smali_path)
  1239. with open(smali_path, 'r') as f:
  1240. smali_str_arr = f.readlines()
  1241. for line in smali_str_arr:
  1242. if 'invoke-virtual {v0}, Lcom/yog/kothoth/view/widget/AdvancedWebView;->onPause()V' in line:
  1243. smali_str_arr[smali_str_arr.index(
  1244. line)] = '\t#invoke-virtual {v0}, Lcom/yog/kothoth/view/widget/AdvancedWebView;->onPause()V\n'
  1245. with open(smali_path, 'w') as f:
  1246. f.write(''.join(smali_str_arr))
  1247. def close_xmy_realname(decompile_dir_path):
  1248. developer_path = os.path.join(decompile_dir_path, 'assets', 'developer.properties')
  1249. print(developer_path)
  1250. with open(developer_path, 'r', encoding='utf-8') as f:
  1251. smali_str_arr = f.readlines()
  1252. for line in smali_str_arr:
  1253. if 'isRealname' in line:
  1254. smali_str_arr[smali_str_arr.index(line)] = line.replace('0', '1')
  1255. break
  1256. with open(developer_path, 'w', encoding='utf-8') as f:
  1257. f.write(''.join(smali_str_arr))
  1258. def open_xmy_realname(decompile_dir_path):
  1259. developer_path = os.path.join(decompile_dir_path, 'assets', 'developer.properties')
  1260. print(developer_path)
  1261. with open(developer_path, 'r', encoding='utf-8') as f:
  1262. smali_str_arr = f.readlines()
  1263. for line in smali_str_arr:
  1264. if 'isRealname' in line:
  1265. smali_str_arr[smali_str_arr.index(line)] = line.replace('1', '0')
  1266. break
  1267. with open(developer_path, 'w', encoding='utf-8') as f:
  1268. f.write(''.join(smali_str_arr))
  1269. def find_top_application_path(decompile_dir,application_path):
  1270. super_application_regex = re.compile(r'.*?\.super\s+(.*?);.*?')
  1271. # .super Lcom/wf/sdk/WFApplication;
  1272. top_application_path = ''
  1273. super_application_name = ''
  1274. with open(application_path, 'r') as f:
  1275. str = f.read()
  1276. super_application_name = re.findall(super_application_regex, str)[0]
  1277. print('super_application_name', super_application_name)
  1278. super_application_name = super_application_name[1:] + '.smali'
  1279. path_list = glob.glob(os.path.join(decompile_dir, 'smali*/%s' % super_application_name))
  1280. if len(path_list) != 0:
  1281. top_application_path = path_list[0]
  1282. print('super_application_path', top_application_path)
  1283. if super_application_name == ' Landroid/support/multidex/MultiDexApplication':
  1284. print('top_super_application_name', super_application_name)
  1285. return top_application_path
  1286. else:
  1287. find_top_application_path(decompile_dir,top_application_path)
  1288. def test(decompile_dir):
  1289. namespace = '{http://schemas.android.com/apk/res/android}'
  1290. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  1291. manifest_path = os.path.join(decompile_dir, 'AndroidManifest.xml')
  1292. xml_tree = ET.parse(manifest_path)
  1293. xml_root = xml_tree.getroot()
  1294. application_node = xml_root.find('./application')
  1295. application_name = application_node.get('%sname' % namespace)
  1296. application_name_split_list = application_name.split('.')
  1297. print('application_name_split_list', application_name_split_list)
  1298. application_path = '/'.join(application_name_split_list) + '.smali'
  1299. application_path = glob.glob(os.path.join(decompile_dir, 'smali*/%s' % application_path))[0]
  1300. print('application_path', application_path)
  1301. print('application_name', application_name)
  1302. top_application_path = find_top_application_path(decompile_dir, application_path)
  1303. print('top_application_path',top_application_path)
  1304. # for dirpath, dirnames, filenames in os.walk(decompile_dir):
  1305. # if r'androidx\startup' in dirpath or r'androidx\work\impl' in dirpath or r'com\snyu\ddcr' in dirpath \
  1306. # or r'com\kingsoft\shiyou\omnisdk\project\ui' in dirpath or r'com\sharry\lib\album' in dirpath:
  1307. # for smali_file in filenames:
  1308. # smali_file_path = os.path.join(dirpath, smali_file)
  1309. # print(smali_file_path)
  1310. # find_rose_resource_and_replace(smali_file_path, r_regex_str)
  1311. # # attachBaseContext提前赋值
  1312. def delete_bugly_init_method(decompile_dir_path):
  1313. insert_str_list = [
  1314. '\n\t.locals 0\n\n',
  1315. '\treturn-void\n\n']
  1316. for dirpath, dirnames, filenames in os.walk(decompile_dir_path):
  1317. if r'com\tencent\bugly\agent' in dirpath and 'GameAgent.smali' in filenames:
  1318. smali_path = os.path.join(dirpath, 'GameAgent.smali')
  1319. with open(smali_path, 'r', encoding='utf-8') as f:
  1320. smali_str_arr = f.readlines()
  1321. index_str = '.method private static initCrashReport(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V'
  1322. end_method_str = '.end method'
  1323. insert_str = ''.join(insert_str_list)
  1324. on_create_index = 0
  1325. insert_index = 0
  1326. for line in smali_str_arr:
  1327. if index_str in line:
  1328. on_create_index = smali_str_arr.index(line)
  1329. print('on_create_index', on_create_index, line)
  1330. break
  1331. for index, value in enumerate(smali_str_arr):
  1332. if index > on_create_index and end_method_str in value:
  1333. insert_index = index
  1334. print('insert_index', index)
  1335. break
  1336. print(on_create_index, insert_index)
  1337. del smali_str_arr[on_create_index + 1:insert_index]
  1338. smali_str_arr.insert(on_create_index + 1, insert_str)
  1339. with open(smali_path, 'w', encoding='utf-8') as f:
  1340. f.write(''.join(smali_str_arr))
  1341. break
  1342. for dirpath, dirnames, filenames in os.walk(decompile_dir_path):
  1343. if r'com\tencent\bugly\crashreport' in dirpath and 'CrashReport.smali' in filenames:
  1344. smali_path = os.path.join(dirpath, 'CrashReport.smali')
  1345. with open(smali_path, 'r', encoding='utf-8') as f:
  1346. smali_str_arr = f.readlines()
  1347. index_strs = ['.method public static initCrashReport(Landroid/content/Context;)V',
  1348. '.method public static initCrashReport(Landroid/content/Context;Lcom/tencent/bugly/crashreport/CrashReport$UserStrategy;)V',
  1349. '.method public static initCrashReport(Landroid/content/Context;Ljava/lang/String;Z)V',
  1350. '.method public static initCrashReport(Landroid/content/Context;Ljava/lang/String;ZLcom/tencent/bugly/crashreport/CrashReport$UserStrategy;)V']
  1351. end_method_str = '.end method'
  1352. insert_str = ''.join(insert_str_list)
  1353. for index_str in index_strs:
  1354. on_create_index = 0
  1355. insert_index = 0
  1356. for line in smali_str_arr:
  1357. if index_str in line:
  1358. on_create_index = smali_str_arr.index(line)
  1359. print('on_create_index', on_create_index, line)
  1360. break
  1361. for index, value in enumerate(smali_str_arr):
  1362. if index > on_create_index and end_method_str in value:
  1363. insert_index = index
  1364. print('insert_index', index)
  1365. break
  1366. print(on_create_index, insert_index)
  1367. del smali_str_arr[on_create_index + 1:insert_index]
  1368. smali_str_arr.insert(on_create_index + 1, insert_str)
  1369. with open(smali_path, 'w', encoding='utf-8') as f:
  1370. f.write(''.join(smali_str_arr))
  1371. break
  1372. # 按间距中的绿色按钮以运行脚本。
  1373. if __name__ == '__main__':
  1374. hook_signature(r'D:\work\yb')
  1375. # 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助