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

iOS逆向之重签名_第1张图片
图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”。

iOS逆向之重签名_第2张图片
图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

iOS逆向之重签名_第3张图片
图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 

@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

你可能感兴趣的:(iOS逆向之重签名)