iOS安全/代码混淆

APP 一般经常做的网络参数加密解密,加密方法有base64、MD5、AES、RSA、DES等加密方法、这些加密一般都是给数据进行加密、防止数据外漏。但是今天我要介绍的是防范反汇编风险,防止咋们APP的代码让别人反编译,不过Apple还算安全反编译过来也只能看到.h文件。不过为了安全起见我们还是将代码进行混淆,这样比较安全些。

一、先介绍下反编译工具 class-dump 的使用
class-dump 的安装这里就先不介绍了、可以参考网上资料。class-dump的使用很简单(默认你已经安装class-dump),现将ipa后缀改为zip:

屏幕快照 2017-12-19 16.11.40.png
51DF8F1A-DA17-47C6-A0AD-E55ACFE29202.png
7E47CACC-2A7D-481D-B50C-B19F010746DB.png
EDE1D3A5-5893-4644-988C-18AF455E70C3.png

这里的ipa包不可以是AppStore上下载的、因为AppStore上下载的ipa包、Apple是又经过加密的、需要自己破壳,想知道怎么给AppStore下载的ipa进行破壳,看iOS应用逆向工程。
将zip解压、得到app二进制文件,下面就使用class-dump将app进行反编译:打开Terminal:输入命令 class-dump -H app二进制文件路径 -o 反编译后.h文件的存放路径

97087D05-DA9C-450B-8522-E361EF61C035.png

回车后就得到了反编译的.h文件

3AF106BD-50B9-42C5-A1BA-DE0A0F9CAFA1.png

class-dump 功能很强大,只是在终端输入一行命令,就可以反编译app的二进制文件,得到所有.h 文件。以下就是为了防止反编译,通过分下.h文件,对咋们的app进行一些操作(外挂就是这么来的),所以要将我们.h文件中的代码进行混淆,即使反编译得到.h文件,也很难分析。

二、将代码进行混淆

1.在项目根目录下新建confuse.sh 和 gbFunc.list 文件

说明:
confuse.sh 文件在编译过程中会执行gbFunc.list 用于自动混淆代码时,存放过滤出来需要混淆的方法名

touch confuse.sh
touch gbFunc.list

4FB867FF-E1C9-4C25-95C1-5476C609F618.png

2.新建PFConfuse.h

说明:

GBConfuse.h 是在自动混淆代码时,将会把自动生成的字符串定义成宏,存放在此文件,也便于查看。

D714AA6F-B08E-4E30-A40F-A4C611660CB6.png

注意:需要把.h文件移到项目文件外,因为放项目文件中,到时被反编译过来,还是能得到GBConfuse.h里面的东西的,就能通过比对,得到方法。(后面用class-dump反编译过来就明白了...)

940FC2F1-1058-4DDA-A011-369C827623D1.png

3.在confuse.sh中添加如下代码、(先看下效果、代码在下面)


E06A974A-B8EF-41EB-9563-2164A9CA26CD.png

48E68609-8BF7-4CD0-A3FA-38AABB43C326.png

AE50DA1D-09B8-4123-9ACB-4EDB15EDC095.png

下面是要复制代码:

!/usr/bin/env bash

TABLENAME=symbols

SYMBOL_DB_FILE="symbols"

func.list路径

STRING_SYMBOL_FILE="$PROJECT_DIR/GBFunc.list"

项目文件路径

CONFUSE_FILE="$PROJECT_DIR/SafetyTest"

Confuse.h路径

HEAD_FILE="$PROJECT_DIR/PFConfuse.h"

export LC_CTYPE=C

取以.m或.h结尾的文件以+号或-号开头的行 |去掉所有+号或-号|用空格代替符号|n个空格跟着<号 替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list

grep -h -r -I "^[-+]" $CONFUSE_FILE --include '.[mh]' |sed "s/[+-]//g"|sed "s/[();,: ^/{]/ /g"|sed "s/[ ]</</"| sed "/^[ ]IBAction/d"|awk '{split($0,b," "); print b[2]; }'| sort|uniq |sed "/^$/d"|sed -n "/^PFSAFE_/p" >$STRING_SYMBOL_FILE

