iOS逆向(1)——利用ipa重签名,3分钟iPhone安装多个微信
本文要达成如图效果,在一台iPhone上安装第二个微信:
准备:
- Xcode
- 微信ipa(可通过iTool进行下载)
- 重签名脚本
步骤
- 打开Xcode,新建Single View App项目,名字可以随意,这里就用Wechat吧。
- 工程根目录下新建文件夹,命名为APP,把ipa文件放入。
- 点击TARGETS-Wechat-Build Phases-New RunScript phasa
- 把以下脚本粘贴进上一步新建的Run Script
# ${SRCROOT} 它是工程文件所在的目录
TEMP_PATH="${SRCROOT}/Temp"
#资源文件夹
ASSETS_PATH="${SRCROOT}/APP"
#ipa包路径
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"#新建Temp文件夹
rm -rf "${SRCROOT}/Temp"
mkdir -p "${SRCROOT}/Temp"#----------------------------------------
# 1. 解压IPA到Temp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解压的临时的APP的路径
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# echo "路径是:$TEMP_APP_PATH"#----------------------------------------
# 2. 将解压出来的.app拷贝进入工程下
# BUILT_PRODUCTS_DIR 工程生成的APP包的路径
# TARGET_NAME target名称
TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
echo "app路径:$TARGET_APP_PATH"rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"#----------------------------------------
# 3. 删除extension和WatchAPP.个人证书没法签名Extention
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"#----------------------------------------
# 4. 更新info.plist文件 CFBundleIdentifier
# 设置:"Set : KEY Value" "目标文件路径"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"#----------------------------------------
# 5. 给MachO文件上执行权限
# 拿到MachO文件的路径
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#上可执行权限
chmod +x "$TARGET_APP_PATH/$APP_BINARY"#----------------------------------------
# 6. 重签名第三方 FrameWorks
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do#签名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
- command+R运行项目到真机,即可把ipa安装到iPhone上,并且不会与iPhone原有的“正版”冲突。
至此,我们只花费几分钟,就实现了我们一开始说的效果。下面我们看下原理。
原理
在iOS逆向开发时需要把下载的ipa文件安装到iOS设备上,才能进行动态分析,才能更好的玩别人的App。但是有经验的同学是知道的,下载的ipa(AppStore 和自己发布的除外) 文件是不能直接安装到自己的iPhone (未越狱)上的。为什么?因为苹果作了一个比较复杂的加密—签名。那又有同学问了什么是签名呢?为什么要签名呢?来看看这里https://www.jianshu.com/p/6fa292eaabce。
为了把下载的ipa 安装到我们自己的iPhone 上要先对ipa 进行重签名。
常见的 ipa 重签名方式
- 完全重签名
证书,mobileprovision、Bundle ID 三者信息对应一致,这种重签名方式基本上与直接对代码进行签名的效果是一样的;
优点:有效期长、稳定性高;
缺点:维护成本较高,每一个重签名的ipa都必须修改Bundle ID 并且独享一套证书和mobileprovision文件;
适用范围:对签名效果稳定性有要求的公司和团队; - 不完全重签名
只保证证书和mobileprovision对应一致,至于这两者与原ipa的Bundle ID 等信息是否一致则不考虑;
优点:看起来较方便维护;
缺点:实际上并没有对原ipa的签名进行完全替换,很容易重签名失败,稳定性不高,多则一两个月,少则三五天就可能发生签名失效,需要重新签名,慎用!!
适用范围:市面上出售企业证书进行重签名的个人卖家;
常见的 ipa 重签名工具
- 终端 使用命令行
需要记忆的命令比较多,步骤比较繁琐,效率比较低。但是显得逼格够高,装 X 利器。 - MonkeyDev
大牛写的工具插件,配置好就能直接用。效率比较高,跟自己创建新的Xcode 项目差不多。但是比较依赖工具,万一哪一天大牛不开心,不维护或者是需要收费了就比较尴尬 - Xcode 自动化重签
Xcode 简单易操作( 我就不信苹果爸爸会把Xcode 放弃或收费),可以达到类似MonKeyDev 的效果(想想自己可以写一个自动化重签的插件是不是也很牛X)。 前期需要写一些脚本可能会比较繁琐,但要是你脚本写的够好几乎是一劳永益的。以后直接拿来用就好了。
分析下脚本
从前面的步骤来看,我们的操作及其简单,因为很多工作我们已经用上面提供的脚本自动化完成了,我们不能仅满足于知其然,还需要知其所以然,下面我们分析下脚本到底做了什么事情(第2-8步)。
- 在Xcode 工程文件夹里边 创建一个APP 文件夹(用来存放需要重签的ipa 文件),
- 将ipa 文件解压到本地的Temp 文件夹里边
- 将解压出来的.app拷贝进入工程下工程生成的APP包的路径下并将名称命名为当前工程的名字(覆盖掉之前的.app文件)。
- 删除extension和WatchAPP文件。
- 更新info.plist文件 CFBundleIdentifier
- 给MachO文件上执行权限
- 重签名第三方 FrameWorks
- 执行签名命令
之所以第4步要将ipa 包中的 Extension 文件,是因为个人证书不能重签 Extension 文件,包括 Watch 里边的 Extension。因此我们需要直接把 Watch 文件删除。
以微信为例:
Watch
PlugIns
ipa 文件中的第三方 framework 需要我们手动重签。
Frameworks
第5步更新了 info.plist,是为了修改 CFBundleIdentifier
第6步要给MackO 文件更改了执行权限。
运行app后,我们利用Xcode查看微信的布局,也是一个不错的学习方法呢。
参考:
https://www.jianshu.com/p/1b5592ff285d
https://www.bilibili.com/video/av34261047/?spm_id_from=333.788.videocard.0
相关文章:

