app 安全(一): 代码混淆防止反编译查看真实的头文件函数声明

📣本文内容

  • 一)为什么要进行代码混淆
  • 二)代码混淆的两种方法(①宏替换 ②脚本实现替换)本文github地址,敬请star
  • 三)代码混淆参考的博客及说明

📣1)为什么要进行代码混淆?

iOS 的任何app都可以使用classdump对原程序进行dump,可以dump出所有源程序的函数所有信息:源程序所有函数类型,变量全部泄露。这样的话,让攻击者,也就是黑客们了解了程序结构方便逆向。因为在工程中,我们这些变量或函数命名都是有一定可读性的,例如跟用户名相关的,那一般里面会有 userName,跟密码相关的一般会有 passWord,这样定义也是为了我们自己代码可读性更强,我们修改的时候才更加的方便。但是我们相信,这么个定义法,我们只是希望方便我们自己,我们可不希望方便黑客们去破解我们的APP。
如果我们把自己的程序打包为ipa 使用class-dump ,dump出程序的所有头文件可以看到所有的头文件,打开头文件就可以看到所有的变量和函数了:

执行dump

代码没混淆反编译结果,.h文件中函数如下图所示


代码没混淆的反编译结果

代码混淆反编译结果,.h文件中函数如下图所示


代码混淆后的反编译结果

也许你会问,对微信和支付宝看看他们的头文件可不可以呢?当然也是可以的,具体怎么做 参考我的这篇博客iOS 逆向导出app的头文件(逆向工程书籍补充),当然你也可以找更好的博客,看看微信的iOS开发人员函数命名是否规范,我看过,少数也是不规范的,大部分还是比较规范的!
为了阻止别人使用逆向工程修改我们的代码需要做反编译,微信的代码很多是没有反编译的。反向工程会带来许多问题,诸如知识产权泄露,程序弱点暴露易受攻击等。
很多人实现 企业微信签到反编译, 用Hopper搞定Mac迅雷的会员以及离线下载功能等等逆向工程的文章,这些逆向之所以成功,是因为这些微信和迅雷的实现这些功能的核心代码没有进行代码混淆,如果进行了代码混淆,即使逆向了,找不到实现功能的函数,无法修改这些函数,就无法实现用Hopper搞定Mac迅雷的会员以及离线下载功能了。
为什么做混淆 ?还有更重要的原因:某一天某安全公司给你发一份安全测试报告,你的代码没做混淆(当然不只这一个风险),存在安全风险,boss 听说有风险肯定让你解决这个问题啊,我们公司就是这样的情况,我才做的的代码混淆的!!
如何进行代码混淆,经过我查阅资料,发现有两种方法,一种简单较low,一种复杂点档次高点!下面介绍代码混淆的两种方法

📣2代码混淆的两种方法

2.1简单的宏替换(很简单也有一点点low)

2.1.1

打开项目新建ConfuseReplace.h 文件,把需要替换的函数名使用#define就可以(本方法其实可以用这一句就可以说完的)

#ifndef ConfuseReplace_h
#define ConfuseReplace_h]

#define sample        XZwTFgszVxFieZta
#define seg1        mviuwjseJZYYamwu
#define zheshi     uNCrcYEobhpPGLuf
#define xxxxxx     achfhhffhhfh

#endif /* ConfuseReplace_h */

2.1.2

controller.h文件中

@interface ViewController : UIViewController

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

- (void)xxxxxx;

@end

controller.m文件中

-(void)sample{  
}

-(void)seg1:(NSString *)string seg2:(NSUInteger)num{
}
-(void)zheshi:(NSString *)string seg2:(NSUInteger)num{
   
}
- (void)xxxxxx{ 
}

上面已经搞定了代码混淆,就是这么简单.每个函数名的串都是宏定义好的,也许有人会问,人家拿到了ConfuseReplace.h文件,那这么替换岂不是白搭,人家知道那个函数名和那个字符串对应啊,经笔者亲自验证,宏定义的字符串使用class-dump 是dump 不出来的,所以我们就放心的用

我们使用代码混淆让别人使用class-dump 反编译出我们的方法名是乱码,达到混淆的目的,混淆之后黑客使用class-dump 出你的头文件不知道你这个函数是做什么,就不能修改你的功能 ,使用这种混淆方法class-dump 后的头文件如下,
使用class-dump需要先安装class-dump,如何安装class-dump见这篇文章iOS逆向工程-----class-dump,有如何安装class-dump和使用class-dump
导出.h文件的过程如下图所示

导出头文件替换的方式.gif

查看导出的头文件

导出的头文件查看.gif
- (void)XZwTFgszVxFieZta;
- (void)achfhhffhhfh;
- (void)didReceiveMemoryWarning;
- (void)mviuwjseJZYYamwu:(id)arg1 seg2:(unsigned long long)arg2;
- (void)uNCrcYEobhpPGLuf:(id)arg1 seg2:(unsigned long long)arg2;

