关于IPA文件重签名后如何跟踪管理APP的技术探讨和实践演示
前言:开发iOS的朋友都知道,在功能开发完成后,我们就会用申请的苹果账号在后台做证书配置,然后提交到AppStore,但是也有部分APP我们不需要提交到AppStore,比如内部测试用的APP、定制给客户开发的功能性APP、还有其他一些不适合提交到AppStore的APP,那么这时候我们就仅需要针对特定的人群或部分手机设备来安装,最简单方式就是把需要安装的设备UDID作为测试机在配置文件中添加,最多可添加100台设备,另外一种方案就是采用企业证书重新打包,这样就不限制设备数量,相对来说简单,此外还有一种情况就是我们对开发完成的ipa文件做重签名处理,这种情况通常是没有源码的情况,不能用xcode打包签名,那么问题来了,如果对这些签名打包后的ipa文件,也就是如何对这些APP做后期跟踪管理呢?
管理APP常用到的几个场景:
场景一:某几个客户测试安装后,在特定时间到了就不允许在打开使用,比如打开APP后立马闪退或弹窗提醒时间到,点击确定后闪退,如果想延长,可修改到期时间,就能继续使用。
场景二:APP因某些原因,暂停对客户的继续使用,即关闭APP的使用权限,打开后立马闪退,一旦修复后开启APP的使用权限,客户照旧正常使用。
场景三:源码丢失无法打包新APP,但需要给APP新增一些小功能,比如添加统计等,这时候就需要注入动态库,之后重签名ipa,这时候依然需要对APP做管理。
场景三:客户对我们重签名后的APP使用到期后,没有不再续费,但是客户依然能使用,我们又对证书没有管理权限,无法撤销,这就导致了客户付款一个月,但是实际上却一直可以使用,对此也无能为力,这时候就需要对APP做管理,如时间锁或开关功能,特别是企业重签名的,对证书的影响最大,有可能导致证书被封的危险。
场景四:对于APP的多开支持,比如重签名时候我们可以修改名称或自定义Bundle ID,以此来实现同设备安装多个APP的需要,便于测试或其它作用。
其他场景:暂未知...
针对这些常见场景,笔者做了统计和调查,发现市面上能解决的几乎寥寥无几,特别一些能实现时间锁的都要提交证书和密码,这对于签名来说太危险,一旦提交后,有可能P12证书和密码泄露,导致证书被共享最终被封,目前据笔者所知,企业账号一号难求,价格也在几十万,被封是非常可惜的,故此基本无人敢使用这类软件做管理,比如xx开心、一键xx工具等,如下图,太危险了。


对于场景中提到的几个关键词,比如时间锁、开关、注入动态库和修改APP名称和ID,从开发专业角度来分析如何技术实现:
时间锁:顾名思义就是设定时间,一到时间到就锁住,不允许再使用,从开发角度来说,我们就是设定了未来时间,当APP运行到这个时间点,判断当前时间大于预定时间即开启锁功能,弹窗提醒或直接exit(0)闪退。
开关:与时间锁类似,但是更直接,可立即关闭或禁用,这种需要服务器支持,和时间锁不同,时间锁可以实现离线模式,不过这种一旦到期就不能再继续使用,如果和开关一样采取服务器模式就可以再次延长时间,那么这种就需要调用服务器接口,对于开发来说不难。
注入动态库:这需要开发独立的动态库文件,动态库是应用启动后就立即加载,我们可以在加载时候调用load方法里面执行我们需要的统计等功能,注入方式也还是简单,采用yololib,下载地址:https://github.com/KJCracks/yololib 或optool 下载地址:https://github.com/alexzielenski/optool来注入,例如:
yololib FileName Frameworks/Dylib.dylib
或
optool install -c load -p "@executable_path/Frameworks/libSignatureCheck.dylib" -t xxx
就可以注入到ipa文件中,通过MacOView这款工具来查看Mach-O文件是否注入成功,如果不喜欢命令行的可以通过工具来注入,推荐用iReSignDylib这款mac软件来操作,下载地址: https://github.com/mapboo/iReSignDylib,界面如下:

