前言
在没有源代码的情况下,你已经对某个应用进行了资源修改(比如修改了启动图或图标等)。修改完成以后,如果想要让APP可以正常使用,该APP一定要重新签名然后压缩成IPA文件。如果你想让你的APP不经过苹果审核,就可以私自发布到HTTPS服务器上,不越狱也能安装,且没有设备台数限制,那么你就要把个人开发者签名,替换成企业开发者In-House证书签名,之后OTA发布就行了。一个开发者的应用,需要在另一个开发者帐号下发布到App Store。上传的ipa包,是重签名后的包。过期或者失效签名的应用,正常使用需要重新签名。
一、安装包重签名
1、签名步骤
其实我们最终签名app都是使用codesign
工具,苹果也是用xcode集成了这个工具而已。这个工具为我们做了很多事情,而我们只需要敲几个命令就可以完成重签名工作。
1)准备一个embedded.mobileprovision
文件,必须是付费证书产生的,appid、device一定要匹配,准备好后,放入.app
包中
可以通过Xcode自动生成,然后再编译后的APP包中找到;也可以通过开发者证书网站生成下载
2)从embedded.mobileprovision
文件中提取出entitlements.plist
权限文件,命令如下:
security cms -D -i embedded.mobileprovision > temp.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
3)通过以下命令,查看可用的证书,并拿到证书ID
security find-identity -v -p codesigning
4)对.app
内部的动态库、AppExtension
等进行签名
codesign -fs 证书ID xxx.dylib
5)对.app
包进行重签名
codesign -fs 证书ID --entitlements entitlements.plist xxx.app
2、签名示例
1)准备项目
- 测试代码
int _age = 6;
- (void)viewDidLoad {
[super viewDidLoad];
UILabel *label = [[UILabel alloc] init];
label.text = [NSString stringWithFormat:@" test num %d", _age];
label.frame = CGRectMake(30.0, 100.0, 120.0, 30.0);
label.backgroundColor = [UIColor yellowColor];
[self.view addSubview:label];
}
- 获取ipa包文件
右键点击Products
中的ZJHResignDemo.app
,选择Show In Finder
,找到该文件,复制到新建文件夹Payload
中,并压缩为Payload.zip
文件,修改该文件为ZJHResignDemo.ipa
,将ipa包装入手机就能正常使用了。
2)修改可执行文件
示例中全局变量_age
的数据值存放在mach-o文件的data
字段中,可直接通过MachOView
修改该值。包内容当中任何文件被修改了都会破坏签名,所以修改后的文件就不能安装了,需要对它进行重签名。
如上图所示,将_age
的值,从6
改成了8
,修改后,需要保存一下。
3)对新的可执行文件进行签名
- 从
ZJHResignDemo.app
中获取embedded.mobileprovision
文件
右击ZJHResignDemo.app
,显示包内容
就能看到embedded.mobileprovision
文件了
- 从
embedded.mobileprovision
文件中提取entitlements
文件
1> security cms -D -i embedded.mobileprovision > temp.plist
2> /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
- 获取证书
id
security find-identity -v -p codesigning
最前面那一串就是证书ID,如03906****************388785
- 对APP包重签名
codesign -fs [证书id] --entitlements entitlements.plist [APP包路径]
- 重新生成
ipa
包并安装
将重新生成的ZJHResignDemo.app
文件,放入新建的Payload
文件夹,压缩文件,然后重命名文件夹,得到ZJHResignDemo2.ipa
,安装到手机后,可看到"6"已经变成了“8”。
3、签名工具的使用
除了使用命令行重签名以外,我们还可以使用GUI图形化工具进行重签名,这里推荐两个比较好用的工具:
1)iOS App Signer
iOS App Signer,可以对.app重签名打包成.ipa,需要再.app包中提供对应的embedded.mobileprovision
文件
可以下载项目,编译一下,生成工具。或者直接在这里下载作者编译好的:https://github.com/DanTheMan827/ios-app-signer/releases
打开工具,选择APP包,选择证书,点击Start
;重签名成功后,会自动生成ipa包。
2)iReSign
- iReSign,可以对ipa进行重签名,需要提供
entitlements.plist、embedded.mobileprovision文件
的路径
二、动态库重签名
1、准备工具insert_dylib
下载地址:https://github.com/Tyilo/insert_dylib
打开项目,编译一下,生成工具insert_dylib
。将工具放入/usr/local/bin
目录下
2、准备动态库
使用Tweak
新建一个动态库,具体操作步骤,可参考:iOS逆向之theos的安装使用
-
Tweak.x
文件的代码为:
// 需要引入对应的库
#import
@interface ViewController
- (void)presentViewController:(UIViewController *)viewControllerToPresent
animated:(BOOL)flag
completion:(void(^)(void))completion;
@end
%hook ViewController
- (void)viewDidAppear:(BOOL)animated {
%orig;
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示"
message:@"动态库加载成功!"
preferredStyle:UIAlertControllerStyleAlert];
[self presentViewController:alert
animated:YES
completion:nil];
}
%end
- 安装成功后,导出
.dylib
和CydiaSubstrate
文件
动态库.dylib
文件存放在/Library/MobileSubstrate/DynamicLibraries
文件夹中,需要将它导出来。
因动态库文件依赖CydiaSubstrate
文件,所以也需要将它导出来,CydiaSubstrate
文件存放路径为Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
将 ZJHResignTweak.dylib
和CydiaSubstrate
文件,存在ZJHResignDemo.app
中。下一步将要对它们进行重签名。
3、重签名动态库
1)让可执行文件链接动态库
默认情况下,可执行文件是不会加我们手动导入的动态库,需要可执行文件(ZJHResignDemo)链接动态库(ZJHResignTweak.dylib)
insert_dylib @executable_path/[动态库名称] [可执行文件名称] --all-yes --weak [新可执行文件名称]
-
insert_dylib
:动态库加载路径 -
--all-yes
:后面所有的选择都为yes -
--weak
:即使动态库找不到也不会报错
insert_dylib的本质是往Mach-O文件的Load Commands中添加了一个LC_LOAD_DYLIB活LC_LOAD_WEAK_DYLIB。
可以通过otool
查看Mach-O的动态库依赖信息
otool -L Mach-O文件
2)修改CydiaSubstrate
文件路径
- 查看动态库(ZJHResignTweak.dylib)的依赖库
可以看到ZJHResignTweak.dylib依赖的CydiaSubstrate路径为/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
。
- 修改CydiaSubstrate路径
因CydiaSubstrate路径变更,所以需要对它进行修改。
install_name_tool -change [原路径] @loader_path/CydiaSubstrate [动态库名称]
再次执行otool -L ZJHResignTweak.dylib
查看,可以看出CydiaSubstrate路径已经修改了。
3)对动态库
和CydiaSubstrate
文件重签名
codesign -fs [证书id] [文件名称]
4)对APP包重签名并安装验证
参考链接:
https://www.jianshu.com/p/8fe7ea6b937f
https://www.jianshu.com/p/61c6720d280d