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

一旦改动ipa中的不论什么内容,比如添加一个头文件,签名就会失效,导致ipa无法安装。(貌似改变Info.plist是不影响的)
因此,假设要通过改动ipa包中的内容来篡改信息或注入代码(比如加一个动态库进去)的话。就须要解决ipa包的重签名问题。

准备
在重签名之前要做一些准备工作。

1.首先要下载并安装Xcode,里面有个codesign_allocate程序,在安装时/usr/bin中会多一个codesign的程序,该程序用于ipa包的签名。

2.企业证书的Certificate文件,私钥文件,Provisioning Profile文件等。注意企业证书一定要是iOS Distribution的类型,不能是iOS Development。

其他具体设置。如In-House等參见http://beyondvincent.com/blog/2014/07/30/provision-ios-ipa-app-for-in-house-enterprise-distribution/

重签名步骤
1.解压ipa
解压ipa得到Payload/[App name].bundle。打开bundle。

2.删除旧的ipa签名信息
删除bundle中的_CodeSignature文件夹。也就是删除之前ipa的签名信息。

3.更换证书
将bundle中旧的Provisioning Profile删除。用我们自己的企业证书的Provisioning Profile替代。

注意,要将ipa包中我们的企业证书改名为embedded.mobileprovision。

4.改动bundle内容
此时我们能够尽情地改动bundle中的内容。比如加入一个动态库。删除一张图片等。

注意:假设要往bundle中加入动态库,必须要先将其压缩成zip文件,在程序启动时将其解压到Documents文件夹下再dlopen。否则程序在启动时载入动态库文件会卡死在那里。

5.又一次签名
在完毕bundle内容的改动后。须要通过/usr/bin/codesign程序又一次签名。命令例如以下:

/usr/bin/codesign -f -s "iPhone Distribution: YourCompanyName" --resource-rules Payload/ MYAPP.app/ResourceRules.plist Payload/ MYAPP.app

当中iPhone Distribution能够从钥匙串訪问中获取,就是企业证书的名字,比如以下的"iPhone Distribution:XXXXXXXXXX":

具体的命令演示样例:

codesign -f -s "iPhone Developer: XXXXXXXXXX" --resource-rules Payload/NdCP_Game_Demo.app/ResourceRules.plist Payload/NdCP_Game_Demo.app

这条命令的意思是:使用keychain中"iPhone Developer: XXXXXXXXXX"标识的证书。依据Payload/NdCP_Game_Demo.app/ResourceRules.plist文件里的规则进行签名,假设ipa包中已经存在签名,那么将被替换,该过程生成的_CodeSignature文件夹将存放在Payload/NdCP_Game_Demo.app文件夹下。

在命令运行后,在bundle中会生成一个新的_CodeSignature文件夹,里面包含了新的签名信息。

6.又一次打包成ipa
在完毕上述工作后。能够生成新的ipa进行公布。演示样例命令例如以下:

zip -r ResignTest.ipa Payload
# 注意Payload后面不能有“/”

7.公布

经过打包公布測试。得出结论:对改动了ipa包内容和当中的签名后,重签名的ipa文件能够在非越狱设备和越狱设备上安装成功。注意,是通过带有SSL证书的站点和Apple系统安装的(企业内部分发程序)。不是通过PP助手那样的第三方工具安装的。


參考资料

http://www.cocoachina.com/bbs/simple/?t181236.html

http://www.169it.com/article/15588355475122308384.html

附录
1.codesign

在帮助文档中:

codesign -- Create and manipulate code signatures

codesign的选项:

-f, --force     When signing, causes codesign to replace any existing signature on the path(s) given. Without this option, existing signatures will not be replaced, and the signing operation fails.

-s, --sign identity     Sign the code at the path(s) given using this identity. See SIGNING IDENTITIES below.

--resource-rules filename   During signing, this option overrides the default rules for identifying and collecting bundle resources and nested code to be sealed into the signature. The argument is the path to a property list (plist) file containing scanning and qualification instructions. See the code signing documentation for details.

其用法例如以下:

Usage: codesign -s identity [-fv*] [-o flags] [-r reqs] [-i ident] path ... # sign
codesign -v [-v*] [-R testreq] path|[+]pid ... # verify
codesign -d [options] path ... # display contents
codesign -h pid ... # display hosting paths

