App Security And CodeConfuse (app 安全和代码混淆的demo的手把手教你的详细教程)
##📣本文内容
- 一)为什么要进行代码混淆
- 二)代码混淆的两种方法(①宏替换 ②脚本实现替换)本文github地址,敬请star
- 三)代码混淆参考的博客及说明
#📣1)为什么要进行代码混淆?
iOS 的任何app都可以使用classdump对原程序进行dump,可以dump出所有源程序的函数所有信息:源程序所有函数类型,变量全部泄露。这样的话,让攻击者,也就是黑客们了解了程序结构方便逆向。因为在工程中,我们这些变量或函数命名都是有一定可读性的,例如跟用户名相关的,那一般里面会有 userName,跟密码相关的一般会有 passWord,这样定义也是为了我们自己代码可读性更强,我们修改的时候才更加的方便。但是我们相信,这么个定义法,我们只是希望方便我们自己,我们可不希望方便黑客们去破解我们的APP。 如果我们把自己的程序打包为ipa 使用class-dump ,dump出程序的所有头文件可以看到所有的头文件,打开头文件就可以看到所有的变量和函数了:


也许你会问,对微信和支付宝看看他们的头文件可不可以呢?当然也是可以的,具体怎么做 参考我的这篇博客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文件的过程如下图所示
查看导出的头文件
- (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 到你的项目工程路径下:


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


添加进去了:


#ifdef __OBJC__ #import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
//添加混淆作用的头文件(这个文件名是脚本confuse.sh中定义的)
#import "codeObfuscation.h" #endif
写到这里,编译的时候是不是发现报错啦?刚才的 .pch 文件里面的添加的代码居然报错了:



2:配置好 Run Script








#import "codeObfuscation.h"**最好对自己混淆的代码 打包成ipa进行dump,查看你混淆的头文件的函数名是不是随机的字符串了.
##📣github地址和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等部分内容作了更多说明,站在别人的肩膀上一步步的优化完善的哈,才出来了本文!





