iOS 安全探索:字符串加密

前言

一个项目中的明文字符串不计其数,但是有一些是程序的敏感信息的话如果不进行加密和混淆处理,反编译者就会很容易找到我们的敏感信息。拿到这些敏感信息之后就很容易分析我们的程序,业务逻辑进而做一些可能对我们不是很友好的事情,所以一些敏感明文字符串还是有必要做一下加密,让敏感信息更加安全。特别是对于我们金融类的APP开发。

反编译工具

这里介绍几个常用的:

(1)class-dump

主要用来反编译一个库文件或者app的方法名、属性等声明(即.h文件,强大的是反编译出来的.h不仅仅包含头文件中的声明,.m中的function方法名称也同样能够反编译出来)。

(2)IDA

主要用来反编译库文件的实现(当然方法声明同样能够反编译出来,用class-dump主要是更加形象,有针对性),这个反编译工具非常强大能够将函数的实现及逻辑关系、流程统统显示出来,弊端就是反编译出来的内容为汇编语言,需要一定汇编基础的才能看懂。看起来比较头疼。

(3)Hopper Disassembler

与IDA功能相似,主要功能都是反编译查看方法的实现,这个软件的功能相对于IDA来说,可读性要强很多,反编译出来的内容类似于汇编与OC的运行时的结合体,相对比较容易看出方法的具体实现。本次也是采用此工具进行验证。

代码混淆

在探索明文字符串加密之前先来了解一下代码混淆:

  1. 方法名混淆(对关键的类、方法,命名成与真实意图无关的名称)
  • 创建shell脚本
  • 声明要替换的方法名列表
  • 生成对应的转义之后的无序字符串
  1. 逻辑混淆(添加无用又不影响逻辑的代码片段,迷糊逆向人员)
  2. 类名方法名混淆(例如:ios-class-guard

Warning!!! 前方高能

Guideline 2.3.1 - Performance
We discovered that your app contains hidden features. Specifically, It would be appropriate to remove all code obfuscation and selector mangling or to explain in detail the purpose of its inclusion before resubmitting for review.

据说从17年开始苹果拒审代码混淆的APP。所以项目整体代码的混淆目前感觉意义不大。

第三方加固

第三方的服务(例如:网易云易盾)这类的加固成效如何不太清楚,这里拿出来给个参考,毕竟没用过,可能是否选用要看公司的决策了。

iOS应用加固

第三方明确说明了加固中使用了代码混淆,不知道是使用什么黑科技混淆的,肯定不是跑脚本的方式,好奇宝宝可以研究一下~~

字符串加密调研和尝试

对于被砸壳的二进制文件,逆向分析人员分析代码有一条重要线索,也就是被硬编码的明文字符串。比如说,你的 app 被人抓包了,某些数据请求接口也被人发现了,那么很简单,逆向人员可以直接拷贝特征比较明显的字符串到 hopper 中搜索,通过查看该字符串被引用的地方,可以很快的找到相应的逻辑代码。对于这一步的防范,需要做的就是对硬编码的明文进行加密。

使用静态内连 C 函数
  • inline函数避免了普通函数的,在汇编时必须调用call的缺点。
  • 取消了函数的参数压栈,减少了调用的开销,提高效率。所以执行速度确比一般函数的执行速度要快。

定义:

UIKIT_STATIC_INLINE NSString *testScheme() {
    return @"testtesttesttest";
}

static inline NSString * testName() {
    return @"test";
}

使用:

@"appId": testRrd(),
@"scheme" : testScheme()

结果:

使用静态内联函数加密后反编译

很明显明文字符串还是很容易暴露出来~~
方案PASS!

Swift 安全性更高
  • 越狱开源社区对反编译 Swift 的支持也不是很即时。
  • 一些反编译工具并不支持反编译含有 Swift 的二进制文件(例如:class-dump)。
  • 能够反编译 Swift 的工具也表现出 Swift 更安全的一面。

我对同样逻辑的同样代码(只是语法不同)的 OC 和 Swift 方法(方法中包含明文字符串)进行了测试:

OC 反编译结果
Swift 反编译结果

上面对比明显可以看出 OC 经过反编译之后暴露出来的信息更能多,并且明文字符串显而易见。
但是如果 Swift 方法添加了对 OC 的支持(@objc)也会使安全性降低。

@objc Swift 方法

现阶段 Swift 相对 OC 来说更安全一些,等 Swift 日趋稳定,以及越狱开源社区的逐渐支持,可能这一点优势可能就不明显了。

UAObfuscatedString

有个开源代码可以用,UAObfuscatedString,这个开源混淆代码写出来的字符串是以点语法的方式连接起来。

语法:

@"url" : NSMutableString.string.w.w.w.dot.b.a.i.d.u.dot.c.o.m

测试混淆结果:

使用 UAObfuscatedString 后反编译

UAObfuscatedString 是通过 Category 和 Extension 来实现这种点语法拼接字符串,存在比较明显的规律,外加它是开源的可能安全性不是很高,如单从加密的角度去使用这个开源库感觉意义不大。

使用异或加密

原理:通过位运算的 ^ 异或运算符把字符串与一个指定的值进行运算,从而改变字符串中每个字符的值,这样就可以得到一个加密后的字符串;当把加密后的字符串作为程序输入内容后,异或运算会把加密后的字符串还原为原有字符串的值。

使用:

@"key" : testMethod()
// Key 可以是0~255的Int
#define XORKEY 0xC9

static void XOREncrypt(unsigned char *str, unsigned char key) {
    unsigned char *p = str;
    while (((*p) ^= key) != '\0') {
        p++;
    }
}

static id testMethod(void) {
    unsigned char str[] = {(XORKEY ^ 'e'), (XORKEY ^ 'n'), (XORKEY ^ 'c'), (XORKEY ^ 'r'),
        (XORKEY ^ 'y'), (XORKEY ^ 'p'), (XORKEY ^ 't'), (XORKEY ^ '\0')};
    XOREncrypt(str, XORKEY);
    static unsigned char result[7];
    memcpy(result, str, 7);
    return [[NSString alloc] initWithFormat:@"%s", result];
}

使用异或加密后反编译

这里将字符用函数指针成员的形式存储,反编译后,只留下了地址,去掉了明文字符串直接暴露的风险。

参考链接

https://www.hopperapp.com

iOS安全攻防(二十三):Objective-C代码混淆

ios-class-guard

UAObfuscatedString

https://nianxi.net

https://danleechina.github.io/ios-app-security-reinforce/

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

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,092评论 1 32
  • 读书笔记|《我的价值观》潘石屹著 作者简介潘石屹,SOHO中国有限公司董事长、联合创始人。一位被看作当今中国最活跃...
    燕平说阅读 188评论 0 1
  • 上一章 K城 甜成和甜小磊在家中将与甜心糕点所有业务往来的大小企业,包括这几年被解雇的人都查了一遍,甜小苼所有的同...
    九仙月阅读 255评论 0 1
  • 当下中国有三种人:官人、学人、农人。新教育如果只有官人和学人,永远不能成功,新教育需要农人,需要把两条腿深...
    吕寨小学李帅洛阅读 201评论 0 0
  • 前几天看到一个街访,就是调查女生会不会跟一个没车没房的人结婚,让我颇有感触。街访中的很多女生都会讲不会跟...
    颜潇晨阅读 480评论 0 0