视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Objective-C代码混淆
2025-10-03 14:31:50 责编:小OO
文档
iOS安全攻防-Objective-C代码混淆

class-dump可以很方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完善的程序给同行留下笑柄。

所以,我们迫切的希望混淆自己的代码。

混淆的常规思路

混淆分许多思路,比如:

1)花代码花指令,即随意往程序中加入迷惑人的代码指令2)易读字符替换

等等

防止class-dump出可读信息的有效办法是易读字符替换。

Objective-C的方法名混淆

混淆的时机

我们希望在开发时一直保留清晰可读的程序代码,方便自己。同时,希望编译出来的二进制包含乱七八糟的混淆后的程序代码,恶心他人。

因此,我们可以在Build Phrase 中设定在编译之前进行方法名的字符串替换。

混淆的方法

方法名混淆其实就是字符串替换,有2个方法可以,一个是

#define,一个是利用tops。

利用#define的方法有一个好处,就是可以把混淆结果合并在一个.h中,在工程Prefix.pch的最前面#import这个.h。不导入也可以编译、导入则实现混淆。

单段的selector,如func: ,可以通过#define func 来实现字符串替换。

多段的selector,如a:b:c: ,可以通过分别#define a 、b、c 来实现字符串替换。

我的混淆工具

我写了个简易的混淆脚本,主要思路是把敏感方法名集中写在一个名叫func.list的文件中,逐一#define成随机字符,追加写入.h。

脚本如下:

1#!/usr/bin/env bash

2

3TABLENAME=symbols

4SYMBOL_DB_FILE="symbols"

5STRING_SYMBOL_FILE="func.list"

6HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h" 7export LC_CTYPE=C

8

9#维护数据库方便日后作排重

10createTable()

11{

12 echo "create table $TABLENAME(src text, des text);"

| sqlite3 $SYMBOL_DB_FILE

13}

14

15insertValue()

16{

17 echo "insert into $TABLENAME values('$1' ,'$2');" |

sqlite3 $SYMBOL_DB_FILE

18}

19

20query()21{

22 echo "select * from $TABLENAME where src='$1';" | sq

lite3 $SYMBOL_DB_FILE

23}

24

25ramdomString()

26{

27 openssl rand -­‐base | tr -­‐cd 'a-­‐zA-­‐Z' |head -­‐c 1

6

28}

29

30rm -­‐f $SYMBOL_DB_FILE

31rm -­‐f $HEAD_FILE

32createTable

33

34touch $HEAD_FILE

35echo '#ifndef Demo_codeObfuscation_h

36#define Demo_codeObfuscation_h' >> $HEAD_FILE

37echo "//confuse string at `date`" >> $HEAD_FILE

38cat "$STRING_SYMBOL_FILE" | while read -­‐ra line; do

39 if [[ ! -­‐z "$line" ]]; then

40 ramdom=`ramdomString`

41 echo $line $ramdom

42 insertValue $line $ramdom

43 echo "#define $line $ramdom" >> $HEAD_FILE

44 fi

45done

46echo "#endif" >> $HEAD_FILE

47

48

49sqlite3 $SYMBOL_DB_FILE .dump

操作步骤1.将混淆脚本confuse.sh放到工程目录下

mv confuse.sh your_proj_path/

2.修改Prefix.pch

打开Xcode,修改XXX-Prefix.ch ,添加混淆头文件:

1#ifdef __OBJC__

2 #import

3 #import

4 //添加混淆作用的头文件(这个文件名是脚本confuse.sh中定义的

5 #import "codeObfuscation.h"

6#endif

3.配置Build Phase

在工程Build Phase中添加执行脚本操作,执行confuse.sh脚本,如图:

4.创建函数名列表func.list,写入待混淆的函数名,如: -(void)sample;

-(void)seg1:(NSString *)string seg2:(NSUInteger)num;

就这样写:

sample

seg1

seg2

并将文件放置于与confuse.sh脚本同级

mv func.list your_proj_path/

5.编译查看结果

直接build,混淆脚本会在编译前运行,进行字符随机替换,并且每次build的随机字符不同,如图:

- 7 -下载本文

显示全文
专题