这种方法的demo见我的github中的confuseDemo这个文件夹.其实说这么多大家看一下Demo秒懂,唯一的难点是需要学习下class-dump导出头文件来验证是否混淆成功!教程都给你链接了,学不学就看你啦!

2.2使用脚本替换方法名(很简单也有一点点low)

第一、新建一个工程,在工程项目路径中建立一个confuse.sh、一个func.list文件先打开终端,然后 cd 到你的项目工程路径下:


cd 到项目工程路径下然后创建两个文件,一个 confuse.sh,一个 func.list:

注意点,不按照下面两个操作,运行脚本会报错:
目录结构不要错

层级目录不要错

创建两个文件这时候我们打开这个工程文件夹,可以看到,这两个文件已经创建好了:



我们创建的两个文件打开工程,把刚才创建的两个文件加进去,右键你的项目蓝色标志,然后选择 Add Files to...:


添加到工程中

添加进去了:


成功添加点击 confuse.sh(confuse.sh,和func.list必须添加到NSUTest目录下)发现还是空白的,什么都没有,现在要在这上面加上代码了:

需要添加的代码原脚本代码出自:http://blog.csdn.net/yiyaaixuexi/article/details/29201699
第二、在 .pch 文件中添加代码不要跟我说你的工程没有 .pch 文件,如果真没有,自行百度,这应该算是标配,常识来的。

#ifdef __OBJC__  #import <UIKit/UIKit.h> 
 #import <Foundation/Foundation.h>  
//添加混淆作用的头文件(这个文件名是脚本confuse.sh中定义的) 
 #import "codeObfuscation.h" #endif

写到这里,编译的时候是不是发现报错啦?刚才的 .pch 文件里面的添加的代码居然报错了:



报错了!不要慌,先把那句报错的先给注释掉:



先注释掉报错的这一行代码然后我们继续往下走!
第三、配置 Build Phase1:添加 Run Script

添加 Run Script

2:配置好 Run Script


配置好 Run Script然后再回到终端,同样先 cd 到工程目录下,接着我们要打开刚才 .sh 这个脚本文件的运行权限,因为默认是没有这个权限的,在终端输入以下指令:

打开运行权限回车,搞定,回到我们的工程,先 command + b 编译一下工程,然后再把我们刚刚注释掉的那句代码解开:

打开刚刚被我们注释掉的代码再次 command + b 编译,现在是不是编译通过啦?刚刚报错的,现在解决了!
基本上就搞定了,剩下的就是添加上我们想要混淆的变量名或函数名
第四、在 func.list 文件里,写入待混淆的函数名如果像下面这几个属性跟函数:

需要混淆的属性跟函数名那么就这在 fun.list 就这么列出来就好了:

列出需要混淆的,大功告成!现在 command + b 运行一下,然后在哪里看结果呢,请看这里:

运行结果可能这么看有点麻烦,那来个简单一点的:

查看哈哈,你会发现,多了好多宏定义,其实就是我们刚才的字段来的:

结果当然,这也只是最简单的代码混淆而已,APP安全还是有很多需要注意的。一步一步来吧!
最后需要说明,出现下图所示的这里并不一定说明代码混淆成功,只能说明你的脚本运行成功,.pch文件中一定要导入#import "codeObfuscation.h"最好对自己混淆的代码 打包成ipa进行dump,查看你混淆的头文件的函数名是不是随机的字符串了.
Snip20160816_11.png

📣github地址和Demo中的各个文件夹用途说明

demo文件目录

对上图中的各个文件夹说明如下:

  • class dump header of confuseDemo:
    里面放的是对confuseDemo(进行了混淆)打包为ipa,再执行class-dump,dump 出来的所有的头文件
  • class dump header of Demo2 confuse success
    里面放的是对Demo2(进行了混淆)打包为ipa,再执行class-dump,dump 出来的所有的头文件
  • class dump header of Demo2 not confuse success
    里面放的是对Demo2(没有进行混淆)打包为ipa,再执行class-dump,dump 出来的所有的头文件
  • confuseDemo
    使用宏定义替换的demo,直接参考,移植到自己的工程就行
  • confuseDemo ipa
    对confuseDemo 打包为ipa了,你可以使用里面的confuseDemo.app文件进行class-dump
  • Demo2
    使用脚本进行代码混淆的demo ,你可以参考,移植到自己的工程中

本文github地址,敬请star!

本文参考博客:

念茜女神的代码混淆博客脚本是她提供的
iOS 对源代码进行混淆本文的部分内容在这篇的基础上更改的,原文只有一种方法,我这里提供了两种,原文没Demo,我提供了两种方法的Demo,对Class-dump等部分内容作了更多说明,站在别人的肩膀上一步步的优化完善的哈,才出来了本文!

📣appstore审核问答群:369250107,建了个仓库:,github专门解决苹果拒绝各种问题汇总的仓库


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

推荐阅读更多精彩内容