注意:CocoaChina论坛中当中一个帖子说重签名后,会影响到keychain的使用,这一步有待验证,后面会补充说明。

ipa重签名的更多相关文章

  1. iOS ipa 重签名 resign

    这篇关于codesign的文章不错 https://www.objccn.io/issue-17-2/ 英文原文:https://www.objc.io/issues/17-security/insi ...

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

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

  3. iOS逆向必备绝技之ipa重签名

    一.重签名准备工作: 找到开发者证书和配置文件: 列出所有开发者证书文件: security find-identity -p codesigning -v 找一个开发环境配置文件生成entitlem ...

  4. iOS ipa包重签名

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

  5. ios app 开发中ipa重新签名步骤介绍-备

    作为一个app应用程序开发者,在app应用程序在苹果商店上架前总需要将安装包安装到ios机器上进行测试,这个时候我们就需要打包in house版本的ipa了,打包in house实际上是一个将ipa应 ...

  6. ipa 重签

    IPA 重签名 时间 2014-03-03 10:28:36  txx's blog原文  http://blog.rpplusplus.me/blog/2014/03/03/ipa-re-codes ...

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

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

  8. 关于IPA文件重签名后如何跟踪管理APP的技术探讨和实践演示

    前言:开发iOS的朋友都知道,在功能开发完成后,我们就会用申请的苹果账号在后台做证书配置,然后提交到AppStore,但是也有部分APP我们不需要提交到AppStore,比如内部测试用的APP.定制给 ...

  9. IPA的动态库注入+企业重签名过程

    [摘录]之前在进行iOS测试过程中由于要获取一定数据信息,因此需要对原本的安装包进行代码注入并且重新打包安装,因此就需要使用重签名策略,在此进行分享,希望大家可以使用其中的方法来运用到自身的项目中. ...

随机推荐

  1. 文档工具GitBook使用

    一.登陆注册 地址:https://www.gitbook.com/ 1.gitbook可使用github账号登录,如果已经注册github可以直接使用github账号登录 2.如果是github账号 ...

  2. ThreadPoolExecutor 源码阅读

    目录 ThreadPoolExecutor 源码阅读 Executor 框架 Executor ExecutorService AbstractExecutorService 构造器 状态 Worke ...

  3. 进程间通信(IPC)

    1.什么是进程间通信 通俗来讲,进程间通信就是:多个进程之间的数据交互 进程都有自己独立的虚拟地址空间,导致进程之间的数据交互变得十分困难,通信复杂了,但是安全性提高了: 进程间通信的本质:多个进程之 ...

  4. OSINT系列:网站信任评估WOT

     OSINT系列:网站信任评估WOT Web of Trust(WOT)是芬兰的一家网站信任评估服务公司.它通过收集用户对网站的评价,来评估网站的可信任度.在该公司网站www.mywot.com,用户 ...

  5. 常见的CSS Hack

    原文地址: 小昱博客 - 常见的CSS Hack 转载请注明出处,谢谢! 什么是CSS hack 由于不同厂商的流览器或某浏览器的不同版本(如IE6-IE11,Firefox/Safari/Opera ...

  6. Java并发程序设计(三) Java内存模型和线程安全

    Java内存模型和线程安全 一 .原子性 原子性是指一个操作是不可中断的.即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰. 思考:i++是原子操作吗?  二.有序性 Java代 ...

  7. 潭州课堂25班:Ph201805201 第十二课 new方法,定制属性访问,描述符与装饰器 (课堂笔记)

    1,new方法: 类每次实例化时都会创建一个新的对象, class Textcls: # cls 是指类本身, def __new__(cls, *args, **kwargs): # 在 __ini ...

  8. [JSOI2004]平衡点/[BZOJ3680]吊打XXX

    [JSOI2004]平衡点/[BZOJ3680]吊打XXX 题目大意: 有\(n(n\le10000)\)个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.假设绳子 ...

  9. W3School 学习笔记

    网站构建初级教程 1.每个网站开发人员都有必要了解以下几方面的知识: 万维网如何工作 HTML 语言 如何使用层叠样式表 (CSS) JavaScript 编程 XML 标准 服务器脚本技术 使用 S ...

  10. oracle字符串载取及判断是否包含指定字符串

    oracle 截取字符(substr),检索字符位置(instr) case when then else end语句使用 收藏 常用函数:substr和instr1.SUBSTR(string,st ...