iOS逆向之重签名

前言

在没有源代码的情况下,你已经对某个应用进行了资源修改(比如修改了启动图或图标等)。修改完成以后,如果想要让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包装入手机就能正常使用了。

图1:获取正常的ipa文件.png

2)修改可执行文件

示例中全局变量_age的数据值存放在mach-o文件的data字段中,可直接通过MachOView修改该值。包内容当中任何文件被修改了都会破坏签名,所以修改后的文件就不能安装了,需要对它进行重签名。

图2:修改可执行文件的内容.png

如上图所示,将_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

图3:获取entitlements文件.png
  • 获取证书id

security find-identity -v -p codesigning

图4:获取证书id.png

最前面那一串就是证书ID,如03906****************388785

  • 对APP包重签名

codesign -fs [证书id] --entitlements entitlements.plist [APP包路径]

图5:对APP包重签名.png
  • 重新生成ipa包并安装

将重新生成的ZJHResignDemo.app文件,放入新建的Payload文件夹,压缩文件,然后重命名文件夹,得到ZJHResignDemo2.ipa,安装到手机后,可看到"6"已经变成了“8”。

图6:重新生成pa包并安装.png

3、签名工具的使用

除了使用命令行重签名以外,我们还可以使用GUI图形化工具进行重签名,这里推荐两个比较好用的工具:

1)iOS App Signer

iOS App Signer,可以对.app重签名打包成.ipa,需要再.app包中提供对应的embedded.mobileprovision文件

可以下载项目,编译一下,生成工具。或者直接在这里下载作者编译好的:https://github.com/DanTheMan827/ios-app-signer/releases

图7:使用iOS App Signer.png

打开工具,选择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目录下

图8:准备工具insert_dylib.png

2、准备动态库

使用Tweak新建一个动态库,具体操作步骤,可参考:iOS逆向之theos的安装使用

  • Tweak.x文件的代码为:
// 需要引入对应的库
#import <UIKit/UIKit.h>

@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
  • 安装成功后,导出 .dylibCydiaSubstrate文件

动态库.dylib文件存放在/Library/MobileSubstrate/DynamicLibraries文件夹中,需要将它导出来。

因动态库文件依赖CydiaSubstrate文件,所以也需要将它导出来,CydiaSubstrate文件存放路径为Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate

图9:安装成功后,导出 `.dylib`和`CydiaSubstrate`文件.png

ZJHResignTweak.dylibCydiaSubstrate文件,存在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文件
图10:让可执行文件链接动态库.png
2)修改CydiaSubstrate文件路径
  • 查看动态库(ZJHResignTweak.dylib)的依赖库

可以看到ZJHResignTweak.dylib依赖的CydiaSubstrate路径为/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate

图11:查看动态库(ZJHResignTweak.dylib)的依赖库.png
  • 修改CydiaSubstrate路径

因CydiaSubstrate路径变更,所以需要对它进行修改。

install_name_tool -change [原路径] @loader_path/CydiaSubstrate [动态库名称]
图12:修改CydiaSubstrate路径.png

再次执行otool -L ZJHResignTweak.dylib查看,可以看出CydiaSubstrate路径已经修改了。

3)对动态库CydiaSubstrate文件重签名
codesign -fs [证书id] [文件名称]
图13:对`动态库`和`CydiaSubstrate`文件重签名.png
4)对APP包重签名并安装验证
图14:对APP包重签名并安装验证.png



参考链接:
https://www.jianshu.com/p/8fe7ea6b937f
https://www.jianshu.com/p/61c6720d280d

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

推荐阅读更多精彩内容