关于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程序是没人性的吗?老是不按我的意愿来运行! 小程:我怎么知道你的意愿就是有人性的? 本文解决一个问题:修改别人的二进制程序并运行起来. 让别人的程序按你的意愿来运行,文明一 ...
随机推荐
- stack 数据结构
栈定义 栈:后进先出(永远从栈顶取元素)LIFO last-in-first-out 栈实现 class Stack { constructor() { this.items = [] this. ...
- Oracle快速建表Sample
表定义: create table tb_triple( id number(8,0) primary key, name nvarchar2(20), birthday date ) 充值: ins ...
- 用了这个jupyter插件,我已经半个月没打开过excel了
1 简介 jupyter lab是我迄今为止体验过开展数据分析等任务最舒适的平台,但这不代表它是完美的,因为在很多方面它仍然存在欠缺,譬如在对csv文件的交互式编辑方面. 图1 而本文将要介绍的jup ...
- TomcatAJP文件包含漏洞
漏洞概述 2020年2月20日,国家信息安全漏洞共享平台(CNVD)发布关于Apache Tomcat的安全公告,Apache Tomcat文件包含漏洞(CNVD-2020-10487,对应CVE-2 ...
- visual studio项目多级引用不拷贝dll的问题
最近碰到一个visual studio项目多级引用不拷贝dll的问题,花了很久查了很多资料,特此记录 A项目引用B项目, B项目引用C项目,C项目引用ef及oracle.ef using Oracle ...
- C#类库推荐 拼多多.Net SDK,开源免费!
背景介绍 近两年拼多多的发展非常迅速,即便口碑一般,也没有网页端,奈何我们已经全面小康,6亿月收入1000以下,9亿月收入2000以下,所以因为价格原因使用拼多多的用户也越来越多了.同样的,拼多多也开 ...
- Webservice报错客户端发现响应内容类型为“application/json;charset=UTF-8”,但应为“text/xml”。
控制台对接Webservice正常,同样的方法在Web项目上报错: 客户端发现响应内容类型为“application/json;charset=UTF-8”,但应为“text/xml”.请求失败,错误 ...
- Spring Boot项目集成flyway
一.为什么要使用flyway Flyway的定位:数据库的版本控制. 用一种简单.干净的方案,帮助用户完成数据库迁移的工作.使用Flyway,用户可以从任意一个数据库版本迁移到最新版本,简单而且有 ...
- JWT理论理解
什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的 ...
- golang map学习
当对map只声明时,由于map为引用类型,所以默认值为nil,但对nil map 而言,支持read ,但不支持write 当执行write操作时, 会抛出panic异常; 代码如下: func Te ...