关于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程序是没人性的吗?老是不按我的意愿来运行! 小程:我怎么知道你的意愿就是有人性的? 本文解决一个问题:修改别人的二进制程序并运行起来. 让别人的程序按你的意愿来运行,文明一 ...
随机推荐
- JavaScript(es6)数组常用的方法
常用方法 1.forEach() var data = [1,2,3,4,5]; var sum = 0;//求和 data.forEach((item)=>{sum+=item}) //给原数 ...
- 用Java爬虫爬取凤凰财经提供的沪深A股所有股票代号名称
要爬取的凤凰财经网址:http://app.finance.ifeng.com/list/stock.php?t=hs 本作主要采用的技术是jsoup,相关介绍网页:https://www.jians ...
- Python中的type(),isinstance,()dir(),的区别
1.type() type(),获取一个变量的类型,返回值为:<class '类名'>,属于class类型2.isinstance() isinstance(),判断一个对象是否属于某种数 ...
- oracle之分组函数
分组函数 5.1 最重要的五个分组函数 sum(); avg(); count(); max(); min(). 数值类型可以使用所有组函数SQL> select sum(sal) sum, a ...
- python中unittest查找测试用例
将整个BeautifulReport文件夹放到site-packages目录下
- python守护线程t.setDaemon(True)
守护线程是守护主线程 t.setDaemon(True),调用函数里面存在等待时间时,只要设置了守护线程,函数中等待时间下面的代码都不会再执行
- Unit4:碎片
基本使用 动态调用 碎片和活动 碎片周期
- 归并排序求逆序对(poj 2299)
归并排序求逆序对 题目大意 给你多个序列,让你求出每个序列中逆序对的数量. 输入:每组数据以一个数 n 开头,以下n行,每行一个数字,代表这个序列: 输出:对于输出对应该组数据的逆序对的数量: 顺便在 ...
- Django中间件之SessionMiddleware源码分析
settings.py文件中 MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', ] # from djang ...
- C# 中居然也有切片语法糖,太厉害了
一:背景 1. 讲故事 昨天在 github 上准备找找 C# 9 又有哪些新语法糖可以试用,不觉在一个文档上看到一个很奇怪的写法: foreach (var item in myArray[0..5 ...