iOS 逆向13 -- 签名机制

对称加密

  • 在对称加密中,加密与解密使用的同一个密钥
  • 常见的对称加密算法有:
    • DES:将64位明文加密称64位密文的对称加密算法,密钥的长度为56位;
    • 3DES:将DES重复三次所得到的一种加密算法;
    • AES:取代DES成为新标准的一种对称加密算法;

密钥传输问题

  • 在使用对称加密时,一定会遇到密钥传输的安全性问题;
  • 通信的双方必须要互通密钥,才能实现一方加密,另一方解密,完成完整的信息传输;

非对称加密

  • 密钥有两种,分别为:公钥和私钥,两者是一一对应的;
  • 消息的接收者生成一对密钥公钥用来加密私钥用来解密
  • 公钥可以传输,私钥由消息的接受者保管
  • 目前使用最广泛的非对称加密算法是RSA算法

混合密码系统

  • 对称加密,不能保证密钥传输的绝对安全,但速度很快;
  • 非对称加密,加密,解密的速度比较慢,但密钥传输安全;
  • 将两者结合在一起,就组成了混合密码系统,兼顾两者之间的优点,工作流程如下:
    • 消息的接收者生成一对密钥即公钥私钥
    • 消息的接收者将公钥传输给消息的发送者;
    • 消息的发送者会随机生成一个会话密钥,然后用消息的接收者的公钥进行加密,再传给消息的接收者;
    • 消息的接收者拿到加密后的会话密钥,利用自己的私钥进行解密,获取到会话密钥,会话密钥的传输使用的非对称加密
    • 之后两者之间的消息发送,使用会话密钥进行对称加密传输,提高效率;

单向散列函数

  • 单向散列函数,可以根据消息内容计算出散列值,任意长度的消息,计算出固定长度的散列值,消息不同,散列值也不同;
  • 散列值可以看成消息的唯一标识;
  • 单向散列函数,又称为消息摘要函数,哈希函数,输出的散列值,也被称为消息摘要,指纹;
  • 常见的单向散列函数:
    • MD4,MD5:生成128位的散列值,目前已经不安全了;
    • SHA-1:生成160位的散列值,目前已经不安全了;
    • SHA-2:包含SHA-256,SHA-384,SHA-512,散列值的长度分别为256位,384位,512位;
    • SHA-3:全新标准;

单向散列函数的应用

  • 防止数据被篡改;例如原始文件利用单向散列函数生成一个散列值,若文件数据被篡改,那么篡改后的文件生成的散列值与原始的散列值肯定不同;
  • 口令加密:登录,注册时密码使用单向散列函数生成密文,不能直接使用明文传输;

数字签名

  • 生成签名:由消息的发送者完成,通过签名密钥生成;
  • 验证签名:由消息的接收者完成,通过验证密钥验证;
  • 如何保证签名是消息的发送者自己签的,答案是:用消息发送者的私钥进行签名
  • 消息可能所占空间较大,可先生成对应的散列值,然后用私钥对消息的散列值进行签名;

数字签名的过程

  • 数字签名的作用不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改;
  • 其作用是识别消息是否被篡改
  • 数字签名的使用的一个重要前提是:用于验证签名的公钥必须属于真正的发送者
  • 其原理图如下所示:
Snip20210713_18.png

中间人攻击

  • 其原理图如下所示:
Snip20210713_19.png
  • 中间攻击者拦截了A的公钥,伪造了公钥;
  • AB两者之间的通信,完全感知不到中间攻击者的存在,很危险!!!

数字证书

  • 数字证书能验证公钥的合法性
  • 密码学中的证书,全称叫公钥证书,里面包含有姓名,邮箱等个人信息,以及此人的公钥;
  • 数字证书是由认证机构(CA)施加数字签名的,即CA用自己的私玥对某个人的个人信息和他的公钥进行签名,生成一个数字证书;
  • CA就是能够认定公钥确实属于某人,并能够生成数字签名的个人或者组织;

iOS签名机制

  • 其作用是保证安装到用户手机上的App都是经过Apple官方允许的,不管是真机调试,还是发布App,开发者都需要经过一系列复杂的步骤,如下:
  • 1.生成CertificateSigningRequest.certSigningRequest文件
  • 2.创建iOS_development.cer / iOS_distribution.cer证书文件
  • 3.注册device的UDID,添加App的唯一标识AppBundleID;
  • 4.创建xxx.mobleprovision描述文件
  • 只有完成上述的4步操作,真机才能安装上App进行调试;
