iOS逆向开发:修改二进制代码

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文件,再用第三方工具安装到手机(不需要重签名)。

关于Zeno Chen

本人涉及的领域较多,杂而不精 程序设计语言: Perl, Java, PHP, Python; 数据库系统: MySQL,Oracle; 偶尔做做电路板的开发,主攻STM32单片机
此条目发表在Objective-C分类目录。将固定链接加入收藏夹。