script.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. # -*- coding:utf-8 -*-
  2. __author__ = 'Snow'
  3. import yaml
  4. import os
  5. import re
  6. import logging
  7. 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'
  8. def findRSmaliAndReplace(smali_file_path, regex_str):
  9. with open(smali_file_path, 'r') as f:
  10. smali_str = f.read()
  11. pattern = re.compile(regex_str)
  12. resource_arr = pattern.findall(smali_str)
  13. for r_str in resource_arr:
  14. virtual_name = r_str[r_str.index(' ') + 1:r_str.index(',')]
  15. print(virtual_name)
  16. resource_type = r_str[r_str.index('R$') + 2:r_str.index(';')].capitalize()
  17. print(resource_type)
  18. resource_name = r_str[r_str.index('->') + 2:r_str.index(':')]
  19. print(resource_name)
  20. 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" % (
  21. virtual_name, resource_name, virtual_name, resource_type, virtual_name)
  22. print(new_r_str)
  23. smali_str = smali_str.replace(r_str, new_r_str)
  24. with open(smali_file_path, 'w') as f:
  25. f.write(smali_str)
  26. def replaceRoseResource(d_dir):
  27. for dirpath, dirnames, filenames in os.walk(d_dir):
  28. if r'com\wm\shh\zx' in dirpath:
  29. for smali_file in filenames:
  30. smali_file_path = os.path.join(dirpath, smali_file)
  31. print(smali_file_path)
  32. findRSmaliAndReplace(smali_file_path, r_regex_str)
  33. if r'com\wanmei\zhuxian' in dirpath and 'GameActivity.smali' in filenames:
  34. smali_file_path = os.path.join(dirpath, "GameActivity.smali")
  35. print(smali_file_path)
  36. findRSmaliAndReplace(smali_file_path, r_regex_str)
  37. if r'com\wanmei\zhuxian\qcloud\image' in dirpath and 'UpLoadImageActivity.smali' in filenames:
  38. smali_file_path = os.path.join(dirpath, "UpLoadImageActivity.smali")
  39. print(smali_file_path)
  40. findRSmaliAndReplace(smali_file_path, r_regex_str)
  41. def isNeedReplaceApplicationLine(line):
  42. return '.super Landroid/app/Application;' in line \
  43. or 'invoke-direct {p0}, Landroid/app/Application;-><init>()V' in line \
  44. or 'invoke-super {p0, p1}, Landroid/app/Application;->attachBaseContext(Landroid/content/Context;)V' in line \
  45. or 'invoke-super {p0, p1}, Landroid/app/Application;->onConfigurationChanged(Landroid/content/res/Configuration;)V' in line \
  46. or 'invoke-super {p0}, Landroid/app/Application;->onLowMemory()V' in line \
  47. or 'invoke-super {p0}, Landroid/app/Application;->onTerminate()V' in line \
  48. or 'invoke-super {p0, p1}, Landroid/app/Application;->onTrimMemory(I)V' in line \
  49. or 'invoke-super {p0}, Landroid/app/Application;->onCreate()V' in line
  50. def is_kf_replace_application(line):
  51. return '.super Lcom/kf/framework/KFApplication;' in line \
  52. or 'invoke-direct {p0}, Lcom/kf/framework/KFApplication;-><init>()V' in line \
  53. or 'invoke-super {p0, p1}, Lcom/kf/framework/KFApplication;->attachBaseContext(Landroid/content/Context;)V' in line \
  54. or 'invoke-super {p0, p1}, Lcom/kf/framework/KFApplication;->onConfigurationChanged(Landroid/content/res/Configuration;)V' in line \
  55. or 'invoke-super {p0}, Lcom/kf/framework/KFApplication;->onLowMemory()V' in line \
  56. or 'invoke-super {p0}, Lcom/kf/framework/KFApplication;->onTerminate()V' in line \
  57. or 'invoke-super {p0, p1}, Lcom/kf/framework/KFApplication;->onTrimMemory(I)V' in line \
  58. or 'invoke-super {p0}, Lcom/kf/framework/KFApplication;->onCreate()V' in line
  59. def replace_application_verify_xmy_bug(decompile_dir):
  60. for dirpath, dirnames, filenames in os.walk(decompile_dir):
  61. if r'com\pwrd\onesdk\onesdkcommon\onesdkapplication' in dirpath and 'OneSDKApplication.smali' in filenames:
  62. application_path = os.path.join(dirpath, "OneSDKApplication.smali")
  63. print(application_path)
  64. with open(application_path, "r") as f:
  65. smali_str_arr = f.readlines()
  66. for line in smali_str_arr:
  67. if not is_kf_replace_application(line) and 'Lcom/kf/framework/KFApplication' in line:
  68. smali_str_arr[smali_str_arr.index(line)] = line.replace('Lcom/kf/framework/KFApplication',
  69. 'Landroid/app/Application')
  70. if isNeedReplaceApplicationLine(line):
  71. smali_str_arr[smali_str_arr.index(line)] = line.replace('Landroid/app/Application',
  72. 'Lcom/kf/framework/KFApplication')
  73. with open(application_path, "w") as f:
  74. f.write(''.join(smali_str_arr))
  75. def meta_constructor(loader, node):
  76. value = loader.construct_mapping(node)
  77. return value
  78. def script_last(workspace_sdk_dir, extract_dir, channel_sdk_info, new_game_channel_info, game_info):
  79. logging.info('game_pack_info: ' + str(channel_sdk_info))
  80. replace_application_verify_xmy_bug(extract_dir)
  81. replaceRoseResource(extract_dir)
  82. # 冰狐渠道id 521
  83. # 遥望渠道id 412
  84. # 齐齐乐渠道id 234
  85. # 小绵羊渠道id 549
  86. # 233渠道id 535
  87. # 天天玩渠道id 558
  88. # 坚果id 413
  89. # 小七手游id 389
  90. # 游戏fan id 380
  91. # 零玩 id 579
  92. if channel_sdk_info['SDKName'] == '2lyx' or channel_sdk_info['SDKName'] == 'lcsygame':
  93. change_targetSdkVersion(extract_dir)
  94. def change_targetSdkVersion(dir_path):
  95. yml_file = os.path.join(dir_path,'apktool.yml')
  96. if not os.path.exists(yml_file):
  97. logging.info(yml_file+'is not exist')
  98. return
  99. with open(yml_file,'r') as f:
  100. yaml.add_constructor(u'tag:yaml.org,2002:brut.androlib.meta.MetaInfo', meta_constructor)
  101. d = yaml.load(f)
  102. print d
  103. sdkInfo = d.get('sdkInfo',{})
  104. sdkInfo.update({'targetSdkVersion':'22'})
  105. print d
  106. with open(yml_file,'w') as fl:
  107. fl.write(yaml.dump(d))
  108. if __name__ == '__main__':
  109. change_targetSdkVersion('C:\\Users\\Administrator\\Desktop\\xmy')