我的编程空间,编程开发者的网络收藏夹
学习永远不晚

iOS应用脚本重签名的实现方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

iOS应用脚本重签名的实现方法

上一篇iOS APP签名详解我们了解了iOS签名的机制和原理,这一篇我们一起来动手写一个自动重签名的脚本,懒是程序员乃至人类进步的终极力量,造轮子写工具可以极大的避免重复性工作,为我们节省更多的时间放在思考上,话不多说撸起袖子开始干:

第一步:获取脱壳的ipa包

  1. 从iTunes 12.6.3及以前的版本上直接下载 (macOS Mojave Doesn't Support),这样获取到的是正版ipa,需要用Clutch、dumdecrypted等工具先脱壳,否则别人的加密验证不通过无法安装
  2. 各类助手上下载越狱版ipa包
  3. 越狱手机导出
  4. Xcode打包 等等

这里我下载了微信的越狱版ipa包用来演示。

第二步:命令行实现重签名

将ipa解压缩后前往.app所在目录,输入

codesign -d -vv WeChat.app

查看可执行文件的签名信息:

可以看到签名信息现在还是腾讯的

输入:

security find-identity -v -p codesigning

查看Mac本地的证书列表:

记下你要用来签名的证书双引号(包括双引号)中的字符串,一会儿会用到

确认ipa包是否已经脱壳,输入:

cd WeChat.app otool -l WeChat | grep crypt

会输出:

cryptid为0即为已脱壳,为1为加密状态。这里有两组数据是因为这是个支持两种CPU架构的可执行文件,可输入 file WeChat 查看可执行文件支持的架构:

删除无法签名的插件文件:PlugIns文件夹、Watch文件夹

对.app文件夹内的Frameworks文件夹中的每一个framework强制重签名: codesign -fs 步骤2中记下的证书信息 要签名的.framework

注意不要遗漏,每一个framework都要用自己的证书重签一下

将自己的描述文件名改为embedded.mobileprovision,并拖入到.app中,再将.app中info.plist文件里的Bundle identifier改成我们自己的BundleID

在.app同级目录下新建一个entitlements.plist文件,查看描述文件内容:

security cms -D -i embedded.mobileprovision 将Entitlements节点下的


<dict>
 ...
 ...
</dict> 

到刚刚新建的entitlements.plist文件中

最后一步,对整个包签名,回到.app所在目录,输入: codesign -fs 步骤2中记下的证书信息 --no-strict --entitlements=entitlements.plist WeChat.app 签名成功!

打包: zip -ry WeiChat.ipa Payload

以上,就是通过命令行一步步的实现应用重签名。

最后:撸自动重签名的脚本

现在我就按照这个思路写脚本:


#${class="lazy" data-srcROOT} 它是工程文件所在的目录
TEMP_PATH="${class="lazy" data-srcROOT}/Temp"
#资源文件夹,我们提前在工程目录下新建一个APP文件夹,里面放ipa包
ASSETS_PATH="${class="lazy" data-srcROOT}/APP"
#目标ipa包路径
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
#清空Temp文件夹
rm -rf "${class="lazy" data-srcROOT}/Temp"
mkdir -p "${class="lazy" data-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

将写好的脚本直接丢到.xcodeproj同级目录中 Xcode --> Build Phases --> New Run Script Phase:

现在,将你要重签名的ipa包丢到在工程目录下新建的文件夹Temp中,直接Run!任何应用都会在你的真机上跑起来了!这也是后面讲逆向的准备工作。

了解了iOS签名的原理再做重签名,我相信上面的每一步为什么那么做,你自然也很清楚了,写起脚本来自然思路也很清晰~如果你在实践中遇到任何问题,欢迎留言交流~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

iOS应用脚本重签名的实现方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

iOS应用脚本重签名的实现方法

上一篇iOS APP签名详解我们了解了iOS签名的机制和原理,这一篇我们一起来动手写一个自动重签名的脚本,懒是程序员乃至人类进步的终极力量,造轮子写工具可以极大的避免重复性工作,为我们节省更多的时间放在思考上,话不多说撸起袖子开始干: 第一
2022-05-17

android实现给未签名的apk签名方法

android给未签名的apk签名命令。 准备文件 1、unsign.apk(未签名的apk) 2、shanhy.keystore(签名证书文件) 命令语法: jarsigner -verbose -keystore [keystor
2022-06-06

编写shell脚本实现tomcat定时重启的方法

最近我在学生价买的低配服务器上部署了一个很吃内存的网页,导致 tomcat 内存经常溢出而崩溃。于是我上网找了一些教程编写了一个简单的每天定时启动 tomcat 的脚本,特此记录一下我的环境是 centos 7 1、 在某个目录新建一个 .
2022-06-04

Shell脚本去重的几种方法实例

测试文件[root@bogon ~]# cat >testjasonjasonjasonfffffjason按 Ctr + D保存 1、sort -u[root@bogon ~]# sort -u testfffffjason2、uniq[
2022-06-04

Shell脚本批量重命名文件后缀的3种实现方法介绍

本篇内容主要讲解“Shell脚本批量重命名文件后缀的3种实现方法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Shell脚本批量重命名文件后缀的3种实现方法介绍”吧!需求:家目录下有一些sq
2023-06-09

iOS实现文本分页的方法示例

前言 本篇文章将分为两部分,一部分是静态文本分页,一部分是动态文本分页即边填写文本边进行文本的分页.我们所采用的方案为:TextKit进行处理,通过glyphRangeForTextContainer方法获取文本内容视图可容纳的文本范围来对
2022-05-22

利用Python脚本生成sitemap.xml的实现方法

安装lxml首先需要pip install lxml安装lxml库。如果你在ubuntu上遇到了以下错误:#include "libxml/xmlversion.h" compilation terminated. error: comma
2022-06-04

Android的APK应用签名机制以及读取签名的方法

发布过Android应用的朋友们应该都知道,Android APK的发布是需要签名的。签名机制在Android应用和框架中有着十分重要的作用。例如,Android系统禁止更新安装签名不一致的APK;如果应用需要使用system权限,必须保证
2022-06-06

如何使用shell脚本实现ping对应IP所对应的人名

这篇文章给大家分享的是有关如何使用shell脚本实现ping对应IP所对应的人名的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。示例#!/bin/basha=(张三 李四 王五 赵六)for i in {0..3}
2023-06-09

使用shell脚本实现ping对应IP所对应的人名(推荐)

#!/bin/bash a=(张三 李四 王五 赵六) for i in {0..3} do if ping -c 1 192.168.1. $((${i}+1)) >dev/null 2>&1;then echo $((${i}+1))"
2022-06-04

shell脚本中取消重定向的方法实例

在上一篇关于shell编程的例子中,有讲到把shell脚本进行扩展之后重定向到一个文件中,以便进行查看和调试http://www.lsjlt.com/article/62435.htm。但是,若是有另一种情况:只是在某些地方进行重定向,而其
2022-06-04

Windows中Bat脚本如何实现定时重启应用程序

这篇文章主要为大家展示了“Windows中Bat脚本如何实现定时重启应用程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Windows中Bat脚本如何实现定时重启应用程序”这篇文章吧。关闭和重
2023-06-29

linux shell 脚本实现tcp/upd协议通讯(重定向应用)

前几天发了重定向以及管道相关使用方法,今天这里发些很有趣的例子。通过重定向实现基于tcp/udp协议的软件通讯。 linux 设备里面有个比较特殊的文件: /dev/[tcp|upd]/host/port 只要读取或者写入这个文件,相当于系
2022-06-04

Shell脚本批量重命名文件后缀的3种实现

今天突然间想起昨天有个问题还没动手实践下,就是利用shell批量修改文件的后缀,现在动手实践一下。 需求:家目录下有一些sql文件,想批量重命名成txt的 1、find + xargs +sedfind /root -name ‘*.sql
2022-06-04

利用Python脚本实现ping百度和google的方法

Ping服务ping 是基于 XML_RPC 标准协议的更新通告服务,用于Blog把内容更新快速通知给搜索引擎,以便搜索引擎及时进行抓取和更新。 计算机就相当于 RPC Client ,用于向 RPC Server 发起请求,并接受方法的执
2022-06-04

shell之正向解析脚本的实现方法

正向解析脚本#!/bin/bash yum install bind -y //安装解析工具包 //修改主配置文件sed -i '13s/127.0.0.1/192.168.17.156/' /etc/named.conf //
2022-06-04

shell之分离解析脚本的实现方法

分离解析脚本 在运行脚本之前,需要VM虚拟机,Centos7,两台主机一台win10 -1 作为广域网的主机, 一台win10 -2作为区域网的主机。 之前我的博客有教程#!/bin/bash //修改添加网卡配置文件 //设置双网卡 se
2022-06-04

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录