script.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. # coding:utf8
  2. __author__ = '极无双'
  3. import os
  4. import logging
  5. import xml.dom.minidom
  6. import re
  7. import shutil
  8. import glob
  9. ANDROID_NS = 'http://schemas.android.com/apk/res/android'
  10. from xml.etree import ElementTree as ET
  11. def script_last(SDK, decompileDir, channelSdkInfo, new_game_channel_info, gameInfo):
  12. # fix_coolyun_application_getinstance_null_bug(decompileDir)
  13. # replace_application_verify_rose_bug(decompileDir)
  14. is_version_3_sdk = fix_coolpad_version_3_method_name_change_bug(decompileDir)
  15. print('is_version_3_sdk: ', is_version_3_sdk)
  16. # if is_version_3_sdk:
  17. # fix_coolpad_version_3_login_fail_bug(decompileDir)
  18. return
  19. def fix_coolyun_application_getinstance_null_bug(decompile_dir):
  20. insert_str_list = [
  21. '\n\t.locals 1\n\n',
  22. '\tsget-object v0, Lcom/coolyun/framework/CoolYunApplication;->application:Landroid/content/Context;\n\n',
  23. '\tcheck-cast v0, Lcom/coolyun/framework/CoolYunApplication;\n\n',
  24. '\treturn-object v0\n\n']
  25. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  26. if r'com\coolyun\framework' in dirpath and 'CoolYunApplication.smali' in filenames:
  27. smali_path = os.path.join(dirpath, 'CoolYunApplication.smali')
  28. with open(smali_path, 'r') as f:
  29. smali_str_arr = f.readlines()
  30. index_str = '.method public static getInstance()Lcom/coolyun/framework/CoolYunApplication;'
  31. end_method_str = '.end method'
  32. insert_str = ''.join(insert_str_list)
  33. on_create_index = 0
  34. insert_index = 0
  35. for line in smali_str_arr:
  36. if index_str in line:
  37. on_create_index = smali_str_arr.index(line)
  38. print('on_create_index', on_create_index, line)
  39. break
  40. for index, value in enumerate(smali_str_arr):
  41. if index > on_create_index and end_method_str in value:
  42. insert_index = index
  43. print('insert_index', index)
  44. break
  45. print(on_create_index, insert_index)
  46. del smali_str_arr[on_create_index + 1:insert_index]
  47. smali_str_arr.insert(on_create_index + 1, insert_str)
  48. with open(smali_path, 'w') as f:
  49. f.write(''.join(smali_str_arr))
  50. break
  51. def isNeedReplaceApplicationLine(line):
  52. return '.super Landroid/app/Application;' in line or 'invoke-direct {p0}, Landroid/app/Application;-><init>()V' in line or 'invoke-super {p0, p1}, Landroid/app/Application;->attachBaseContext(Landroid/content/Context;)V' in line or 'invoke-super {p0, p1}, Landroid/app/Application;->onConfigurationChanged(Landroid/content/res/Configuration;)V' in line or 'invoke-super {p0}, Landroid/app/Application;->onLowMemory()V' in line or 'invoke-super {p0}, Landroid/app/Application;->onTerminate()V' in line or 'invoke-super {p0, p1}, Landroid/app/Application;->onTrimMemory(I)V' in line or 'invoke-super {p0}, Landroid/app/Application;->onCreate()V' in line
  53. def is_rose_replace_application(line):
  54. return '.super Lcom/coolyun/framework/CoolYunApplication;' in line or 'invoke-direct {p0}, Lcom/coolyun/framework/CoolYunApplication;-><init>()V' in line or 'invoke-super {p0, p1}, Lcom/coolyun/framework/CoolYunApplication;->attachBaseContext(Landroid/content/Context;)V' in line or 'invoke-super {p0, p1}, Lcom/coolyun/framework/CoolYunApplication;->onConfigurationChanged(Landroid/content/res/Configuration;)V' in line or 'invoke-super {p0}, Lcom/coolyun/framework/CoolYunApplication;->onLowMemory()V' in line or 'invoke-super {p0}, Lcom/coolyun/framework/CoolYunApplication;->onTerminate()V' in line or 'invoke-super {p0, p1}, Lcom/coolyun/framework/CoolYunApplication;->onTrimMemory(I)V' in line or 'invoke-super {p0}, Lcom/coolyun/framework/CoolYunApplication;->onCreate()V' in line
  55. def replace_application_verify_rose_bug(decompile_dir):
  56. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  57. if 'com\\wrapper\\proxyapplication' in dirpath and 'WrapperProxyApplication.smali' in filenames:
  58. application_path = os.path.join(dirpath, "WrapperProxyApplication.smali")
  59. print(application_path)
  60. f = open(application_path, "r")
  61. smali_str_arr = f.readlines()
  62. f.close()
  63. for line in smali_str_arr:
  64. if not is_rose_replace_application(line) and 'Lcom/coolyun/framework/CoolYunApplication' in line:
  65. smali_str_arr[smali_str_arr.index(line)] = line.replace('Lcom/coolyun/framework/CoolYunApplication',
  66. 'Landroid/app/Application')
  67. if isNeedReplaceApplicationLine(line):
  68. smali_str_arr[smali_str_arr.index(line)] = line.replace('Landroid/app/Application',
  69. 'Lcom/coolyun/framework/CoolYunApplication')
  70. f = open(application_path, "w")
  71. f.write(''.join(smali_str_arr))
  72. f.close()
  73. def fix_coolpad_version_3_method_name_change_bug(decompile_dir):
  74. # is_version_3_sdk = False
  75. is_new_sdk_and_version_lt_version_3 = False
  76. #
  77. # for dirpath, dirnames, filenames in os.walk(decompile_dir):
  78. # if 'com\\yulong\\sdk\\promoter' in dirpath and 'OnGameAuthListener.smali' in filenames:
  79. # auth_listener_path = os.path.join(dirpath, 'OnGameAuthListener.smali')
  80. # f = open(auth_listener_path, 'r')
  81. # smali_str_arr = f.read()
  82. # if 'onSuccess' in smali_str_arr:
  83. # is_version_3_sdk = True
  84. # if 'onResult' in smali_str_arr:
  85. # is_new_sdk_and_version_lt_version_3 = True
  86. # f.close()
  87. # break
  88. is_version_3_sdk=True
  89. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  90. if 'com\\yulong\\sdk\\promoter' in dirpath and 'PromoterGameAuthApi$1.smali' in filenames:
  91. smali_path = os.path.join(dirpath, 'PromoterGameAuthApi$1.smali')
  92. print(smali_path)
  93. f = open(smali_path, 'r')
  94. smali_str_arr = f.readlines()
  95. index_str = 'onSuccess'
  96. if is_new_sdk_and_version_lt_version_3:
  97. index_str = 'onSuccess'
  98. elif is_version_3_sdk:
  99. index_str = 'onResult'
  100. for line in smali_str_arr:
  101. if index_str in line:
  102. print(line)
  103. index = smali_str_arr.index(line)
  104. if is_new_sdk_and_version_lt_version_3:
  105. smali_str_arr[index] = line.replace(index_str, 'onResult')
  106. elif is_version_3_sdk:
  107. smali_str_arr[index] = line.replace(index_str, 'onSuccess')
  108. print(smali_str_arr[index])
  109. break
  110. f.close()
  111. f = open(smali_path, 'w')
  112. f.write(''.join(smali_str_arr))
  113. f.close()
  114. break
  115. return is_version_3_sdk
  116. def fix_coolpad_version_3_login_fail_bug(decompile_dir_path):
  117. insert_str_list = [
  118. '\n\t.locals 0\n\n',
  119. '\treturn-void\n\n']
  120. for dirpath, dirnames, filenames in os.walk(decompile_dir_path):
  121. if 'com\\yulong\\account\\auth' in dirpath and 'AuthCodeApiImpl.smali' in filenames:
  122. smali_path = os.path.join(dirpath, 'AuthCodeApiImpl.smali')
  123. f = open(smali_path, 'r')
  124. smali_str_arr = f.readlines()
  125. index_str = '.method private returnAuthError(Lcom/yulong/account/common/info/ErrorInfo;)V'
  126. end_method_str = '.end method'
  127. insert_str = ''.join(insert_str_list)
  128. on_create_index = 0
  129. insert_index = 0
  130. for line in smali_str_arr:
  131. if index_str in line:
  132. on_create_index = smali_str_arr.index(line)
  133. print('on_create_index', on_create_index, line)
  134. break
  135. for index, value in enumerate(smali_str_arr):
  136. if index > on_create_index and end_method_str in value:
  137. insert_index = index
  138. print('insert_index', index)
  139. break
  140. print(on_create_index, insert_index)
  141. del smali_str_arr[on_create_index + 1:insert_index]
  142. smali_str_arr.insert(on_create_index + 1, insert_str)
  143. f.close()
  144. f = open(smali_path, 'w')
  145. f.write(''.join(smali_str_arr))
  146. f.close()
  147. break
  148. if __name__ == '__main__':
  149. ""