文章目录

  • 自己创建脚本文件进行代码混淆
  • iOS代码自动混淆
  • 最近公司扫描App漏洞,提出要给App做代码混淆加固,以提高反编译逆向难度。对于Android应用直接用360安全加固即可;但对于iOS应用,虽然360也提供了免费的加固方法,但前提是项目的enable bitcode必须设置为YES。但我们项目中引入的很多框架包括百度地图等并不支持enable bitcode设置为YES。如果enable bitcode设置为NO,并且是本地部署的话(企业证书),360安全加固iOS是收费的,收费标准是30万/年。其他的一些平台也是收费的。所以只能考虑自己去做了。
  • 360 iOS加固指南

自己创建脚本文件进行代码混淆

  • 混淆原理 : 代码编译阶段将符号(方法名、属性名等)替换成随机生成的字符串
  • 我们需要创建四个文件如下:

    其中PrefixHeader.pch宏文件中导入CodeObfuscation.h,这样项目在编译的时候就会将CodeObfuscation.h中定义的宏及方法名替换为对应随机生成的字符串。
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
#import "CodeObfuscation.h"
#endif /* PrefixHeader_pch */

其中confuse.sh脚本文件是最重要的,是用来在程序编译的时候将func.list中的方法名替换成随机生成的字符串,并且保存在CodeObfuscation.h中。其脚本为:

TABLENAME=symbols
SYMBOL_DB_FILE="$PROJECT_DIR/CodeObfuscation/symbols"
STRING_SYMBOL_FILE="$PROJECT_DIR/CodeObfuscation/func.list"
HEAD_FILE="$PROJECT_DIR/CodeObfuscation/CodeObfuscation.h"
export LC_CTYPE=C#维护数据库方便日后作排重
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
createTabletouch $HEAD_FILE
echo '#ifndef CodeObfuscation_h
#define CodeObfuscation_h' >> $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

func.list文件就是用来存放要被混淆的方法和属性名的。如:

CodeObfuscation.h本身是一个空头文件,在编译过后会生成func.list添加属性和方法对应生成的随机字符串。下图是编译后CodeObfuscation.h的内容:

示例:

#import "ViewController.h"
#import "NSArray+Extension.h"@interface ViewController ()
@property (nonatomic, copy) NSString *title1;
@property (nonatomic, copy) NSString *imgsrc;
@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.title1 = @"";self.imgsrc = @"";NSLog(@"%@",[NSArray getPropertiesFromClass:[self class]]);NSLog(@"%@",[NSArray getMethodsFromClass:[self class]]);
}
- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}- (void) test{}
- (void) test1{}
- (void) test2{}
- (void) test3{}
- (void) test4{}@end

打印出运行时的属性和方法名:

结果可见,CodeObfuscation.h中的生成的随机字符串和真正打印出来的并不一致,这是因为每次运行时,CodeObfuscation.h都会重新生成新的随机字符串,这时替换属性和方法名的是上一次生成的随机字符串。

  • 注意事项:

    1. 属性方法名需要去重。
    2. 代码混淆后不能再上架appstore。
    3. 代码混淆不能对静态库进行混淆。
    4. 系统自带的属性和方法不能混淆,只能混淆自定义的方法和属性。
  • 具体步骤可参考:iOS代码混淆教程

iOS代码自动混淆

  • 上面的方法会有有一些问题,就是每次创建了新的属性和方法都得添加到func.list文件中,比较繁琐,不利于维护。其实我们可以让方法属性自动添加func.list中。所以我们要从.m和.h文件中抽取属性和方法了,但是如何屏蔽系统的属性和方法名,所以我们要将自己定义的属性和方法名全部添加一个前缀。
  • confuse.sh中添加新的脚本,修改后的脚本如下:
TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="$PROJECT_DIR/AutoScript/func.list"
CONFUSE_FILE="$PROJECT_DIR/AutoCodeConfusion"
HEAD_FILE="$PROJECT_DIR/AutoScript/AutocodeObfuscation.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 "/^hj_/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
createTabletouch $HEAD_FILE
echo '#ifndef AutocodeObfuscation_h
#define AutocodeObfuscation_h' >> $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


添加了收集方法的脚本后,我们不需要再手动的去添加方法到func.list中了。程序编译后会自动将hj_开头的方法添加到func.list中。

  • 参考文档:
    iOS代码混淆教程
    iOS代码混淆----自动

  • 相关demo:iOS代码混淆(手动和自动)

