前言:开发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值:

  1.  
    <key>CFBundleDisplayName</key> //APP名称
  2.  
     
  3.  
    <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的技术探讨和实践演示的更多相关文章

  1. iOS包重签名工具,ipa文件重签名,快速签名,SignTool签名工具,好用的签名工具,App重签名

    新工具 ProjectTool 已上线 这是一款快速写白包工具,秒级别写H5游戏壳包,可视化操作,极易使用,支持Swift.Objecive-C双语言 QQ交流群:811715780 进入 Proje ...

  2. iOS逆向(五)-ipa包重签名

    为什么要重签名? 1.在没有源代码的情况下,你已经对某个应用进行了资源修改(比如修改了启动图或图标等).修改完成以后,如果想要让APP可以正常使用,该APP一定要重新签名然后压缩成IPA文件. 2.如 ...

  3. iOS ipa包重签名

    背景:公司做游戏SDK的,提供SDK给第三方后,他们打包过来我们需要分发在不同的渠道,这个时候需要修改SDK的配置文件,ipa文件修改后是需要手机越狱或者ipa重签名才能安装成功的,所以研究了一下重签 ...

  4. Android自动化测试 - Robotium之re-sign.jar重签名后安装失败提示Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]解决方案

    问题:在用re-sign.jar重签名apk文件后,显示重签名成功,但在实际安装过程中确提示:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] 原因:网上查 ...

  5. xcode archive导出ipa时重签名

    折腾了一晚上用另外的签名从xcode archive导出ipa,最后发现居然是没有导入p12文件的原因.... 顺便把参考的帖子记录一下: http://stackoverflow.com/quest ...

  6. ipa重签名

    为什么要研究重签名问题?将程序打包成ipa包后,ipa包中会包含Provisioning Profile和_CodeSignature等文件,里面包含了对整个ipa的签名信息. 一旦改动ipa中的不论 ...

  7. ipa重签名最直接的教程

    ipa 包重签名最新最简单教程 重签名的意义:ipa 重签名最大的用处是,不必重新打包,和配置其它第三方获取 appkey 等操作,直接重签名之后依然可以拥有这些功能,更快的发布测试或者灰度版本. 本 ...

  8. 用re-sign.jar重签名apk后安装失败的解决办法

    问题 打开re-sign.jar,将下载好的apk拖入re-sign.jar的界面进行重签名.重签名成功后,通过adb intall命令安装重签名后的apk文件失败.提示:Failure [INSTA ...

  9. iOS逆向开发(0):修改二进制代码与重签名 | hopper | codesigh

    小白:小程,你知道有些iOS程序是没人性的吗?老是不按我的意愿来运行! 小程:我怎么知道你的意愿就是有人性的? 本文解决一个问题:修改别人的二进制程序并运行起来. 让别人的程序按你的意愿来运行,文明一 ...

随机推荐

  1. 分数运算(gcd)

    时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 计算机中采用浮点数表示所有实数,但这意味着精度丢失.例如无法精确 ...

  2. Vue-router的用法与使用步骤

    Vue-router的使用步骤: Vue Router的使用步骤还是比较清晰的,按照步骤一步一步就能完成路由操作 A.导入js文件 B.添加路由链接 C.添加路由占位符(最后路由展示的组件就会在占位符 ...

  3. [LeetCode题解]79. 单词搜索

    题目描述 题目:79. 单词搜索 解题思路 遍历 首先找重复性,题目说给定单词是否存在于二维数组中,可以简化为从 (x, y) 走 n 步(n 表示单词长度),查看给定单词是否存在.然后再遍历二维数组 ...

  4. IIS上传文件最大限制问题

    IIS服务器文件最大限制默认是30M. 自定义方法:修改配置文件,路径是:C:\Windows\System32\inetsrv\Config\applicationHost.config 在requ ...

  5. java-数组的排序

    package day02; public class SelectSort { public static void selectSort(int[] arr){ for(int x=0;x< ...

  6. 兼容H5页面的js

    (function (doc, win) { let docEl = doc.documentElement; let resizeEvt = 'orientationchange' in windo ...

  7. leetcode刷题-67二进制求和

    题目 给你两个二进制字符串,返回它们的和(用二进制表示). 输入为 非空 字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" ...

  8. Java 8 Stream API实例

    一.开篇 Stream?其实就是处理集合的一种形式,称之为流,在Java8中被引入,可被Collection中的子类调用. 作用?简化代码,提升你的开发效率. 不会?看完这篇你就能自己上手了! 二.实 ...

  9. 【小程序】---- 使用 Echarts 的方式

    1.下载 GitHub 上的 ecomfe/echarts-for-weixin 项目,Echarts微信版. 地址:https://github.com/ecomfe/echarts-for-wei ...

  10. day52:django:ORM单表/多表操作

    目录 1.ORM 2.ORM单表增删改查 13个必知必会的查询接口 filter基于双下划线的模糊查询 3.ORM多表增删改查 ORM 什么是ORM? ORM(object relational ma ...