ipa加固防护

凡所有相,皆是虚妄。若见诸相非相,即见如来。

无加固的隐患

iOS系统相对于安卓平台来说,在大家的观念里一直是比较安全的。真实的情况是这样的吗,未必。在安卓上会遇到的破解、劫持、盗用等问题在iOS上几乎都会遇到。只是很多时候,我们自以为被保护的太好了罢了。

1. 应用砸壳

App Store上的应用都使用了FairPlay DRM数字版权加密保护技术。使用AES 算法进行加密。解密所需的主密钥也以加密形式存储在容器文件中(FairPlay保护的文件)。解密主密钥所需的密钥称为“用户密钥”。当用户使用iTunes、App Store登陆新设备时,该设备向Apple服务器请求授权,从而获得用户密钥。在试图使用容器文件时,存储在文件中的主密钥随后与用户密钥匹配,并且如果成功则允许使用。

第一种,最简单的方法,就是从PP助手等相关平台去下载已经砸过壳的应用。非常简单。

第二种,自己砸壳

最早的砸壳工具是stefanesser写的dumpdecrypted,通过手动注入然后启动应用程序在内存进行dump解密后的内存实现砸壳,这种砸壳只能砸主App可执行文件。

对于应用程序里面存在framework的情况可以使用conradev的dumpdecrypted,通过_dyld_register_func_for_add_image注册回调对每个模块进行dump解密。但是这种还是需要拷贝dumpdecrypted.dylib,然后找路径什么的,还是挺麻烦的。

比较简单的做法是使用frida-ios-dump,该工具基于frida提供的强大功能通过注入js实现内存dump然后通过python自动拷贝到电脑生成ipa文件,通过以下方式配置完成之后真的就是一条命令砸壳。

环境配置:
首先上面也说了该工具基于frida,所以首先要在手机和mac电脑上面安装frida,安装方式参数官网的文档:https://www.frida.re/docs/home/

如果mac端报如下错:

Uninstalling a distutils installed project (six) has been deprecated` `and` `will be removed` `in` `a future version. This` `is` `due to the fact that uninstalling a distutils project will only partially uninstall the project.

使用如下命令安装即可:

sudo pip install frida –upgrade –ignore-installed six

然后将越狱设备通过USB连上电脑进行端口映射:

iproxy 2222 22

到此环境就配置好了(另当前python基于2.x的语法,先切换到python 2.x的环境)。

最简单的方式直接使用./dump + 应用显示的名字即可,如下:

 ./dump.py 微信

如果应用名称重复了,可以使用如下命令查看安装的应用的名字和bundle id:

./dump.py -l

然后使用如下命令对指定的bundle id应用进行砸壳即可:

./dump.py -b com.tencent.xin

其他方式如:Clutch,class-dump+ cycript + dumpdecrypted等大家可以自行研究。

2. 砸壳之后

使用命令查看ipa是否已砸壳

otool -l ShareCarProject | grep crypt

使用class-dump导出头文件

class-dump -H ShareCarProject.app/ -o Headers

我们就可以在.h文件中查看所有公开方法的声明,方便之后使用MonkeyDev hook该方法。
类似如下:

对ipa包重签名后,就可以拿来玩了。

使用IDA工具静态分析源码

网盘链接 密码:5sm3

选择一个版本运行,然后点击new,选择自己要分析的应用(上面我们破解出来的.decrypted文件,.app文件,.ipa文件都可以选择)。然后一直点下一步OK即可。

点击F5 即可进入解析出来的源码界面

MonKeyDev

MonkeyDev原文安装链接,安装完成后,新建项目时,关注以下界面:

紧接着.我们需要做的就是把我们的ipa文件放到指定位置(当然是放在工程目录下了,这里就不多说了.).然后添加到工程中去.里面的put ipa or app here文件不要删除。

在项目中,修改你想要控制的代码。如果是动态库,还需如下设置,不使用runtime库。

如此,便成功修改了一个应用,常见的有微信抢红包、修改运动步数等。应用的一切都被暴露出来了,危害不仅限于此。

简单加固手段

  1. 完整性校验

     NSBundle *bundle = [NSBundle mainBundle];
     NSDictionary *info = [bundle infoDictionary];
     if ([info objectForKey:@"SignerIdentity"] != nil)
     {
     return YES;
     }
    return NO;
    

通过检测SignerIdentity判断是Mach-O文件否被篡改

原理是:SignerIdentity的值在info.plist中是不存在的,开发者不会加上去,苹果也不会,只是当ipa包被反编译后篡改文件再次打包,需要伪造SignerIdentity。

  1. 越狱判断

尝试使用NSFileManager判断设备是否安装了如下越狱常用工具:

/Applications/Cydia.app
/Library/MobileSubstrate/MobileSubstrate.dylib
/bin/bash
/usr/sbin/sshd
/etc/apt

但是不要写成BOOL开关方法,给攻击者直接锁定目标hook绕过的机会。攻击者可能会改变这些工具的安装路径,躲过你的判断。

那么,你可以尝试打开cydia应用注册的URL scheme:

if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]]){
     NSLog(@"Device is jailbroken");
}

但是不是所有的工具都会注册URL scheme,而且攻击者可以修改任何应用的URL scheme。

那么,你可以尝试读取下应用列表,看看有无权限获取:

if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){
        NSLog(@"Device is jailbroken");
        NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/User/Applications/"
                                                                               error:nil];
        NSLog(@"applist = %@",applist);
}

也可以通过检测当前程序运行的环境变量:

void printEnv(void)
{
    char *env = getenv("DYLD_INSERT_LIBRARIES");
    NSLog(@"%s", env);
}

未越狱设备返回结果是null,越狱设备就各有各的精彩了,尤其是老一点的iOS版本越狱环境。

  1. 简单加固手段

分为:

方法名混淆
明文字符串混淆

原理即字符串替换,使用#define定义,然后用脚步替换成不可预知的字符串。当然还有比较复杂的LLVM加固,这个单列一篇。

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

推荐阅读更多精彩内容

  • 砸壳 软件脱壳,顾名思义,就是对软件加壳的逆操作,把软件上存在的壳去掉(解密)。 砸壳原理 应用加壳(加密)提交给...
    looha阅读 1,287评论 0 2
  • 砸壳原理 砸壳顾名思义就是对软件进行逆向操作,对已加密的软件进行解密,从而获取真实软件源码。App Store下载...
    Hanfank阅读 19,131评论 7 12
  • 概述 软件脱壳,顾名思义,就是对软件加壳的逆操作,把软件上存在的壳去掉(解密)。 砸壳原理 应用加壳(加密)提交给...
    没八阿哥的程序阅读 7,058评论 0 2
  • 技 术 文 章 / 超 人 App Store上的应用都使用了FairPlay DRM数字版权加密保护技术Fair...
    树下敲代码的超人阅读 20,400评论 21 55
  • 逆向工程的目的 1)分析竞品的最新研究或者产品原型(包括所用的技术,所使用的框架)2)学术/学习目的。3)破解应用...
    90后的思维阅读 6,930评论 3 14