玩逆向的目的 ?ios
- 为了应用安全 , 咱们首先要知道
Hackers
都是怎么作的 , 他们如何作到能够调试咱们的应用 . 在此基础上咱们才能知道如何更有效的进行防御.在逆向的路上 , 很重要的一步就是应用重签名 , 以此达到调试别人应用的目的.面试
想知道如何重签名 , 首先要知道
iOS
应用签名的原理 .算法
提示 :shell
本篇文章创建在对加密和签名有必定了解的基础上 . 如不太熟悉建议阅读前一篇博客 RSA加密原理&密码学&HASH 或者其余密码学以及签名文章.安全
废话很少说 , 开始.bash
为何用签名这个词 . 由于老外喜欢用支票 , 支票上面的签名可以证实这玩意是你的 . 那么数字签名顾名思义 , 就是用于鉴别数字信息的方法服务器
代码签名是对可执行文件或脚本进行数字签名 . 用来确认软件是被承认的 , 且在签名后未被修改或损坏的措施。和数字签名原理同样 , 只不过签名的数据是代码而已.微信
其具体验证措施以下 :app
发布者
将源代码散列后的 HASH
值使用私钥进行加密而后和源代码一块儿产生一个软件包 . 那么 验证端/使用端
收到后使用公钥解密拿到 HASH
, 并使用 HASH
算法对源代码进行散列 , 将获得的结果进行比对 , 若是一致 , 则说明数据没有被篡改过 , 而且确实是由发布者发布的应用 .ide
在 iOS 出来以前 , 之前的主流操做系统( Mac/Windows
) 软件随便从哪里下载都能运行 , 系统安全存在隐患 , 盗版软件 , 病毒入侵 , 静默安装等等 . 那么苹果但愿解决这样的问题,要保证每个安装到 iOS 上的 APP
都是通过苹果官方容许的,怎样保证呢 ? 就是经过代码签名。
那么首先怎么实现呢 ?
这样确实能够保证 , 可是咱们还有开发者 , 须要经过 Xcode
在开发阶段就能安装应用 , 另外还有企业证书 . 因此 实际上 , 苹果的签名机制是双层签名.
整个完整流程如上图 , 接下来咱们结合实际操做来剖析一下其原理 .
在咱们但愿安装开发好的程序到 iPhone
上时 , 咱们都知道须要去开发者中心配置一下证书 .
MAC
经过钥匙串访问生成请求 CSR
文件. 这一步骤其实就是 MAC
生成了一对 公私钥M , 将 公钥M
放到请求文件 CSR
中上传给苹果服务器 .
苹果服务器利用 私钥A 对 公钥M
进行数字签名 ( 其实就是对 公钥M
值进行非对称加密 , 而后保存了 公钥M
的 HASH
值) , 生成的结果就是 证书 .
而后用户继续添加设备 UDID
, 选择证书 , 配置所需权限 . 生成描述文件 .
当用户下载下来 / Xcode
自动管理把证书下载下来以后 , 钥匙串访问就会将证书和 MAC
中的 私钥M
( 就是咱们所熟知的 p12
) 进行关联 .
Xcode
在咱们选择好了描述文件和开发者帐户进行编译时 :
首先 , Xcode
会利用证书锁所关联的 私钥M
, 对 APP
进行代码签名 ( 将源文件的 HASH
值经过 私钥M
进行加密 ) . 而后会把描述文件和签名 以及可执行文件 MachO
一块儿打包 .
当这个步骤完成 . iPhone
手机要对该软件包进行校验 .
- 首先 , 苹果根据
iOS
系统中的 私钥A 对描述文件中的证书进行解密校验 . 经过则意味着这个证书是苹果颁发的 , 也就是说是被许可的 .- 当第一步完成解密 , 就拿到了
公钥M
, 而后进行HASH
校验是否被篡改过 .- 拿到
公钥M
以后 , 使用公钥M
去验证APP
的签名 , 以此来验证 这个证书是否是这个APP
的. ( 这也就是为何别的小伙伴生成的证书须要把p12
发给其余人来真机调试的缘由 . )- 而后校验
UDID
等等.
这就是 iOS 应用完整的双层签名流程了. 讲完签名原理 , 不急着研究重签名 , 先打下点基础知识 , 来看看描述文件 .
那么咱们来看一下描述文件究竟是个啥东西.
打开目录
/Users/**你的名字**/Library/MobileDevice/Provisioning Profiles
复制代码
随便选择一个 , 使用终端查看
security cms -Di 0b7f1352-7a1e-4800-b52b-f2fc35e550dd.mobileprovision
复制代码
往下找到一个 entitlements
的 key
和其 value
.
<key>Entitlements</key>
<dict>
<key>aps-environment</key>
<string>development</string>
<key>application-identifier</key>
<string>4NJV3PZG3A.com.libin.WMXJ</string>
<key>keychain-access-groups</key>
<array>
<string>4NJV3PZG3A.*</string>
</array>
<key>get-task-allow</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>4NJV3PZG3A</string>
</dict>
复制代码
这个 entitlements
就是权力配置 , 在重签名中会使用到. 描述文件中还包含了全部 APP
的配置内容 , 你们有兴趣能够一一查看.
那么 , 苹果是如何签名的咱们知道了 . 那问题来了 , 如何去作重签名 ?
其实 iOS 应用签名部分都是利用了 CodeSign
来完成的 . 咱们能够利用终端来本身进行签名 .
目前市面上也有许多应用能够可视化完成重签 或者一键重签 . 或者利用写好的 shell
脚原本玩 . 对于初学者 . 我的建议仍是按照最基础的方式操做几遍 , 理解了其原理 , 在使用其余工具碰到为题也比较好处理 , 固然 , 本篇文章会介绍如何手写 shell 来完成重签名. .
pp助手 for Mac : 用来下载砸完壳的应用.
下载完成打开 , 被阻拦非 App Stroe
下载的应用打开的解决办法就再也不介绍了. 设置 - 安全性与隐私 / 或者使用终端均可以 .
找到越狱应用下载微信
下载 ipa
完成 , 重命名为 zip
, 解压缩 找到 Payload
- WeChat
.
弄了半天 , 咱们先来看看这个东西 . Iterm2
/ 终端命令:
codesign -vv -d WeChat.app
复制代码
其中有一项 : Authority
, 就是应用签名 .
那么咱们如今要用咱们本身的证书 去从新签名 .
在 WeChat
文件显示包内容 , 找到一个黑框框 WeChat
文件.
这个就是咱们常常提到的 MachO
文件了 . 后续我会专门讲解它 以及如何仔细查看.
如今咱们先来简单查看一下 , 利用 otool
工具.
命令 : otool -l WeChat
.
内容比较多 , 咱们重定向一下 , 写到一个文件里.
命令 : otool -l WeChat > /Users/libin/Desktop/iOS进阶逻辑课程/逆向/WeChatMaCho.txt
( 名称和路径随便 ) .
写完后咱们打开文件 , 搜索 cryptid
,
注意 : cryptid
是 0
, 表明你下载的是砸过壳的 , 而通常应用是 1
, 也就是加密过的 , 其实就是 AppStore
使用的对称性加密 , iPhone
在运行的时后解密 ( 并不是安装时就解密 ) .
写了这么多 , 终于要开始重签名了 . GO
-->
命令: security find-identity -v -p codesigning
. 选择一个 , 复制下来 .
这里我就不列举笔者本身的了.
还彻底没有证书的小伙伴
打开 WeChat
, 显示包内容 . 找到 PlugIns
文件夹, 直接删除 插件普通帐号是签不了的 .
找到 Watch
文件夹 , 由于这里也有插件 , 咱们暂时不须要 Watch
, 直接删掉.
进入 FrameWork
文件夹
利用 CodeSign
, 使用咱们的证书进行重签名.
codesign -fs "刚刚复制的你本身的证书名字" 要重签的FrameWork名称
codesign -fs "iPhone Developer: ha ha (123456)" andromeda.framework
FrameWork
文件夹下全部的库所有重签.最简单的方式就是预览框中 , 黑色就表明可执行 , 灰色就表明不可执行 .
或者 命令 : ls -l WeChat
, 结果是 -rwxr-xr-x
或者其余权限.
若是没有可执行权限 , 也就是 x
权限 , 能够经过 chmod +x WeChat
添加权限.
( 关于 Linux
权限和命令这块儿若是你们不是很清楚 , 留言一下 , 我后面补一篇文章详细讲讲 , 毕竟有些面试仍是会问 , 不能只知道一个 777 , 由于不少是已经知道了 , 本文就暂不赘述了 )
由于咱们下载的是上线包 , 确定是没有描述文件这种东西在包里的 . 所以咱们须要本身生成一个 .
Xcode
, 新建工程 我这里取名 WeChatDemo
. 而后选择真机 , 选择开发者 , 自动 / 手动管理均可以 , 我这里勾选自动 , 而后运行 , 把这个空工程安装到手机上.Info.plist
Bundle identifier
com.tencent.xin
改成你本身刚刚新建工程的 Bundle identifier
我这里为 com.libin.WeChatDemo
利用上文中咱们说的查看描述文件方法 , 查看咱们刚刚拷贝到微信包里的描述文件 . 也就是咱们本身空工程生成的描述文件. 找到权力文件部分
打开咱们刚刚新建的 Xcode
工程 , 新建一个 Plist
文件 , Open As Source Code
把上上图中描述文件的权利文件部分复制 , 粘贴到新建的 Plist
中 ,
Open As Property List
查看下. 其实就是为了获得一个 plist 文件备用. 也能够用其它方式. 新建的 Plist
写好后 , Show In Finder
. 将其放到微信包同路径中 , 方便操做.
重点 : 重签命令 --
codesign -fs "iPhone Developer: haha (123456)" --no-strict --entitlements=ent.plist WeChat.app
(注意替换本身的证书 , 文件)
cmd + shift + 2
Bundle ID
有没有换成本身工程的 , 防止原版微信被替换了 )
注意看 , 手机上以前那个空工程变成了微信了 . ( 注意若是有安装失败的同窗 , 先检查本身步骤有无错误 , 如没有 可尝试不使用 Xcode
自动生成证书以及描述文件 , 本身去开发者中心配置 , 选择.)
点击冒牌微信打开 , 微信项目启动了.
选择以后 注意看上方状态栏 , 变成 running
就好
而后就可使用 view debug
/ LLDB
, 添加符号断点等等调试方法了 .
因为篇幅问题 , 本文很少赘述了 , 后面会补充 shell
脚本自动重签实现 , 直接更换包实现 , 后续会继续就代码注入 等方面展开 .