维护数据库方便日后作排重,以下代码来自念茜的微博

createTable()
{
echo "create table $TABLENAME(src text, des text);" | sqlite3 $SYMBOL_DB_FILE

}

insertValue()

{
echo "insert into $TABLENAME values('$1' ,'$2');" | sqlite3 $SYMBOL_DB_FILE

}

query()

{

echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE

}

ramdomString()

{

openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
}

rm -f $SYMBOL_DB_FILE

rm -f $HEAD_FILE

createTable

touch $HEAD_FILE

这里也要做修改

echo '#ifndef PFConfuse_h

define CodeConfuse' >> $HEAD_FILE

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

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

if [[ ! -z "$line" ]]; then

ramdom=ramdomString

echo $line $ramdom

insertValue $line $ramdom

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

fi

done

echo "#endif" >> $HEAD_FILE

sqlite3 $SYMBOL_DB_FILE .dump

需要修改的代码在于文件路径:

83B95390-DB79-4D48-988E-EE3809B5CA1C.png
2743BBF1-615D-4D9C-888C-26A4989F81BC.png

4.添加 Run Script

屏幕快照 2017-12-19 17.27.51.png
屏幕快照 2017-12-19 17.29.10.png

5.添加 PCH 文件


EF1595F9-8343-4C84-ABE7-C09AFB92D6E4.png
7EE419AF-E74F-4673-AA8A-FF739CD38F3E.png

引用.h文件

90029585-213D-49F0-BE92-AE0B6FBAFD45.png

6.添加以 "PFSAFE_"为前缀的方法(以PFSAFE_为前缀的方法就是要混淆代码的方法)

A4FFA574-1491-49E2-A1A6-843CB8D44B21.png

7.进行测试

运行报错如下:
原因是.sh文件没有权限,所以需要去开启权限。

39A47956-00DB-4289-A688-C8C3CDA79752.png

解决方法:运行终端,在confuse.sh文件目录下,执行命令:

chmod 755 confuse.sh

CB77D889-C66C-4F81-9D0C-7A1A9F7852E6.png

再运行项目即可成功运行

现不进行混淆代码,打包一个.ipa包进行测试


6D9BD6D6-1994-4FEC-B8E6-4EB9EC367A34.png
428EE5B5-10E8-4BB4-A44E-11689F986A06.png

使用class-dump(以上步骤"一",介绍内容):看看咋们反编译后得到的文件

613EE025-CBFD-46F0-9348-6E6FC8A15EB5.png

再看看ViewController.h文件:


DC73ABD0-4871-4A16-9B1D-1F99958D0938.png

自己写的方法通过反编译完全暴露、别人就可以通过判断这些方法干什么用的,再将app注入自己写的dylib动态库,对app干点别的事情,这也是外挂的实现原理。

再将混淆过的代码,打包一个.ipa进行测试:


9519365B-2B18-4B46-AA94-087D9DC74F27.png
2FAD71F0-6F87-4243-B955-D7196B5EEB26.png
F3D2D5D0-BED7-4FAB-BC97-AFD1EE9E8BE9.png

同上,使用 class-dump 将 app 二进制文件进行反编译:


AADC793D-8FCE-48CB-9E4E-7D5E00370657.png
2C8F402D-7339-4B2C-93E6-9CCAC65BC3FD.png
66059500-31E9-4ACD-9562-1A53B39B2AC2.png

总结:通过.sh 脚本文件,将个别方法以随机生成字符串的形式,将方法混淆,以至于反编译后无法判断该方法的作用,而达到 APP 更安全。

特别注意(以上、"二"中的2步):将 PFConfuse.h 移动到项目外,别放到项目中,因为放到项目中,到时候被反编译也可得到,那就通过对比 PFConfuse.h 中的内容,判断出方法。

三、参考文章
1、 iOS开发/App安全/代码自动混淆笔记
2、 iOS自动代码混淆
3、 念茜/Objective-C代码混淆
3、 class-dump最新安装方法

如对iOS应用逆向工程感兴趣,可以参考以下文章:
1、一步一步实现iOS微信自动抢红包(非越狱)
2、iOS 逆向 - 微信 helloWorld

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容