iOS签名机制.png
  • Apple服务器充当CA认证机构,其保证Mac公钥的合法性;
  • 我们在进行App真机调试时,会进行一下步骤:
  • 首先访问钥匙串,导出CertificateSigningRequest.certSigningRequest文件,CertificateSigningRequest.certSigningRequest文件本质就是Mac的公钥;
Snip20210714_20.png
  • 然后在苹果的开发者网站上创建证书文件iOS_development.cer或者iOS_distribution.cer,需要上传CertificateSigningRequest.certSigningRequest文件,其本质是将Mac的公钥传给苹果的服务器,然后苹果的服务器利用自己的私钥,对Mac的公钥进行签名,最后生成证书文件;
  • 最后在苹果的开发者网站上创建mobleprovision描述文件,需要选中刚刚生成的证书文件,device的UDID以及App的唯一标识AppBundleID,其本质是将选中的数据全部传给苹果的服务器,然后苹果的服务器利用自己的私钥,进行签名,最后生成经过签名后的mobleprovision描述文件;

iOS重签名

  • 破解他人的App,然后注入自己写的代码,最后生成的ipa包是不能直接安装到非越狱真机设备的,因为你修改了App的原始代码,其签名发生了变化,苹果在验证App签名时,就会不通过;需要对其重新签名,才能安装到非越狱真机设备上;

codesign --> iOS重签名的具体步骤:

场景一:Xcode新建一个工程,并写入简单的代码,运行直接安装到非越狱真机设备上,然后找到其.app文件,本地创建一个Payload文件夹,将.app文件放入Payload文件夹中,然后压缩成.zip文件,最后将其后缀改成.ipa,即Payload.ipa文件;然后将Xcode运行安装的包从设备上删除,再将Payload.ipa安装到当前设备上,是可以安装的;

场景二:流程与场景一相同,不同点在于找到.app文件的Mach-O文件,利用MachOView打开并修改文件内容,最后生成Payload.ipa文件,再将Payload.ipa安装到当前设备(非越狱)上,是安装不上的,因为你修改了文件内容,那么其签名被破坏了,所以安装不上;不过越狱设备是可以安装的;

  • 第一步:准备一个embedded.mobileprovision描述文件(必须是付费证书产生的,appid,device一定要匹配),并放入app包中;
    • 可以去iOS开发者网站去创建然后下载;
    • 可以通过Xcode自动生成,然后在编译后的App包中找到,如下所示:
Snip20210714_25.png
  • 第二步:从embedded.mobileprovision描述文件中,提取出entitlements.plist权限文件,执行终端命令:
  • security cms -D -i embedded.mobileprovision > temp.plist 生成一个临时的plist文件;
  • /usr/libexec/PlistBuddy -x -c 'Print :Entitleements' temp.plist > entitlements.plist 得到entitlements.plist权限文件;
  • 第三步:查看可用的证书,获取证书ID,终端执行命令如下:
  • security find-identity -v -p codesigning
  • 第四步:对App包进行重新签名,终端执行命令如下:
  • codesign -fs 证书ID --entitlements entitlements.plist xxx.app

iOS重签名的GUI工具

第一种:iOS App Signer
第二种:iReSign

iOS重签名tweak的原理

  • 新建tweak项目,本质是创建一个与当前App相关的动态库;
  • 需要将新建的动态库文件与当前App的Mach-O文件,打包生成一个文件;
  • 可以使用insert.dylib库将动态库注入到Mach-O文件中,其地址为:https://github.com/Tyilo/insert.dylib
  • 命令行:insert dylib 动态库路径 目标Mach-O文件
  • 有两个常用的参数选项:
    • weak:即使动态库找不到也不会报错;
    • --all-yes:默认后面的所有选择都为yes;
  • insert dylib的本质是往Mach-O文件的Load Command中添加一个LC_LOAD_DYLIB或LC_LOAD_WEAK_DYLIB
  • 通过otool可查看Mach-O文件的动态库依赖信息,otool -L Mach-O文件
  • 当前创建的动态库可能会依赖其他的动态库,那么依赖的动态库也需要打包进来,否则会报错;
  • 通过Theos开发的动态库插件,
    • 默认都依赖于/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
    • 如果要将动态库插件打包到ipa中,也需要将CydiaSubstrate打包到ipa中,并且修改下CydiaSubstrate的加载地址;其命令行为:install name_tool -change 旧地址 新地址 Mach-O文件
  • 常见的两个环境变量:
    • @executable_path代表可执行文件所在的目录;
    • @loader_path代表动态库所在的目录;
  • tweak创建的动态库以及动态库所依赖的其他动态库也需要重签名,命令为:codesign -fs 证书ID 动态库名称
  • 最后再对.app文件进行重签名;签名的app必须脱壳,否则签名不成功;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容