Android和iOS包批量重签名
本文实例为大家分享了Android和iOS包批量重签名的具体代码,供大家参考,具体内容如下
Android篇
环境要求
1安装winrar,然后配置winrar的环境变量,要用到winrar指令
2配置java的bin目录到环境变量,要用到jarsigner指令
重签名步骤说明:
1从母包复制一个子包
2删除子包的签名文件META-INFO
3根据需要修改子包的文件,比如渠道号文件之类
4重签名子包
对应的python脚本
importos
importsys
importshutil
importjson
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密码'
defcopy_apk(src_f,dst_f):
ifnotos.path.isfile(src_f):
print("%snotexist"%(src_f))
else:
fpath,fname=os.path.split(dst_f)
shutil.copyfile(src_f,dst_f)
print("copy%s->%s"%(src_f,dst_f))
defzip_del_file(apk_f,del_f):
os.system("winrard%s%s"%(apk_f,del_f))
print('zip_del_file:'+del_f)
defzip_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("winrara-ad%s%s"%(apk_f,"assets\\AppParamSetting.txt"))
defdel_file(f):
os.remove(f)
print('del_file:'+f)
defdel_dir(f_dir):
ifos.path.exists(f_dir):
shutil.rmtree(f_dir)
print("del_dir:"+f_dir)
defsign_app(unsigned_app,signed_app):
signcmd='jarsigner-verbose-keystore%s-keypass%s-storepass%s-signedjar%s-digestalgSHA1-sigalgMD5withRSA%ssfish'%(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")
forkeyinSIGNED_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篇
环境要求:
1mac机子
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
importos
importsys
importjson
ORIGINAL_IPA='母包.ipa'
SIGNED_APK={"\"子包1.ipa\"":1,"\"子包2.ipa\"":2,"\"子包3.ipa\"":3,"\"子包4.ipa\"":4}
CERT_FILE='证书文件'
MOBILE_PROVISION_UUID='mobileprovision的uuid'
defget_mobile_provision_dir():
returnos.path.join(os.getenv('HOME'),'Library/MobileDevice/ProvisioningProfiles/')
defget_mobile_provision_file(uuid):
returnos.path.join(get_mobile_provision_dir(),uuid+".mobileprovision")
defunzip_app():
os.system('unzip-qo./%s-d./'%(ORIGINAL_IPA))
print('unzip_app%sdone!'%(ORIGINAL_IPA))
defdel_code_signature():
os.system("rm-rf./Payload/sfish.app/_CodeSignature")
print('del_code_signaturedone!')
defresign_app():
os.system('/usr/bin/codesign--continue-f-s"%s"--entitlements"%s""%s"'%(CERT_FILE,'./entitlement.plist','./Payload/sfish.app'))
print('resign_appdone!')
defzip_app(f_ipa):
os.system('zip-r%s./Payload'%(f_ipa))
print('zip_appdone!')
defdel_payload():
os.system('rm-r./Payload')
defgen_entitlements(uuid,out_file_name):
os.system('securitycms-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))
defrep_emb_file(uuid):
os.system('cp"%s"./Payload/sfish/embedded.mobileprovision'%(get_mobile_provision_file(uuid)))
defupdate_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()
forkeyinSIGNED_APK.keys():
channel=SIGNED_APK[key]
update_channel_file(channel)
resign_app()
zip_app(key)
del_payload()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。