Android和iOS包中如何实现批量重签名
创始人
2024-12-17 12:42:34
0次

Android篇

环境要求

1 安装winrar,然后配置winrar的环境变量,要用到winrar指令

2 配置java的bin目录到环境变量,要用到jarsigner指令

重签名步骤说明:

1 从母包复制一个子包

2 删除子包的签名文件META-INFO

3 根据需要修改子包的文件,比如渠道号文件之类

4 重签名子包 

对应的python脚本

import os
import sys
import shutil
import json
 
ORIGINAL_APK='母包.apk'
UNSIGN_APK='unsign.apk'
SIGNED_APK={"\"子包1.apk\"":1,"\"子包2.apk\"":2,"\"子包3.apk\"":3,"\"子包4.apk\"":4}
 
KEY_STORE='keystore文件.keystore'
KEY_PASS='key密码'
STORE_PASS='store密码'
 
def copy_apk(src_f,dst_f):
 if not os.path.isfile(src_f):
 print("%s not exist"%(src_f))
 else:
 fpath,fname=os.path.split(dst_f)
 shutil.copyfile(src_f,dst_f)
 print("copy %s -> %s"%(src_f,dst_f))
 
 
def zip_del_file(apk_f,del_f):
 os.system("winrar d %s %s"%(apk_f,del_f))
 print('zip_del_file:'+del_f)
 
def zip_add_file(apk_f,channel):
 del_dir("assets")
 os.makedirs("assets")
 f=open("assets\\AppParamSetting.txt",'w')
 f.write('{"channel":%s,"bundleIdentifier":""}'%(channel))
 f.close()
 os.system("winrar a -ad %s %s"%(apk_f,"assets\\AppParamSetting.txt"))
 
def del_file(f):
 os.remove(f)
 print('del_file:'+f)
 
def del_dir(f_dir):
 if os.path.exists(f_dir):
 shutil.rmtree(f_dir)
 print("del_dir:"+f_dir)
 
def sign_app(unsigned_app, signed_app):
 signcmd='jarsigner -verbose -keystore %s -keypass %s -storepass %s -signedjar %s -digestalg SHA1 -sigalg MD5withRSA %s sfish' % (KEY_STORE,KEY_PASS,STORE_PASS,signed_app,unsigned_app)
 os.system(signcmd)
 print(signcmd)
 
if __name__ == '__main__':
 cur_dir=os.getcwd()
 print('cur_dir'+cur_dir)
 copy_apk(ORIGINAL_APK,"tmp_"+ORIGINAL_APK)
 zip_del_file("tmp_"+ORIGINAL_APK,"META-INF")
 for key in SIGNED_APK.keys():
 channel=SIGNED_APK[key]
 zip_add_file("tmp_"+ORIGINAL_APK,channel)
 sign_app("tmp_"+ORIGINAL_APK,key)
 del_dir("assets")
 del_file("tmp_"+ORIGINAL_APK)
 input("Done")

iOS篇

环境要求:

1 mac机子

2 证书文件,打开:Launchapd(火箭图标)->其他 -> 钥匙串访问,就在那里

3 .mobileprovision文件

重签名步骤说明:

1 从.mobileprovision文件生成entitlements.plist文件

2 解压ipa,会得到一个Payload目录,再往里是一个xxx.app,显示包内容可以看到里面的东西

3 删除签名文件,即:Payload/xxx.app/_CodeSignature目录

4 根据需要修改文件,比如渠道文件

5 重签名

6 压缩ipa

对应的python脚本

#!/usr/bin/python
 
import os
import sys
import json
 
ORIGINAL_IPA='母包.ipa'
SIGNED_APK={"\"子包1.ipa\"":1,"\"子包2.ipa\"":2,"\"子包3.ipa\"":3,"\"子包4.ipa\"":4}
CERT_FILE='证书文件'
MOBILE_PROVISION_UUID = 'mobileprovision的uuid'
 
def get_mobile_provision_dir():
 return os.path.join(os.getenv('HOME'),'Library/MobileDevice/Provisioning Profiles/')
 
def get_mobile_provision_file(uuid):
 return os.path.join(get_mobile_provision_dir(), uuid + ".mobileprovision")
 
def unzip_app():
 os.system('unzip -qo ./%s -d ./'%(ORIGINAL_IPA))
 print('unzip_app %s done!'%(ORIGINAL_IPA)) 
 
def del_code_signature():
 os.system("rm -rf ./Payload/sfish.app/_CodeSignature")
 print('del_code_signature done!')
 
def resign_app():
 os.system('/usr/bin/codesign --continue -f -s "%s" --entitlements "%s" "%s"'%(CERT_FILE,'./entitlement.plist','./Payload/sfish.app'))
 print('resign_app done!')
 
def zip_app(f_ipa):
 os.system('zip -r %s ./Payload'%(f_ipa))
 print('zip_app done!')
 
def del_payload():
 os.system('rm -r ./Payload')
 
def gen_entitlements(uuid, out_file_name):
 os.system('security cms -D -i "%s" > entitlement_full.plist '%(get_mobile_provision_file(uuid) ))
 os.system('/usr/libexec/PlistBuddy -x -c \'Print:Entitlements\' entitlement_full.plist > "%s" '%( out_file_name))
 
def rep_emb_file(uuid):
 os.system('cp "%s" ./Payload/sfish/embedded.mobileprovision' % (get_mobile_provision_file(uuid)))
 
def update_channel_file(channel):
 f_channel='./Payload/xxx.app/Data/Raw/channel.txt'
 fr=open(f_channel,'r')
 txt=fr.read()
 fr.close()
 js=json.loads(txt)
 js['channel_id']=channel
 fw=open(f_channel,'w')
 fw.write(json.dumps(js))
 fw.close()
 
if __name__ == '__main__':
 gen_entitlements( MOBILE_PROVISION_UUID, "entitlement.plist" )
 unzip_app()
 del_code_signature()
 for key in SIGNED_APK.keys():
  channel=SIGNED_APK[key]
  update_channel_file(channel)
  resign_app()
  zip_app(key)
 del_payload()

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...