iOS代码混淆安全加固相关推荐

  1. ios APP加密探究几维安全iOS 代码混淆效果参考

    几维安全ios代码混淆效果参考: 什么是加密 加密是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作.大多数病毒就是基于此原理. 加密作用 加壳的程序可以有效阻止对程序 ...

  2. APP加密,ios代码混淆工具,虚拟化技术 适用于移动应用程序的虚拟化加密软件

    概述: KiwiVM是用于移动应用程序的虚拟化加密软件. 它基于Clang编译器扩展,并且在编译项目时虚拟化指定的函数.借助自定义CPU指令的功能,一旦对代码进行加密并且从未解密,攻击者将无法恢复代码 ...

  3. ios代码混淆小工具

    一  绪言 写在前面的话:之前做了五年ios开发,现在转了开发方向(数据科学/大数据),今天帮以前ios开发小组的同学,写了一个ios代码混淆小工具,下面介绍下. 这种方式不是最佳方案,更好的方案是c ...

  4. Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)

    前言 最近一直在看Python,也很喜欢Python的灵活性:今天主要想说的是iOS的代码混淆,为什么想做代码混淆?为了APP的安全,为了防止别人破壳轻易破解我们代码:还有就是做 马甲包 了,我们知道 ...

  5. iOS代码混淆的探索

    目的 为了进一步增加应用的安全性,防止我们的应用程序很容易的被攻击者分析.破解.重打包,提高攻击者逆向分析应用的难度 应用的加固方案 数据加密:静态字符串.本地存储和网络传输的加密 静态混淆:类名.方 ...

  6. iOS 代码混淆 垃圾代码

    app风靡的时代,总有一些奇葩的需求. 为了刷量,刷排名,制作壳包,为了通过苹果爸爸审核,想到代码混淆,垃圾代码等策略. 作为一名程序员,怎么办? 爬了一些文章博客.总的来说有一下几方面: 字符串加密 ...

  7. 【工具】iOS代码混淆工具-iOS源码混淆

    最新更新记录 V2.0.3(2022年12月11日)更新内容: 1.新增导入映射列表的逻辑: 2.优化修复其他混淆逻辑: 3.更新地址 - github 主要功能 ZFJObsLib是专业的iOS源码 ...

  8. iOS代码混淆原理初探

    我们在手游平台SDK的iOS版本中, 除了AppStore官方支付之外还集成了第三方支付(微信支付H5和支付宝支付H5版本). 如果用于企业签,不需要做处理,直接使用即可. 但是如果需要上架AppSt ...

  9. python混淆ios代码_XSDK——iOS代码混淆原理

    我们在XSDK的iOS版本中, 除了AppStore官方支付之外还集成了第三方支付(微信支付H5和支付宝支付H5版本). 如果用于企业签,不需要做处理,直接使用即可. 但是如果需要上架AppStore ...

最新文章

  1. Linux上重启服务的正确命令
  2. ml--分类与预测算法评价方法
  3. Centos安装图形化界面
  4. Jsp+Servlet+JavaBean经典MVC模式理解
  5. 天线的安装对通信效果有什么影响?
  6. WordPress5.7版本下载及更新内容
  7. 关于布隆过滤器的所有信息:利用Hash实现的索引方案
  8. python表格处理_python如何处理表格?
  9. python连接sql引用的第三方库_python连接sqlserver数据库操作
  10. Python数据可视化2.3 体育案例
  11. Evernote CEO给想做长久公司创业者的3个建议
  12. python写的代码怎么发给别人_用python 代码 怎么给别人发邮件的两种写法
  13. 立创开源|esp8266三路继电器
  14. 图像处理(一)图像灰度化的三种方式
  15. 单片机应用系统设计技术——单片机出租车计费器
  16. pcm5102a解码芯片音质评测_音乐更重要,iQOO Pro配备独立解码芯片,Hi-Fi音质更懂你...
  17. 虚拟机VM12磁盘扩容
  18. 量化交易学习(10)均线交叉策略
  19. 微信商户平台,开通企业付款到用户零钱功能
  20. Pantoea(泛菌属)——肠道内善恶兼备的神秘细菌

热门文章

  1. android camera 工作原理,Android Camera原理之openCamera模块(一)
  2. 计算机木材染色 配色技术的应用技术,人工林木材颜色怎么调配?木材电脑配色技术...
  3. 关于MOTOROLA O202C无线座机 来电响一声故障
  4. java每隔1分钟执行一次_启动系统定时器,每隔1分钟/指定时间执行任务 学习笔记...
  5. 关于Windows vivado综合卡死的问题
  6. IDEA入门教程----是时候舍弃Eclipse了
  7. 在matlab中使用spm8,[转载]在matlab中同时使用spm2,spm5,spm8
  8. 在线Excel框架——luckysheet
  9. bing词典案例分析
  10. Qno技术:支持网吧业务目标持续推进——FVR9000系列网吧解决方案(转)