[iOS]代码混淆

news2025/7/18 23:40:22

混淆有几点注意:

不能混淆系统方法

不能混淆init开头的等初始化方法

混淆属性时需要额外注意set方法

如果xib、 storyboard中用到了混淆的内容,需要手动修正。

可以考虑把需要混淆的符号都加上前缀,跟系统自带的符号进行区分。

混淆有风险,有可能会被App Store以2.1大礼包拒掉,需要说明用途。

Swift项目代码混淆

1. 新建confuse.sh文件

终端cd到项目,新建文件。

$ cd /Users/gamin/Desktop/hdj-ios
$ touch confuse.sh

2. 编辑指令文件

打开confuse.sh文件,写入以下文本。这里指令设置的是去项目中混淆前缀为“HD”的属性和方法。

#要混淆前缀
CONFUSE_PREFIX="HD"

# 格式:"\033[字背景颜色; 字体颜色m 将要设置的字符串 \033[0m"

# 字体颜色: 30 --- 37
# 30: 黑
# 31: 红
# 32: 绿
# 33: 黄
# 34: 蓝色
# 35: 紫色
# 36: 深绿
# 37: 白色

# 字体背景颜色: 40 --- 47
# 40: 黑
# 41: 深红
# 42: 绿
# 43: 黄色
# 44: 蓝色
# 45: 紫色
# 46: 深绿
# 47: 白色

# 字体加亮颜色: 90 --- 97
# 90: 黑
# 91: 红
# 92: 绿
# 93: 黄
# 94: 蓝色
# 95: 紫色
# 96: 深绿
# 97: 白色

# 背景加亮颜色范围: 100 --- 107
# 100: 黑
# 101: 深红
# 102: 绿
# 103: 黄色
# 104: 蓝色
# 105: 紫色
# 106: 深绿
# 107: 白色

# \33[0m 关闭所有属性
# \33[1m 设置高亮度
# \33[4m 下划线
# \33[5m 闪烁
# \33[7m 反显
# \33[8m 消隐
# \33[30m -- \33[37m 设置前景色
# \33[40m -- \33[47m 设置背景色
# \33[nA 光标上移n行
# \33[nB 光标下移n行
# \33[nC 光标右移n行
# \33[nD 光标左移n行
# \33[y;xH设置光标位置
# \33[2J 清屏
# \33[K 清除从光标到行尾的内容
# \33[s 保存光标位置
# \33[u 恢复光标位置
# \33[?25l 隐藏光标
# \33[?25h 显示光标
# \x1b[2J\x1b[$;1H    $表示行位


# 参数选项
options() {
    echo "\033[0;31m"
    echo "参数: [-u, -c]"
    echo "  -u 清理混淆回到未混淆的时候"
    echo "  -c 去混淆 备份 混淆"
    echo "\033[0m"
}

# 配置info
info() {
    local green="\033[1;32m"
    local normal="\033[0m"
    echo "[${green}info${normal}] $1"
}

#要混淆前缀
CONFUSE_PREFIX="HD"

#混淆标记文件
CONFUSE_FLAG=".confuseFlag"

#恢复回混淆前文件
BACKUP_FILE=".backup.log"

#象征文件
SYMBOL_FILE=".symbol.log"

# 混淆文件
CONFUSE_FILE=".confuse.log"

#删除存在的文件
removeIfExist(){
    if [ -f $1 ]; then
        rm $1
    fi
}

# 备份文件
backupFile() {
    file=$1
    # 在原文件名前加个. (点符合)用作备份名
    fileName=${file##*/}
    backupPath=${file/$fileName/.$fileName$BACKUP_EXTENSION}
    echo "backup $file to $backupPath"

    if [ ! -f $backupPath ]; then
        cp $file $backupPath
        echo $backupPath >>$BACKUP_FILE
    fi
}

SOURCE_ARRAY=("*.swift"
              "*.m"
              "*.h"
              "*.c"
              "*.cpp")

BACKUP_EXTENSION=".bak"

# 随机生成字符串
randomString() {
    openssl rand -base64 64 | tr -cd 'a-zA-Z' | head -c 16
}

# 获取符号随机字符串
randomStringWithSymbol() {
    grep -w $1 $SYMBOL_FILE -h | cut -d \  -f 2
}

if [ -z "$PROJECT_NAME" ]; then
    CONFUSE_DIR="."
else
    CONFUSE_DIR="${SRCROOT}/${PROJECT_NAME}"
fi

main() {
    
    case $1 in

        "-u")
        echo "清理混淆回到未混淆的时候"
        unconfuse
        ;;

        "-c")
        echo "去混淆 备份 混淆"
        safeConfuse
        ;;

        *)
            echo "请添加您要选择的参数选项"
            options
        ;;

    esac
}

