三国杀名将传Y-朱雀.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. import os
  4. import shutil
  5. import sys
  6. import zipfile
  7. import xml.etree.ElementTree as ET
  8. import zipfile
  9. import win32api
  10. import win32con
  11. import yaml
  12. print("三国杀名将传Y-朱雀")
  13. print(sys.argv)
  14. decompile_dir_path = sys.argv[1]
  15. game_dir = sys.argv[2]
  16. print(decompile_dir_path)
  17. def fix_install_fail_bug(decompile_dir_path):
  18. namespace = '{http://schemas.android.com/apk/res/android}'
  19. ET.register_namespace('android', 'http://schemas.android.com/apk/res/android')
  20. manifest_path = os.path.join(decompile_dir_path, 'AndroidManifest.xml')
  21. xml_tree = ET.parse(manifest_path)
  22. xml_root = xml_tree.getroot()
  23. application_node = xml_root.find('./application')
  24. etract_value = application_node.get(f'{namespace}extractNativeLibs')
  25. if etract_value is not None and etract_value == 'false':
  26. # 修改extractNativeLib
  27. application_node.set(f'{namespace}extractNativeLibs', 'true')
  28. xml_tree.write(manifest_path, encoding='utf-8', xml_declaration=True)
  29. yaml_path = os.path.join(decompile_dir_path, 'apktool.yml')
  30. file = open(yaml_path, 'r', encoding='utf-8')
  31. yaml_result = yaml.load(file, Loader=yaml.BaseLoader)
  32. sdk_info = yaml_result['sdkInfo']
  33. yaml_result['packageInfo']['renameManifestPackage'] = None
  34. print(sdk_info)
  35. if int(sdk_info['targetSdkVersion']) > 29:
  36. sdk_info['targetSdkVersion'] = '29'
  37. print(sdk_info)
  38. file.close()
  39. with open(yaml_path, 'w', encoding='utf-8') as f:
  40. yaml.dump(yaml_result, f)
  41. fix_install_fail_bug(decompile_dir_path)
  42. # 新版sdk取消登录调不起登录
  43. def modify_cancel_login_and_fubiao(decompile_dir):
  44. insert_str_list = [
  45. '\n\tinvoke-static {}, Lcom/yog/kothoth/YogSDK;->getInstance()Lcom/yog/kothoth/YogSDK;\n\n',
  46. '\tmove-result-object v0\n\n',
  47. '\tiget-object v1, p0, Lcom/yulong/sdk/promoter/PromoterGameAuthApi$4;->val$activity:Landroid/app/Activity;\n\n',
  48. '\tcheck-cast v1, Landroid/content/Context;\n\n',
  49. '\tinvoke-virtual {v0, v1}, Lcom/yog/kothoth/YogSDK;->login(Landroid/content/Context;)V\n\n']
  50. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  51. if r'com\yulong\sdk\promoter' in dirpath and 'PromoterGameAuthApi$4.smali' in filenames:
  52. smali_path = os.path.join(dirpath, 'PromoterGameAuthApi$4.smali')
  53. print(smali_path)
  54. with open(smali_path, 'r', encoding='utf-8') as f:
  55. smali_str_arr = f.readlines()
  56. index_str = r'sdk\u767b\u9646\u5931\u8d25:'
  57. end_method_str = 'Lcom/yulong/sdk/promoter/PromoterGameAuthApi;->showLog(Ljava/lang/String;)V'
  58. insert_str = ''.join(insert_str_list)
  59. on_create_index = 0
  60. insert_index = 0
  61. for line in smali_str_arr:
  62. if index_str in line:
  63. on_create_index = smali_str_arr.index(line)
  64. print('on_create_index', on_create_index, line)
  65. break
  66. for index, value in enumerate(smali_str_arr):
  67. if index > on_create_index and end_method_str in value:
  68. insert_index = index
  69. print('insert_index', index)
  70. break
  71. print(on_create_index, insert_index)
  72. smali_str_arr.insert(insert_index+1, insert_str)
  73. with open(smali_path, 'w', encoding='utf-8') as f:
  74. f.write(''.join(smali_str_arr))
  75. if r'com\yog\kothoth\floatwindow' in dirpath and 'YogFloatWindow.smali' in filenames:
  76. smali_path = os.path.join(dirpath, 'YogFloatWindow.smali')
  77. with open(smali_path, 'r', encoding='utf-8') as f:
  78. smali_str_arr = f.readlines()
  79. for line in smali_str_arr:
  80. if '0x1f4' in line:
  81. smali_str_arr[smali_str_arr.index(line)] = line.replace('0x1f4', '0xa')
  82. break
  83. with open(smali_path, 'w', encoding='utf-8') as f:
  84. f.write(''.join(smali_str_arr))
  85. if r'com\yog\kothoth\data\bean' in dirpath and 'UserResult.smali' in filenames:
  86. smali_path = os.path.join(dirpath, 'UserResult.smali')
  87. with open(smali_path, 'r', encoding='utf-8') as f:
  88. smali_str_arr = f.readlines()
  89. index_str = '.method public constructor <init>(ZLjava/lang/String;)V'
  90. end_method_str = '.end method'
  91. on_create_index = 0
  92. insert_index = 0
  93. for line in smali_str_arr:
  94. if index_str in line:
  95. on_create_index = smali_str_arr.index(line)
  96. print('on_create_index', on_create_index, line)
  97. break
  98. for index, value in enumerate(smali_str_arr):
  99. if index > on_create_index and end_method_str in value:
  100. insert_index = index
  101. print('insert_index', index)
  102. break
  103. for index, value in enumerate(smali_str_arr):
  104. if on_create_index < index < insert_index:
  105. if '0x0' in value:
  106. print(value)
  107. smali_str_arr[index] = value.replace('0x0', '0x1')
  108. break
  109. with open(smali_path, 'w', encoding='utf-8') as f:
  110. f.write(''.join(smali_str_arr))
  111. if r'com\yog\kothoth' in dirpath and 'YogSDKSelf.smali' in filenames:
  112. smali_path = os.path.join(dirpath, 'YogSDKSelf.smali')
  113. with open(smali_path, 'r', encoding='utf-8') as f:
  114. smali_str_arr = f.readlines()
  115. index_str = '.method public static isFastDoubleClick(J)Z'
  116. end_method_str = '.end method'
  117. on_create_index = 0
  118. insert_index = 0
  119. for line in smali_str_arr:
  120. if index_str in line:
  121. on_create_index = smali_str_arr.index(line)
  122. print('on_create_index', on_create_index, line)
  123. break
  124. for index, value in enumerate(smali_str_arr):
  125. if index > on_create_index and end_method_str in value:
  126. insert_index = index
  127. print('insert_index', index)
  128. break
  129. for index, value in enumerate(smali_str_arr):
  130. if on_create_index < index < insert_index:
  131. if '0x1' in value:
  132. print(value)
  133. smali_str_arr[index] = value.replace('0x1', '0x0')
  134. break
  135. with open(smali_path, 'w', encoding='utf-8') as f:
  136. f.write(''.join(smali_str_arr))
  137. # modify_cancel_login_and_fubiao(decompile_dir_path)
  138. def un_zip_and_copy_39285EFA(game_dir):
  139. game_name = ''
  140. for name in os.listdir(game_dir):
  141. if '小绵羊' not in name and '朱雀' not in name:
  142. game_name = name
  143. print(game_name)
  144. if game_name == '':
  145. raise Exception('让客服放入原包')
  146. file_name = os.path.join(game_dir, game_name)
  147. print(file_name)
  148. yb_unzip_path = r"D:\work\yb_files"
  149. zip_file = zipfile.ZipFile(file_name)
  150. if os.path.isdir(file_name + "_files"):
  151. pass
  152. else:
  153. print('Problem occurred during generating libdoc for', os.mkdir(yb_unzip_path))
  154. for names in zip_file.namelist():
  155. zip_file.extract(names, yb_unzip_path)
  156. zip_file.close()
  157. shutil.copy(os.path.join(yb_unzip_path, 'assets', '39285EFA.dex'), os.path.join(decompile_dir_path, 'assets'))
  158. shutil.rmtree(yb_unzip_path)
  159. # un_zip_and_copy_39285EFA(game_dir)