IOS的程序有时候没有按照你的意愿运行,那么我们可以修改二进制的代码,一个办法是把执行程序的指令或者数据改掉;另一个办法是让程序执行到自已的代码上,再把流程或内存值给改掉。最终,让程序按自己的想法来运作。
这是一个会“过期”的程序,显示主页面的代码是这样的:
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UIAlertController* alertvc = nil;
int expire = 1;
if (expire) {
alertvc = [UIAlertController alertControllerWithTitle:nil message:@"过期了!" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"算了" style:UIAlertActionStyleCancel handler:nil];
[alertvc addAction:cancel];
}
else {
alertvc = [UIAlertController alertControllerWithTitle:nil message:@"欢迎回来" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* ok = [UIAlertAction actionWithTitle:@"太客气了" style:UIAlertActionStyleDefault handler:nil];
[alertvc addAction:ok];
}
[self presentViewController:alertvc animated:YES completion:nil];
}
运行后会弹出一个框,可能是“欢迎回来”,也可能是“过期了”。
为了真实模拟,先把这个demo弄出一个ipa包,再来安装(而不是直接用xcode安装到手机),这个ipa包就是修改目标。

把ipa包解压,再进到xx.app内,找到执行文件,分析这个文件,这里用hopper来分析。
启动hopper,小程的版本是这样的:

可以看到,弹框的代码是:

想要去掉弹框,可以选择不同的办法,比如把调用alertview的代码改成nop,比如把比较的值改掉不让它进过期的分支,比如把跳转指令“取反”地改一下……
这里演示把跳转指令改掉的办法。
先确定跳转的地方:

bz,表示为0就跳转,而且是跳转到非过期的分支。也就是说,现在不是0,没有跳转。所以,修改的办法就是改为“不为0就跳转”。
把光标放在cbz命令行上,再切换至十六进制的表示页面:

cbz即是:68 05 00 34
而cbnz(不是0就跳转)是:29 00 00 35
所以,修改为cbnz,就是这样:
保存为另一个执行文件:

把修改后的执行文件覆盖掉原文件,再把Payload目录打包,重命名为.ipa文件,再用第三方工具安装到手机(不需要重签名)。