使用Fiddler进行HTTP流量分析
“ Fiddler抓包工具使用。”Fiddler作为一个PC端的HTTP/HTTPS协议分析工具,能够抓取PC上的流量,并且它对HTTP类数据的分析,要比Wireshark要简单,友好,它对数据的组织格式很好地提高了分析效率。本文介绍如何在PC上使用…

Java学习笔记(二一)——Java 泛型
【前面的话】 最近脸好干,掉皮,需要买点化妆品了。 Java泛型好好学习一下。 【定义】 一、泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。&#x…

GitHub与Git入门
一、GitHub GitHub为开发者提供Git仓库的托管服务,可以进行代码共享、团队协同开发,创建了社会化(social coding)编程的概念。 二、GitHub与Git的区别 开发者将源代码存入“Git”仓库,而GitHub则在网络上提供Git仓库…

《UML大战需求分析》阅读笔记1
通过阅读本书的序和第一章,让我对于UML的理解更加深刻了,并且懂了怎样把你UML学的更好。 作者先让我们明白什么是UML,大概知道了UML各个图的形态和各种用途,然后再详细的介绍各个图怎样使用。 UML是个非必要的建模工具,…

裸奔的支付X聊天,你还敢用吗?
“ 一直想在社交领域突破的某付宝,却自始至终对社交功能如此的不用心,让用户的数据在网络中裸奔,使用户不寒而栗。”没错,这篇文章要说的就是BAT中A家的支付X,那个千方百计做社交的支付工具。如果你使用了它的聊天窗口…

MVC3项目依赖文件错误解决
MVC3的项目依赖分为两大类: 1、ASP.NET Web Pages 2、ASP.NET MVC 3 如果没有正确引入,或者项目的版本有错误会出现程序集引用错误。 在服务器上部署时,解决思路如下: 1、下载MVC3的安装包,然后在服务器上安装…

让自己的开源项目支持CocoaPods集成
平时我们会经常用CocoaPods集成第三方库,那如何使自己的代码也可以通过CocoaPods集成呢?只需要简单几步: 创建git仓库,把代码提交到Github或码云等在git仓库中创建.Podspec文件,修改里面的配置(如代码的版…

由于客户端检测到一个协议错误 代码0x1104
重新连接N次都还是这个错误提示,最后再重起电脑,还是没用。研究了一下错误终于解决了。 首先检查远程连接端口对不对?Windows远程默认的连接端口是3389,一般大家连接时直接输入IP或域名就可以连接了。如果还要加:端口号的话&#…

使用Fiddler抓取手机HTTP流量包
“ Fiddler手机流量抓包实战。”Fiddler作为一个PC端的HTTP/HTTPS协议分析工具,不仅能够抓取PC上的流量,还能作为代理,抓取手机流量,在之前的文章《使用Fiddler进行HTTP流量分析》中介绍了Fiddler的基本用法,本文介绍如…

Spark Steaming 点滴
Spark Streaming 模块是对于 Spark Core 的一个扩展,目的是为了以高吞吐量,并且容错的方式处理持续性的数据流。目前 Spark Streaming 支持的外部数据源有 Flume、 Kafka、Twitter、ZeroMQ、TCP Socket 等。Discretized Stream 也叫 DStream) 是 Spark S…

CocoaPods远程私有库
上一篇(让自己的开源项目支持CocoaPods集成)介绍了将自己开发的框架代码发布到Cocoapods,全球的开发者都可以通过pod search搜索到我们的框架代码以及通过pod install进行安装。但有时候我们希望只有我们项目内部的人才可以集成和修改&#x…

大数据平台的秘密
大数据,这个词越来越热,很多人都在谈大数据,其实很多张口闭口大数据的人,或许都不知道数据是如何产生、传递、存储、运算到应用。有段时间,看到一些大数据文章,就感觉纯属凑热闹,小数据都没搞明…

Fiddler使用技巧:强大的数据文本编解码功能
“ 郑重推荐Fiddler工具自带的TextWizard功能。”Fiddler作为一个HTTP类协议的抓包分析工具,之前已介绍过抓包分析功能,可参考文章:《使用Fiddler进行HTTP流量分析》《使用Fiddler抓取手机HTTP流量》在抓包分析功能之外,我们一定不…

jquery validate 详解一
jQuery校验 官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一导入js库 <script src"../js/jquery.js" type"text/javascript"></script><script src"../js/jquery.validate.js" type"…