从这款软件来看,界面操作还是很清楚的,拖入动态库文件.dylib就可以了。
修改APP名称和ID:了解APP开发的朋友都知道,名称和ID可以直接在info.plist文件中修改,那么我们通过修改info文件里面对应的key值:
- <key>CFBundleDisplayName</key> //APP名称
- <key>CFBundleIdentifier</key> //APP的BundleID
然后重新覆盖这个info文件,得此达到修改的目的,特别注意的是一旦修改过ipa文件里面的任何地方,都会破坏原有签名,必须重新用苹果证书签名,这点和Android的重签名是一样的,比如我们用apktool工具反编译apk后再回编译,那么这时候就必须要重新签名才能安装到手机上,iOS也是一样。
这几个关键技术点,对于正常开发内嵌原生代码来说,都是非常容易实现的,如果是外面嵌入来管理呢,那就不是技术能解决的问题了,简单的一个案例:手头只有ipa文件,需要实现时间锁、开关等功能,那就只能通过重签名来管理了。笔者在考察众多技术和实践测试方案后,确实找到了一款满足常见场景功能的Mac软件,即风车签名iOS管理软件,官网地址:风车签名。
软件简介:这是一款在Mac平台下安全可控的iOS签名管理软件,旨在对签名后的APP能够完全控制,包括APP的开启或禁用、设置到期时间锁、注入第三方动态库文件、设置安装限量、修改APP名称和自定义Bundle ID等刚需功能,同时支持个人、公司和企业证书签名,最重要的是软件在签名时无需填写证书密码,一切操作均在本地Mac电脑中,确保证书安全。
针对软件功能笔者做了一系列的实践验证,风车签名软件操作界面非常清晰明了,如下图:

特别该软件签名证书不再需要密码,这个是必须点赞的,安全第一啊,另外设置时间锁、修改名称ID、注入动态库,以及打印日志信息都非常明了,特别时间锁默认三个月也可以自定义到期时间,很nice了,故此笔者做个签名测试,设置时间锁功能,首先在设置里面输入:

然后我找了个ipa来签名试一试,笔者是用的个人证书,手机UDID已经添加进去了,如果你是企业证书,那就不需要了,签名后我用iFunbox直接安装,打开APP看看是否弹出提醒时间,测试效果如下:

其它该软件的功能,如开关、注入动态库,以及修改APP名称等功能笔者都做了测试,效果不错,杠杠的,我就不这里截图了,总之是一款非常安全可控的iOS签名管理软件,值得推荐,更多功能,大家可以去风车签名官网一探究竟啦。
关于IPA文件重签名后如何跟踪管理APP的技术探讨和实践演示的更多相关文章
- iOS包重签名工具,ipa文件重签名,快速签名,SignTool签名工具,好用的签名工具,App重签名
新工具 ProjectTool 已上线 这是一款快速写白包工具,秒级别写H5游戏壳包,可视化操作,极易使用,支持Swift.Objecive-C双语言 QQ交流群:811715780 进入 Proje ...
- iOS逆向(五)-ipa包重签名
为什么要重签名? 1.在没有源代码的情况下,你已经对某个应用进行了资源修改(比如修改了启动图或图标等).修改完成以后,如果想要让APP可以正常使用,该APP一定要重新签名然后压缩成IPA文件. 2.如 ...
- iOS ipa包重签名
背景:公司做游戏SDK的,提供SDK给第三方后,他们打包过来我们需要分发在不同的渠道,这个时候需要修改SDK的配置文件,ipa文件修改后是需要手机越狱或者ipa重签名才能安装成功的,所以研究了一下重签 ...
- Android自动化测试 - Robotium之re-sign.jar重签名后安装失败提示Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]解决方案
问题:在用re-sign.jar重签名apk文件后,显示重签名成功,但在实际安装过程中确提示:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] 原因:网上查 ...
- xcode archive导出ipa时重签名
折腾了一晚上用另外的签名从xcode archive导出ipa,最后发现居然是没有导入p12文件的原因.... 顺便把参考的帖子记录一下: http://stackoverflow.com/quest ...
- ipa重签名
为什么要研究重签名问题?将程序打包成ipa包后,ipa包中会包含Provisioning Profile和_CodeSignature等文件,里面包含了对整个ipa的签名信息. 一旦改动ipa中的不论 ...
- ipa重签名最直接的教程
ipa 包重签名最新最简单教程 重签名的意义:ipa 重签名最大的用处是,不必重新打包,和配置其它第三方获取 appkey 等操作,直接重签名之后依然可以拥有这些功能,更快的发布测试或者灰度版本. 本 ...
- 用re-sign.jar重签名apk后安装失败的解决办法
问题 打开re-sign.jar,将下载好的apk拖入re-sign.jar的界面进行重签名.重签名成功后,通过adb intall命令安装重签名后的apk文件失败.提示:Failure [INSTA ...
- iOS逆向开发(0):修改二进制代码与重签名 | hopper | codesigh
小白:小程,你知道有些iOS程序是没人性的吗?老是不按我的意愿来运行! 小程:我怎么知道你的意愿就是有人性的? 本文解决一个问题:修改别人的二进制程序并运行起来. 让别人的程序按你的意愿来运行,文明一 ...
随机推荐
- Codeforces 1321E World of Darkraft: Battle for Azathoth
题意 有\(n\)个武器,第\(i\)个武器攻击力为\(a_i\),价值\(ca_i\). 有\(m\)个防具,第\(i\)个防具防御力为\(b_i\),价值\(cb_i\). 有\(p\)个怪,第\ ...
- Matlab摄像头视频基本处理
一.读取摄像头 1.首先保证摄像头及其驱动正确在电脑上安装 2.简单的代码显示驱动摄像头,并显示: vid = videoinput('winvideo',1); preview(vid); 3.默认 ...
- [BUUOJ记录] [GXYCTF2019]BabySQli
有点脑洞的题,题目不难,主要考察注入和联合查询的一个小特点 进入题目是一个登录框,看看源代码,在search.php文件中发现了这个 大写的字母和数字很明显是base32,先用base32解码一下,发 ...
- JVM学习第三天(JVM的执行子系统)之类加载机制补充
昨晚没看完,今天继续 系统的类加载器 对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间.这句话可以表达得更通俗一些: ...
- pycharm可以运行但无法debug的解决方法
错误信息:pydev debugger: process 4588 is connecting 如果您尝试了网上的很多方法如防火墙设置,去掉 ".idea"文件,甚至重装pycha ...
- HKDAS产品技术架构图
- 编写高效优雅Java程序
面向对象 01.构造器参数太多怎么办? 如果参数很多,会导致构造方法非常多,拓展性差,代码难编写,且难以看懂. 用JavaBeans模式, get和set 一行构造编程多行代码实现,需要使用额外机制确 ...
- java集合类源码学习三——ArrayList
ArrayList无疑是java集合类中的一个巨头,而且或许是使用最多的集合类.ArrayList继承自AbstractList抽象类,实现了List<E>, RandomAccess, ...
- HTML -- 表单元素2
(1)<select>元素(下拉列表) <html> <body> <!-- 表单处理程序在action属性中指定 --> <form actio ...
- 解决spark streaming集成kafka时只能读topic的其中一个分区数据的问题
1. 问题描述 我创建了一个名称为myTest的topic,该topic有三个分区,在我的应用中spark streaming以direct方式连接kakfa,但是发现只能消费一个分区的数据,多次更换 ...