iOS App重签名

一、手动重签名:

我们将通过手动打包、手动安装的方式,把一个越狱的App安装到手机上。
前提:下载一个越狱的ipa包并解压。

  1. 把目标App包内容里的Plugins文件夹删掉。因为这个插件文件夹里面的内容用免费个人账号没办法进行签名。
  2. 把目标App包内容里的Watch文件夹删掉。因为Watch App里面也有插件,原因同上。
  3. 对目标App包内容里的Frameworks文件夹里面的内容进行签名。
    codesign -fs "证书" xxx.framework
  4. 给目标App包内容里的可执行文件添加执行权限。
    chmod +x 可执行文件
  5. 把目标App包内容Info.plist里的Bundle identifier替换成新建Demo包内容Info.plist里的Bundle identifier。
  6. 把新建Demo包内容里的描述文件拷贝到目标App包内容里。
  7. 把描述文件里的权限文件字典的部分生成plist权限文件。例如:en.plist。把en.plist文件拷贝到目标App同级目录下。这个文件是要在签名整个目标App的时候导入进去的。
<key>Entitlements</key>
    生成plist权限文件的字典
<key>ExpirationDate</key>
  1. 进入en.plist文件目录下,签名整个目标App。
    codesign -fs "证书" --no-strict --entitlements=en.plist xxx.app
  2. 打包ipa包。
    zip -ry xxx.ipa 要打包的文件夹(en.plist文件的上一级文件夹)
  3. 安装。
    Xcode -> Windows -> Devices and Simulators -> 点击+号选中ipa包,即可安装到手机上。

二、利用Xcode重签名:

  1. 创建一个Demo,编译过后进入Demo的app目录。把目标App拷贝到该目录下,修改目标App的名字为Demo的app的名字,并把Demo的app删掉。
  2. 重复手动重签名的1、2、3、4、5步。

三、脚本自动化重签名:

这个其实也是利用Xcode进行重签名的。

  1. 创建一个Demo,在Build Phases里+一个Run Script,支持Shell脚本。在Demo文件夹(工程文件所在目录)底下新建一个APP(放ipa包)和Temp(放临时的ipa包)文件夹。
  2. 把一个越狱的ipa包拖到APP目录下。
  3. 编写脚本,通过脚本完成自动化重签名。
# ${SRCROOT} 它是工程文件夹所在目录
TEMP_PATH="${SRCROOT}/Temp"
# 资源文件夹
ASSETS_PATH="${SRCROOT}/APP"
# ipa包路径
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"

# 保证每次进来,Temp文件夹都是空的
rm -rf "$TEMP_PATH"
mkdir -p "$TEMP_PATH"

#-------------------------------------
# 1.解压ipa包到Temp文件夹下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解压的临时的APP的路径
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app; echo "$1")
#echo "临时的APP的路径是: $TEMP_APP_PATH"

#-------------------------------------
# 2.将解压出来的.app拷贝到工程目录下
# BUILT_PRODUCTS_DIR 工程生成的APP包路径
# TARGET_NAME target名称
#echo "APP包路径是: $BUILT_PRODUCTS_DIR"

TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
#echo "target app路径: $TARGET_APP_PATH"

rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH/"

#-------------------------------------
# 3.为了使重签名过程简化,移走PlugIns和Watch文件夹。此外个人免费的证书没办法签extension

echo "Removing AppExtensions"
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"

#-------------------------------------
# 4.更新 Info.plist 里的 Bundle identifier
# 设置 "Set :KEY Value" "目标文件路径.plist"
# PlistBuddy 工具是对 plist 文件进行操作的

/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"

#-------------------------------------
# 5.给可执行文件上权限
# 添加ipa二进制的执行权限,否则xcode会告知无法运行
# 这个操作是要找到第三方app包里的可执行文件名称,因为info.plist的 'Executable file' key对应的是可执行文件的名称
# 我们grep 一下,然后取最后一行, 然后以cut 命令分割,取出想要的关键信息。存到APP_BINARY变量里
# 拿到Mach-O文件的路径
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
# 这个为二进制文件加上可执行权限 +X
chmod +x "$TARGET_APP_PATH/$APP_BINARY"


# -------------------------------------
# 6. 重签第三方app Frameworks下已存在的动态库
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
#遍历出所有动态库的路径
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do
echo "🍺🍺🍺🍺🍺🍺FRAMEWORK : $FRAMEWORK"
# 签名 --force表示强制签名,用证书签Framework
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi

# -------------------------------------
# 7. 注入我们编写的动态库
echo "开始注入"
# 需要注入的动态库的路径  这个路径我就写死了!
INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/libXPFHook.dylib"
#
## 通过工具实现注入
yololib "$TARGET_APP_PATH/$APP_BINARY" "$INJECT_FRAMEWORK_RELATIVE_PATH"
echo "注入完成"

我们也可以把脚本拿出来,形成一个公共文件,这样可以重复利用。在Run Script里面把脚本的路径添加上。需要注意给脚本增加可执行权限。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 这篇文章以目标为:实现安装两个app,也就是修改info.plist中的Bundle identifier 对ap...
    XPorter阅读 8,348评论 11 9
  • 参考文章:https://objccn.io/issue-17-2/ 查看本地证书security find-id...
    Will_Z_jwz阅读 725评论 0 0
  • 最近比较闲于是研究了一下app逆向,就拿大家都玩坏了的微信来开刀,上网随便找了个抢红包的动态库,去pp助手下了个越...
    saiGo阅读 3,768评论 0 0
  • 对App重签名需要准备很多原理类的知识,知道iOS 的代码签名机制,熟悉证书与配置文件、 Mach-O 二进制文件...
    sxtra阅读 3,662评论 0 6
  • 知己 人生得一知己足矣。就如俞伯牙和钟子期,高山流水遇知音,那份因懂得而生出的无以言表的愉悦是令人生羡,可却也求...
    香樟树下的守望阅读 906评论 0 1