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。

脚本如下:

#!/usr/bin/env bashTABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/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 Demo_codeObfuscation_h
#define Demo_codeObfuscation_h' >> $HEAD_FILE
echo "//confuse string at `date`" >> $HEAD_FILE
cat "$STRING_SYMBOL_FILE" | while read -ra line; doif [[ ! -z "$line" ]]; thenramdom=`ramdomString`echo $line $ramdominsertValue $line $ramdomecho "#define $line $ramdom" >> $HEAD_FILEfi
done
echo "#endif" >> $HEAD_FILEsqlite3 $SYMBOL_DB_FILE .dump

操作步骤

1.将混淆脚本confuse.sh放到工程目录下 
mv confuse.sh your_proj_path/

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

#ifdef __OBJC__#import <UIKit/UIKit.h>#import <Foundation/Foundation.h>//添加混淆作用的头文件(这个文件名是脚本confuse.sh中定义的)#import "codeObfuscation.h"
#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的随机字符不同,如图:

iOS安全攻防(二十三):Objective-C代码混淆相关推荐

  1. 读书笔记(二十三):代码整洁

    一.有意义的命名 1.名副其实 选个好名称要花时间,但省下来的时间比花掉的多.注意命名,一旦发现有更好的名称,就换掉旧的. 变量.函数或类的名称应该已经答复了所有的大问题,它该告诉你,它为什么会存在, ...

  2. IOS学习笔记二十三对象归档(NSKeyedArchiver、NSKeyedUnArchiver、NSCodeing)

    1.NSKeyedArchiver.NSKeyedUnArchiver 1).archiveRootObject:toFile 归档对象到这个路径文件 2).unarchiveObjectWithFi ...

  3. ios内购二次认证服务器代码

    <?php// 获取认证结果的状态值 function get_status($arr) {while(list($key, $value) = each($arr)) {if ($key == ...

  4. Android Studio 代码混淆(你真的会混淆吗)

    一.前言 今天要打包新产品,突然忘了混淆的参数是怎么写的了,虽然之前也混淆过,可是具体配置的参数代码有些记不起来了,因此决定花点时间写篇博客记录一下,方便以后查找和自己的记忆. 二.Android S ...

  5. iOS攻防 - (十三)基本工具的使用OpenSSH, iFile, MTerminal和syslogd

    iOS攻防 - (十三)基本工具的使用OpenSSH, usbmuxd, iFile, MTerminal和syslogd 1. OpenSSH OpenSSH是一个远程安全登录的工具 在Cydia里 ...

  6. Java代码设计模式讲解二十三种设计模式

    设计模式 文章目录 设计模式 一.创造型设计模式 1.1 单例模式 1.1.1 饿汉式单例模式 1.1.2 懒汉式单例模式 (1)线程不安全的情况 (2)线程安全的情况 1. 实例化的方法上加sync ...

  7. iOS 初探代码混淆(OC)

    前言 自己做iOS开发也有几年的时间了,平时做完项目基本就直接打包上传到Appstore上,然后做上架操作了.但是最近,客户方面提出了代码安全的要求.说是要做代码混淆,这方面的工作之前从来没有接触过. ...

  8. 二十三.基于机器学习的恶意请求识别及安全领域中的机器学习

    这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步.前文分享了Web渗透的第一步工作,涉及网站信息.域名信息.端口信息.敏感信息及指纹 ...

  9. iOS11开发教程(二十三)iOS11应用视图实现按钮的响应(3)

    iOS11开发教程(二十三)iOS11应用视图实现按钮的响应(3) 2.使用代码添加按钮实现的响应 使用代码添加的按钮,实现响应需要使用到addTarget(_:action:for:)方法,其语法形 ...

最新文章

  1. 探测服务器操作系统工具,探测服务器操作系统
  2. Delphi 调用webservice接口
  3. P3375 【模板】KMP字符串匹配 (KMP模板)
  4. too many connections 解决方法
  5. C# 获取属性的displayName
  6. pandas最大的时间间隔_pandas计算最大连续间隔的方法
  7. sklearn自学指南(part46)--新颖性和离群值检测方法概述
  8. Linux远程批量工具mooon_ssh和mooon_upload使用示例
  9. Fiddler 学习笔记
  10. 单链表的实现【数据结构】
  11. C++模板之一:函数模板.odt
  12. Cocos2d-x Tiled地图编辑器(一)基本使用
  13. 根据交换方式可以把交换机划分为3种:存储转发交换、直通式交换、碎片过滤式交换
  14. Linux -- 特殊权限 (转)
  15. 机器学习第六回(完结篇)
  16. UGUI ScrollRect使用
  17. 消息钩子函数入门篇(1)--基础知识
  18. JavaScript Backdoor
  19. 我的世界中国版服务器家园系统,《我的世界》中国版“暑期更新”上线 家园系统休闲玩法亮点...
  20. 粗略的学习一下结巴分词

热门文章

  1. Debian 官方下载地址
  2. 富途php面试经验,忍不住想吐槽一下富途二面体验
  3. switch语句总结
  4. pyspark 数据类型转换_PySpark之DataFrame的创建与转换
  5. C++解决:不存在从 “std::string” 到 “LPCWSTR” 的适当转换函数
  6. python预测糖尿病_使用决策树与随机深林预测糖尿病(python)
  7. Emacs Stardict
  8. 竞争情报分析工具Alexa
  9. 论文笔记_SIGGRAPH2019会前课程:An Introduction to Physics-Based Animation_3
  10. 【ESP32_8266_WiFi (十五)】ESP8266 OTA 操作说明