安装VMWare tools,以及解决安装后/mnt中有hgfs但没共享文件的方法
一、首先是安装VMWare tools安装过程可参考:http://www.cnblogs.com/jiu0821/p/7559949.html二、解决安装VMWare tools后/mnt中有hgfs但没共享文件 前提:在虚拟机软件中设置了共享目录 此时在linux中进入 /mnt/hgfs 文件夹,但发现共享的文件没…

音乐(文件)断点下载
这篇文章介绍音乐等文件的下载,支持断点续传。 我们需要创建两个类 HYDownLoader:音乐下载的主类,可以进行新建下载、暂停下载、取消下载等。 HYFileTool:文件管理类,主要为HYDownLoader服务,可以判断文件…

php设计模式
原型模式(prototype) PHP设计模式之:原型模式 刚刚了解了原型模式,通过资料以及自身了解整合以下资料: 原型模式通过复制已经存在的实例来返回新的实例,而不是新建实例,并且原型(被复…

TextKit及应用
在iOS开发中我们常常使用UIKit的UITextView、UITextField、UILabel来显示文字。它们底层都是基于一个叫做TextKit的强大引擎。通过TextKit,我们可以方便地修改文字的样式和排版,而不需要直接操作复杂的Core Text。 1.什么是TextKit 在iOS7中,…

判断类之间的父子关系
如何判断两个类之间的父子关系? java为我们提供了instanceof运算符,可以用来判断一个对象是否是否个类的实例,所以很容易的想到子类的对象肯定是父类的实例。但是如何所涉及到的类是不可实例化的该怎么办呢?好在java的Class为我们…

顺F速运,你被爱加M坑了
“ 顺F速运APP安全性分析。”之前的文章《Wireshark分析实战:某达速递登录帐号密码提取》对某达速递的APP进行了分析,该APP将数据完全暴露于网络流量中。于是对快递行业老大顺F速运的APP进行了分析,发现该APP质量还算上乘,但是&am…

[大数据之Spark]——Actions算子操作入门实例
Actions reduce(func) Aggregate the elements of the dataset using a function func (which takes two arguments and returns one). The function should be commutative and associative so that it can be computed correctly in parallel. 这个方法会传入两个参数&#x…

Runloop总结
1.什么是Runloop Runloop字面上翻译就是运行循环,也就是一直在转圈圈运行着,类似于do…while()。我们思考一个问题: 一个线程执行完成后就会退出,当我们启动一个iOS APP时,系统会调用main.m文件的main()函数: int m…

Android拷贝工程不覆盖原工程的配置方法
http://www.2cto.com/kf/201203/125131.html 在Eclipse中改包名的时候选择refactor-->rename,勾选Rename subpackages,这样就不需要一个个修改每个类中导入的包名了转载于:https://www.cnblogs.com/leihupqrst/p/3670224.html

顺F速运国际版,你的密码漏点了
“ 对顺F旗下各APP顺藤摸瓜分析——顺F速运国际版。”前文《顺F速运,你被爱加M坑了》提到,顺F速运APP使用爱加密加壳,流量中传输内容被加密并BASE64编码了,只是安全性不够,壳没有将顺丰的加密算法及密钥保护好。秉承避…

利用Injection插件加快Xcode编译速度
我们在调试iOS原生代码时,每次修改都需要CommandR来重新编译运行。当项目代码量很大,编译时间就会很漫长。因此对于开发中来说,如果能加快编译速度,能大大提高生产效率。如果我们能像Swift Playground、小程序或网页那样修改代码后…

存储过程的优缺点 (转载)
为什么要用存储过程 几个去 IBM 面试的兄弟回来抱怨:去了好几个不同的 IBM 项目组,几乎每个面试官问到数据库的时候都要问用没用过存储过程,烦人不?大家去面的程序员,又不是 DBA,以前的项目都没有用到存储…

计算机知识的学习
我不是计算机科班出生! 大学里喜欢跟医电系的人混在一起,受到他们影响较多,开始喜欢上计算机!win 98 Office 97 他们有的擅长C、有的擅长Flash、还有哥们喜欢硬件! 西安的东六路是图书批发市场,我几乎每周…
Wireshark小技巧:将IP显示为域名
“ 本文介绍如何使Wireshark报文窗口的Source栏及Destination内的IP直接显示为域名,提升报文分析效率。” 一个典型的Wireshark界面如下: 从这个图里,能看到源IP及目的IP,在流量不大,数据不多的情况下,我…

个人学习某个系统或平台的3问式的整理和细化指引
i:三问:是什么?为什么?怎么样? ii:详细化问题指引:是什么的目的在于确定系统的大致范围,明确目标:->平台的主要功能是什么?业务流程是怎样的?业务范围有多大ÿ…

给iOS开发者的React Native入门使用教程
目录一. 原生iOS项目集成React Native二. 原生跳转RN页面三. 显示豆瓣热门电影列表四. 改为导航五.完整源代码一. 原生iOS项目集成React Native 创建一个新的文件夹,如RNProject,然后新建一个/ios的子文件夹,将已有的iOS项目全部文件复制进去…