# 清理,去混淆
unconfuse() {

    info "混淆清理中..."
    if [ -f $CONFUSE_FLAG ]; then
        #恢复混淆的函数名所在Source文件bak内容
        cat $BACKUP_FILE | while read backup; do
            backupName=${backup##*/}
            fileName=`echo $backupName | cut -d "." -f2,3`
            filePath=${backup/$backupName/$fileName}

            echo "recover $backup to $filePath"
            cp $backup $filePath
            rm $backup
        done

        # 删除修改记录
        removeIfExist $SYMBOL_FILE
        removeIfExist $CONFUSE_FILE
        removeIfExist $BACKUP_FILE
        removeIfExist $CONFUSE_FLAG
    else
        echo "没有混淆!!!"
    fi
    info "混淆清理完成"
}

#检查上次是否未完成
precheck() {
    # 创建一个隐藏文件,标记混淆编译状态
    # 由于编译过程中可能被中断,因此混淆后的代码可能未恢复,在开始备份前先做判断
    unconfuse
    touch $CONFUSE_FLAG
}

# 备份所有source文件
backupAllSource() {
    info "备份所有Swift文件"
    NAMES="-name \"${SOURCE_ARRAY[0]}\""
    I=1
    while [ $i -lt ${#SOURCE_ARRAY[@]} ]; do
        NAMES+=" -or -name \"${SOURCE_ARRAY[$i]}\""
        let I++
    done

    removeIfExist $BACKUP_FILE
    touch $BACKUP_FILE

    eval "find $CONFUSE_DIR $NAMES" | while read file; do
        backupFile $file
    done
}

# 真正开始混淆工作
confuseOnly() {
    info "开始混淆中..."

    # 获取要混淆的函数名和变量名
    INCLUDES="--include=\"${SOURCE_ARRAY[0]}\""
    I=1
    while [ $i -lt ${#SOURCE_ARRAY[@]} ]; do
        INCLUDES+=" --include=\"${SOURCE_ARRAY[$i]}\""
        let I++
    done

    eval "grep $CONFUSE_PREFIX -r $CONFUSE_DIR $INCLUDES -n" >$CONFUSE_FILE
    # 绑定随机字符串
    removeIfExist $SYMBOL_FILE
    touch $SYMBOL_FILE

    cat $CONFUSE_FILE | egrep -w $CONFUSE_PREFIX"[0-9a-zA-Z_]*" -o | sort | uniq | while read line; do
        echo $line" `randomString`" >>$SYMBOL_FILE
    done

    #读取备份文件记录
    cat $CONFUSE_FILE | while read line; do
        
        # 截取行号
        lineNum=`echo $line | sed 's/.*:\([0-9]*\):.*/\1/g'`

        # 截取文件路径
        path=${line%%:*}

        echo $line | egrep -w $CONFUSE_PREFIX"[0-9a-zA-Z_]*" -o | sort -r | while read -ra symbol; do
            # 根据名称获取绑定的随机字符串
            random=`randomStringWithSymbol $symbol`

            sed -i "" "${lineNum}s/$symbol/$random/g" $path
            echo " $symbol => $random"
        done
    done

    info "混淆完成"
}

# 去混淆,备份,混淆
safeConfuse() {
    precheck
    backupAllSource
    confuseOnly
}

main $@

3. 去混淆

终端执行.sh脚本。-u 清理混淆回到未混淆的时候,-c 去混淆 备份 混淆。

 

 4. 不足之处

脚本有一些bug,无法完美匹配混淆,会有漏网之鱼。另外,无法混淆目录中的文件名称,需要花大量时间去人工排错。

OC项目代码混淆

1. 新建confuse.shfunc.list文件

终端cd到项目,新建文件。

$ cd /Users/gamin/Desktop/hdj-ios
$ touch confuse.sh
$ touch func.list

2. 编辑指令文件

打开confuse.sh文件,写入以下文本。

#!/usr/bin/env bash

TABLENAME=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
createTable

touch $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; 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

3. 修改指令文件的权限 

终端cd到项目,修改文件权限。

$ cd /Users/gamin/Desktop/hdj-ios
$ chmod 755 confuse.sh

4. 将文件导入项目根目录

 5. 配置RunScript

到TARGETS -> Build Phases点击“+”新建Run Script

在Run Script输入文本

$PROJECT_DIR/confuse.sh

6. 创建和配置pch文件

新建PrefixHeader.pch文件

 Build Settings中配置Prefix Header,并将Precompile Prefix Header设置为YES。

$(SRCROOT)/hdjlm/PrefixHeader.pch

打开pch文件,引入codeObfuscation.h文件。

#import "codeObfuscation.h"

 

7. 添加需要混淆的方法

打开func.list文件,在文件内输入需要进行混淆的属性名称和方法名称。

sourceImgView
resultImagView
colorAtPixel
testAction
testOneAction
gaminName
SelectColorViewController
GGTest

8. 运行项目

混淆成功后,代码中对应的字符串会改变颜色,点击Jump to Definition会跳转到codeObfuscation.h文件。

 

 9. 使用class-dump分析Mach-O文件

项目被逆向时,被混淆的类名和方法名变成了混乱的字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MMEdu离线版的使用:实现石头剪刀布图像分类的检测

一、MMEdu离线版的使用 1.双击XEdu v1.0.exe解压缩到某个盘,会是一个文件夹XEdu 2.进入XEdu,双击运行“点我初始化.bat”,等待至运行结束命令提示符窗口自动关闭 3.双击运行“jupyter编辑器.bat”,将会打开一个网页版jupyter&…

记一次由于google新版本限制升级导致的跨域问题

记一次跨域问题 问题描述 系统集成到公司下面的门户网站,由于二级域名还没有申请下来只能先配置了我们的K8S域名 http://wire-qa.motortest.com/#/Data/systemNavigationK8s域名 http://wire-test.k8s-pv.motor.com/sce_web/index.html前端识别到跳转的如下地址后…

微服务介绍2

1 搭建项目 1.1 父项目的搭建 1.2 子项目的搭建 2 项目展示 1 搭建项目 1.1 父项目的搭建 步骤: 1 选择maven项目作为父项目,修改为1.8之后直接点击next 2 定义父项目的名称,修改Artifct Coordinates ---> GroupId 然后点击finsh就可以啦…

K8S部署后的使用:dashboard启动、使用+docker镜像拉取、容器部署

1、重置和清除旧工程:每个节点主机都要运行 kubeadm reset iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X 2、部署新的k8s项目: 只在主节点运行,apiserver-advertise-address填写主…

(附源码)计算机毕业设计JavaJava毕设项目美容院管理系统

项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven Vue 等等组成,B/…

HDC 2022 开发者主题演讲与技术分论坛干货分享(附课件)

11月4日-11月6日,HDC 2022在东莞成功举办,这是一场大规模落地的思维与技术的碰撞,众多业内专家到场,共话未来。其中,开发者主题演讲围绕增强的声明式开发体系,通过一个Demo实例讲解技术创新点,助…

LEADTOOLS 入门教程: 使用文件观察器转换文件 - C# .NET Core

LEADTOOLS 是一个综合工具包的集合,用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中,是一项企业级文档自动化解决方案,有捕捉,OCR,OMR,表单识别和处理&#…

PyQt5 QTableWidget

PyQt5 QTableWidgetQTableWidget 示例1QTableWidget 示例2QTableWidget 示例3QTableWidget 示例4QTableWidget 示例5QTableWidget 示例6QTableWidget 示例1 演示QTableWidget控件的基本使用方法 import sys from PyQt5.QtWidgets import (QWidget, QTableWidget, QTableWidge…

The Seven Tools of Causal Inference with Reflections on Machine Learning 文章解读

目录 THE THREE LAYER CAUSAL HIERARCHY. 4 THE SEVEN TOOLS OF CAUSAL INFERENCE (OR WHAT YOU CAN DO WITH A CAUSAL MODEL THAT YOU COULD NOT DO WITHOUT?) 7 Tool 1: Encoding Causal Assumptions – Transparency and Testability. 10 Tool 2: Do-calculus and the …

CentOS 7:dmPython安装及测试连接达梦数据库

python下载地址:Python Source Releases | Python.org 查看数据库服务 dmPython 安装 cd /home/dmdba/dmdbms/drivers/python/dmPython python setup.py install [rootlocalhost dmPython]# python setup.py install running install running bdist_egg running e…

通过Python Pandas分析数据上涨下跌趋势的方法:求离散数据的差分、导数

在实际工作中,我们经常需要分析一组数据的历史走势/趋势情况,比如要从产品数据库中筛选出销量处于上升趋势的产品,或者从股票历史数据库中筛选出一直处于上涨的股票。 那么可以通过分析计算该组数据的差分来模拟求出该组数据走势线的导数&…

Kubernetes CKA 模拟题解析【2022最新版】(连载001)

练习准备 这是 Kubernetes CKA 认证的模拟考试,大家不要错过哦。 在模拟考试开始之前建议您先设置一下以下命令: $ alias kkubectl $ export do"--dry-runclient -o yaml" # like short for dry output. use whatever you like 设置代码补…

Lumion和Enscape渲染器有什么区别?哪个适合你

提到“傻瓜式渲染器”,你的脑子里最先闪过哪个软件名?当一溜子软件名在脑袋里飞快跳转的时候,有没有发现现在很多软件都被打上“傻瓜式渲染器”的标签?那今天咱们就先聊一聊Lumion和Enscape这两个知名软件。 01、软件介绍 Lumio…

DOTA-PEG-麦芽糖 maltose-DOTA 麦芽糖-四氮杂环十二烷四乙酸

DOTA-PEG-麦芽糖 maltose-DOTA 麦芽糖-四氮杂环十二烷四乙酸 PEG接枝修饰麦芽糖,麦芽糖-聚乙二醇-四氮杂环十二烷四乙酸,DOTA-PEG-麦芽糖 中文名称:麦芽糖-四氮杂环十二烷四乙酸 英文名称:maltose-DOTA 别称:DOTA修…

浏览器渲染原理-通俗易懂版本

文章目录浏览器渲染原理前言1. 网页的解析过程2. 浏览器的功能与组成2.1 浏览器内核2.2 进程与线程3. 浏览器渲染流程3.1 渲染引擎解析过程3.2 渲染引擎主要模块4. 渲染页面的详细流程4.1 HTML 解析过程4.2 生成 CSS 规则4.3 构建 Render Tree4.4 布局 (layout) 和绘制 (Paint)…

外观专利怎么申请?

问题一:什么是外观专利? 外观专利跟实用新型专利和发明专利有所不同。实用新型和发明主要保护的技术方案或者方法,配方。而外观专利保护的产品的形状、图案或其结合以及色彩富有美感,并且适用于工业应用的新设计。比如某企业推出…

华为“仓颉”不是中文编程,中文编程早有所属,势如破竹

“中国自己的编程语言究竟在哪里?”关心IT生态的我们,经常深思与担忧。 语言是文化精髓所在,一方水土养一方人,不管是中文,还是英语,作为交流工具,语言烙印着不同地方的生活场景,一方…

[附源码]计算机毕业设计JAVA企业公开招聘系统

[附源码]计算机毕业设计JAVA企业公开招聘系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

Mybatis-plus通过exists判断记录是否存在

Mybatis-plus通过exists判断记录是否存在一、Controller二、Service三、效果一、Controller GetMapping("/queryNewProductExists")public Boolean queryNewProductExists(RequestParam("name") String name) {return opProductService.queryNewProductExi…

开源游戏服务器框架NoahGameFrame(NF)客户端的Log日志系统(五)

一、调用输出日志方法所在的脚本介绍 需要打印日志到文件或者Unity的Console控制台中,就可以调用NFLogModule.cs这个脚本中的方法。由于这个脚本中的方法数量太多,我就不一一介绍了,有需要的可以自己看下具体的实现过程。下面篇幅介绍中作者…