script.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. # coding:utf8
  2. import os
  3. import logging
  4. import re
  5. import glob
  6. import shutil
  7. import distutils.dir_util
  8. import gw_file_system
  9. import xml.etree.ElementTree as ET
  10. ANDROID_NS = 'http://schemas.android.com/apk/res/android'
  11. def script(workspace_sdk_dir, extract_dir, channel_sdk_info, new_game_channel_info, game_info):
  12. return
  13. def script_pre(workspace_sdk_dir, extract_dir, channel_sdk_info, new_game_channel_info, game_info):
  14. return
  15. def script_last(workspace_sdk_dir, extract_dir, channel_sdk_info, new_game_channel_info, game_info):
  16. logging.info('game_pack_info: ' + str(channel_sdk_info))
  17. if channel_sdk_info['id'] == "597":
  18. s1 = os.path.join(extract_dir, "smali_classes2", "androidx")
  19. smali_dir = create_mutil_smali(extract_dir)
  20. s3 = os.path.join(smali_dir, "androidx")
  21. list_package = ["legacy","lifecycle","loader","localbroadcastmanager","media","print","slidingpanelayout","swiperefreshlayout","vectordrawable","versionedparcelable","viewpager"]
  22. if not os.path.exists(s3):
  23. distutils.dir_util.mkpath(s3)
  24. move_package(s1, s3, list_package)
  25. s1 = os.path.join(extract_dir, "smali_classes2", "androidx")
  26. smali_dir = create_mutil_smali(extract_dir)
  27. s3 = os.path.join(smali_dir, "androidx")
  28. list_package = ["annotation","appcompat","arch","asynclayoutinflater","browser","collection","concurrent","coordinatorlayout","core","cursoradapter","customview","documentfile","drawerlayout","fragment","interpolator"]
  29. if not os.path.exists(s3):
  30. distutils.dir_util.mkpath(s3)
  31. move_package(s1, s3, list_package)
  32. return
  33. def fix_android_manifest(decompile_dir):
  34. manifest_file = decompile_dir + '/AndroidManifest.xml'
  35. ET.register_namespace('android', ANDROID_NS)
  36. key_android_name = '{' + ANDROID_NS + '}authorities'
  37. target_tree = ET.parse(manifest_file)
  38. target_root = target_tree.getroot()
  39. manifest_node = target_root.get("package")
  40. application_node = target_root.find('application')
  41. if application_node is None:
  42. return
  43. if application_node is not None:
  44. activity_list_node = application_node.findall('provider')
  45. if activity_list_node is None:
  46. return
  47. for activityNode in activity_list_node:
  48. node_name_str = activityNode.attrib[key_android_name]
  49. if node_name_str == 'com.netease.onmyoji.coolpad111':
  50. activityNode.set(key_android_name, manifest_node + '111')
  51. target_tree.write(manifest_file)
  52. def create_mutil_smali(decompileDir):
  53. f_idx = 2
  54. while True:
  55. tmp = gw_file_system.get_full_path(os.path.join(decompileDir, 'smali_classes%d' % f_idx))
  56. tmp = tmp.replace('\\', '/')
  57. tmp = re.sub('/+', '/', tmp)
  58. if os.path.exists(tmp):
  59. f_idx += 1
  60. else:
  61. smali_classes2_dir = tmp
  62. break
  63. # endwhile
  64. os.mkdir(smali_classes2_dir)
  65. return smali_classes2_dir
  66. def move_package(s1, s3, list_package):
  67. for d in list_package:
  68. src = os.path.join(s1, d)
  69. if os.path.exists(src):
  70. dst = os.path.join(s3, d)
  71. distutils.dir_util.copy_tree(src, dst)
  72. distutils.dir_util.remove_tree(src)
  73. def move_package_one(src, dst):
  74. if os.path.exists(src):
  75. distutils.dir_util.copy_tree(src, dst)
  76. distutils.dir_util.remove_tree(src)
  77. def rm_alipay(extract_dir):
  78. delet_file = os.path.join(extract_dir, 'smali/org/json')
  79. print delet_file
  80. logging.info('delet_file: ' + delet_file)
  81. shutil.rmtree(delet_file)
  82. def rm_wechatpay(extract_dir):
  83. delet = os.path.join(extract_dir, 'smali_classes2/com/ipaynow')
  84. print delet
  85. logging.info(delet)
  86. shutil.rmtree(delet)
  87. def change_smali(fooDir):
  88. for smali_flie in glob.glob(fooDir + "/" + "smali*/com/kunlun/platform/android/KunlunApplication.smali"):
  89. print smali_flie
  90. if os.path.isfile(smali_flie):
  91. with open(smali_flie, 'r+') as f:
  92. cont = f.read()
  93. change_str = 'invoke-virtual {p0}, Lcom/kf/framework/KFApplication;->onCreate()V'
  94. str = 'invoke-virtual {p0}, Landroid/app/Application;->onCreate()V'
  95. print len(change_str)
  96. print len(str)
  97. change_str2 = 'invoke-virtual {v0, p1}, Lcom/kf/framework/KFApplication;->onConfigurationChanged(Landroid/content/res/Configuration;)V'
  98. str2 = 'invoke-virtual {v0, p1}, Landroid/app/Application;->onConfigurationChanged(Landroid/content/res/Configuration;)V'
  99. cont = cont.replace(change_str, str)
  100. cont = cont.replace(change_str2, str2)
  101. with open(smali_flie, 'w') as tf:
  102. tf.write(cont)
  103. def intoFirstLine(target, repl, cont):
  104. # srcStr = "onBackPressed"
  105. # regexp = '.method (?:public|protected) +?'+target+"\([^.]+?\.locals +[0-9]{1,2}"
  106. regexp = '.method (?:public|protected) +?' + target + "\([^.]+?\.locals +([0-9]{1,2})"
  107. # print(regexp)
  108. reObj = re.compile(regexp)
  109. matchO = reObj.search(cont)
  110. if matchO:
  111. # print(matchO.group(0))
  112. methodHead = matchO.group(0)
  113. if matchO.group(1) == "0":
  114. methodHead = re.sub("locals +0", "locals 1", methodHead)
  115. repl = methodHead + r'\n\n ' + repl + r'\n\n'
  116. cont = reObj.sub(repl, cont)
  117. else:
  118. # todo call .super method
  119. cont += r'.method protected ' + target + r'()V\n\n .locals 0\n\n ' + repl + r'\n\n .end method\n'
  120. return cont
  121. def fixLifecycleMethod(preDir):
  122. for tfile in glob.glob(preDir + "/" + "smali*/com/supercell/titan/kunlun/GameAppKunlun.smali"):
  123. if os.path.isfile(tfile):
  124. with open(tfile, 'r+') as f:
  125. cont = f.read()
  126. changes = {
  127. "onPause": "invoke-static {}, Lcom/qihoo/gamecenter/sdk/matrix/Matrix;->onPause()V",
  128. "onResume": "invoke-static {}, Lcom/qihoo/gamecenter/sdk/matrix/Matrix;->onResume()V",
  129. "onDestroy": "invoke-static {p0}, Lcom/qihoo/gamecenter/sdk/matrix/Matrix;->destroy(Landroid/content/Context;)V",
  130. "onStop": "invoke-static {}, Lcom/qihoo/gamecenter/sdk/matrix/Matrix;->onStop()V"
  131. }
  132. for k, v in changes.iteritems():
  133. cont = intoFirstLine(k, v, cont)
  134. f.seek(0)
  135. f.write(cont)
  136. f.close()
  137. def handle_public_xml(public_xml_path):
  138. if not os.path.exists(public_xml_path):
  139. logging.info('public_xml is null: ' + public_xml_path)
  140. return
  141. new_lines = []
  142. with open(public_xml_path, 'r+') as f:
  143. for line in f.readlines():
  144. # l = line.strip()
  145. if line.find("x7_bg_female_pink_7") > -1:
  146. continue
  147. if line.find("x7_icon_female_pink") > -1:
  148. continue
  149. if line.find("x7_bg_female_pink_right_7") > -1:
  150. continue
  151. new_lines.append(line)
  152. f.seek(0)
  153. f.truncate()
  154. f.writelines(new_lines)
  155. return
  156. def move_package_for_small_sheep(extract_dir):
  157. s1 = os.path.join(extract_dir, "smali_classes4", "com/netease")
  158. smali_classes2_dir = create_mutil_smali(extract_dir)
  159. s3 = os.path.join(smali_classes2_dir, "com/netease")
  160. list_package = ["mpay", "neox", "ngpush", "ntunisdk", "onmyoji", "pharos", "tryautotext2", "unisdk", "xyqa"]
  161. if not os.path.exists(s3):
  162. distutils.dir_util.mkpath(s3)
  163. move_package(s1, s3, list_package)
  164. lines = [
  165. 'invoke-virtual {p3}, Lcom/kf/framework/KFApplication;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;',
  166. 'invoke-virtual {v0}, Lcom/kf/framework/KFApplication;->onCreate()V']
  167. def replace_kf_application(extract_dir):
  168. goal_file = glob.glob(os.path.join(extract_dir,
  169. 'smali*/com/netease/ntunisdk/unifix_hotfix_library/proxyApplication/UFProxyApplication.smali'))[
  170. 0]
  171. print(os.path.isfile(goal_file))
  172. if os.path.isfile(goal_file):
  173. logging.info('method_proceed: ' + 'goal_file')
  174. print(goal_file)
  175. with open(goal_file, 'r+') as f:
  176. cont = f.read()
  177. for line in lines:
  178. change_line = line.replace('Lcom/kf/framework/KFApplication',
  179. 'Landroid/app/Application')
  180. cont = cont.replace(line, change_line)
  181. logging.info('replace_str: ' + cont)
  182. with open(goal_file, 'w+') as tf:
  183. tf.write(cont)
  184. if __name__ == '__main__':
  185. replace_kf_application("D:\\work\\yys")