背景:

最近做APP备案,需要对项目做一系列对优化改进,其中就包括了代码混淆,顾名思义,混淆是为了代码安全,是为了增加逆向破解的难度与复杂度。

目前市面上,免费和付费都有,一些公司对APP加固已经做成了产业,形成了一整套的解决方案,不过收费也是杠杠的,我也联系了其中一家,收费大概是【一年】【单APP】价格是2W(多APP价格可以再商量,应该会便宜点吧),当然这是他们号称的整个加固策略解决方案的价格。

说明:

不过呢,因为一些原因,我就暂时从开源的一些免费方案寻找解决处理,而且我们目前只是针对代码混淆安全性上的需求,所以就有了本篇文章。

进行了一些调研之后,我发现其实很多项目的早期混淆,大多是基于念茜大大的思路做的延伸扩展,基本思路为下:

写一个脚本,将项目中的一些敏感方法名集中写在一个名叫func.list的文件中,逐一#define成随机字符

原文地址:https://blog.csdn.net/yiyaaixuexi/article/details/29201699  有兴趣可以看一下

用这种方式,需要新建两个文件,一个混淆脚本,一个fun函数列表,用于添加你所需要混淆的方法,然后在Build Phases里添加执行Run Script

因为她这篇文章写的比较早,后面也有很多朋友对此基础上,做了一些优化更新,基本网上也都能搜到,甚至有些朋友直接做成了mac工具,直接拖动项目路径,配置一下前缀等关键词,就能一键混淆。

比如:iOS_NQConfuseTool ,不过这个工具填的参数比较多,出了问题就容易不响应了,囧,可以了解下,不是特别推荐

正文:

其实最开始我想象中的方案,是不用通过前缀来判别的,因为我想,对老项目太不友好了,还得针对类名、方法名一大堆慢慢加前缀什么的,工作量太大了,因此,我就在想,有没有更好的只能混淆方案呢?

结果是还真被我找到了,就是我的理解力不够,最终还是没能实现,且听我说完。

这个工具就是:swiftshield

在发现这个工具时,我就在想,太好了,这个牛逼啊,功能强大,使用简单

不过我按照他的描述配置后,发现没起作用,在终端运行后,会提示我swiftshield没找到,目前暂还没找到解决方案,因此有搞定的朋友千万记得给我留个言,在线等。。。

不过即使生活qj了你,你还得过日子啊,此路不通,换条路继续,只不过路没这么好走罢了

我重新找到了一个方案,虽然不是智能一键混淆,但操作起来还是相对比较便捷的

思路:也是通过脚本实现前缀识别替换。

这个方案操作起来大概分以下几个步骤:

1、创建一个空 confuseAndBuild.sh文件,拖动到项目根目录(名字自己取)

2、将下面的脚本拷贝进去,注意:脚本的前缀是需要配置的,改成你自己的就行,脚本默认是"hunxiao_"

这是脚本!!!

#!/bin/bash

#  confuseAndBuild.sh
# ConfuseSwift
# # ⚠️声明
# . 请将该脚本放在Xcode的Project工程的根目录。
# . 当前版本未配置完整Xcode环境变量,仅支持混淆功能,不支持framework编译,若需编译请用Xcode运行该脚本。 # ⚠️教程
# https://www.jianshu.com/p/be751f780d94
# 直接在终端cd到confuseAndBuild.sh上一层目录,然后运行./confuseAndBuild.sh -c 即可 if [ -z "$PROJECT_NAME" ]; then
CONFUSE_DIR="."
else
CONFUSE_DIR="${SRCROOT}/${PROJECT_NAME}"
fi # ⚠️自己配置自己的前缀
CONFUSE_PREFIX="hunxiao_" BACKUP_FILE=".backup.log"
SYMBOL_FILE=".symbol.log"
CONFUSE_FILE=".confuse.log"
CONFUSE_FLAG=".confuseFlag" SOURCE_ARRAY=( "*.swift"
"*.m"
"*.h"
"*.c"
"*.cpp")
BACKUP_EXTENSION=".bak" # 格式:echo -e "\033[背景色;前景色m 打印的字符串 \033[0m"
# 颜色:重置=,黑色=,红色=,绿色=,黄色=,蓝色=,洋红=,青色=,白色=。
# 示例:echo -e “\[30m 我是黑色字 \[0m”
# 参考:https://www.cnblogs.com/xiansong1005/p/7221316.html
# https://www.cnblogs.com/lr-ting/archive/2013/02/28/2936792.html
info() {
local green="\033[1;32m"
local normal="\033[0m"
echo -e "[${green}info${normal}] $1"
} error() {
local red="\033[1;31m"
local normal="\033[0m"
echo -e "[${red}error${normal}] $1"
} # 生成随机字符串 16字
randomString() {
openssl rand -base64 | tr -cd 'a-zA-Z' | head -c
} # 获取符号的随机字符串 $1是符号名
randomStringWithSymbol() {
grep -w $ $SYMBOL_FILE -h | cut -d \ -f
} removeIfExist() {
if [ -f $ ]; then
rm $
fi
} # 备份文件 $:file full path
backupFile() {
file=$
# 在原文件名前加个.(点符合)用作备份名
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
} # 方案1. 精确备份:用关键字遍历会修改到的source文件,再将其备份 -- 消耗性能
# 方案2. 整体备份:备份所有source文件 -- 消耗存储空间
# 根据需要,为简单起见,这里选用方案2
backupAllSource() {
info "backup all swift files"
NAMES="-name \"${SOURCE_ARRAY[0]}\""
i=
while [ $i -lt ${#SOURCE_ARRAY[@]} ]; do
NAMES+=" -or -name \"${SOURCE_ARRAY[$i]}\""
let i++
done
# echo $NAMES removeIfExist $BACKUP_FILE
touch $BACKUP_FILE eval "find $CONFUSE_DIR $NAMES" | while read file; do
backupFile $file
done
} # 混淆工作, ⚠️该函数不会自动备份,要备份请调用safeConfuse函数
confuseOnly() {
info "confuse start..." # 获取要混淆的函数名和变量名
INCLUDES="--include=\"${SOURCE_ARRAY[0]}\""
i=
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 # cat $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 $SYMBOL_FILE # 读取备份文件记录
# 在这里没使用遍历批量替换,怕文件太多的时候影响性能
cat $CONFUSE_FILE | while read line; do
# echo "> $line"
# 截取行号
lineNum=`echo $line | sed 's/.*:\([0-9]*\):.*/\1/g'`
# 截取文件路径
path=${line%%:*} # 一行可能有多个要替换的子串,要循环遍历完
# 这里之所以要用`sort -r`倒序是因为有个bug:如有字符串"jjyy abc hello abcde", 现在要替换"abc"为""(abcde保持不变),也就是传说中的‘全匹配替换’,
# 但不知为何在macOS下单词边界表达式不起作用:\<abc\> 或者 \babc\b都不起作用,Linux下这个正则表达式是没问题的。
# 倒序之后有长串优先替换长串,防止短串把长串部分替换掉。但依然存在bug:若是长串不需要替换,则短串替换是依然会将长串部分替换

Swift之代码混淆的调研实施小记的更多相关文章

  1. C/C++代码静态分析工具调研

    C/C++代码静态分析工具调研 摘自:https://www.jianshu.com/p/92886d979401 简述 静态分析(static analysis)是指在不执行代码的情况下对其进行分析 ...

  2. 【Android】Android Studio 进行代码混淆,打包release APK

    整了一天,感觉坑挺多. 1. 选择如图中的选项Android Studio进行签名打包: 2. 填写APP对应的信息:(最好用个文本记下来放在项目中同步给Team) - Key store path: ...

  3. ProGuard代码混淆技术详解

    前言     受<APP研发录>启发,里面讲到一名Android程序员,在工作一段时间后,会感觉到迷茫,想进阶的话接下去是看Android系统源码呢,还是每天继续做应用,毕竟每天都是画UI ...

  4. Android Studio代码混淆插件

    之前给公司的App添加代码混淆,在代码的混淆过程也遇到了不少的问题,再加上最近学习了一下Android Studio插件的开发,所以就开发一个代码混淆插件方便项目的代码混淆. 截图 第三方库列表清单 ...

  5. 77.Android之代码混淆

    转载:http://www.jianshu.com/p/7436a1a32891 简介 作为Android开发者,如果你不想开源你的应用,那么在应用发布前,就需要对代码进行混淆处理,从而让我们代码即使 ...

  6. Android 代码混淆、第三方平台加固加密、渠道分发 完整教程(图文)

    第一步:代码混淆(注意引入的第三方jar) 在新版本的ADT创建项目时,混码的文件不再是proguard.cfg,而是project.properties和proguard-project.txt. ...

  7. 推荐一个C#代码混淆器 .NET Reactor【转】

    C#的代码辛苦写出来之后,一个反射工具,就可以完全显露出来. 当然,在做项目时,这个功能还不错.因为我就曾在一个项目上使用C#,没有进行任何混淆.结果在项目二年多之后,需要做一些调整,自己保存的源代码 ...

  8. Android代码混淆官方实现方法

    首先查看一下 “project.properties” 这个文件: # This file is automatically generated by Android Tools.# Do not m ...

  9. android 常用第三方包的代码混淆

    首先在:project.properties 文件下,启动代码混淆 proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:pro ...

随机推荐

  1. Ubuntu 14.04 使用ntfs-config解决开机自动挂载NTFS分区的方法

    先安装: sudo apt-get install ntfs-3g ntfs-config 再配置一下: sudo ntfs-config 然后就会弹出来一个对话框,选择你需要挂载的分区,点应用,再选 ...

  2. PHP调用纯真IP数据库返回具体地址

    function convertip($ip) { $ip1num = 0; $ip2num = 0; $ipAddr1 =""; $ipAddr2 =""; ...

  3. window10+python3.7安装tensorflow--gpu tensorflow 安装

    能安装GPU的前提是:1.显卡支持CUDA (1)右击我的电脑–属性 (2)打开设备管理器   (3)显示适配器 我的电脑是支持CUDA的 2.pip 版本 >= 8.1查看pip版本 :pip ...

  4. java final域

    public final class ThreeStooges { /* * stooges是Set<String>类型的引用,final限定该引用成员属性stooges被赋初值后,就不能 ...

  5. word 筛选过的网页,网页,单个文件网页

    1)筛选过的网页:保存后会生成 xxx.htm和xxx.files文件夹,删除了还原成Word文档所需的格式标记和功能,也就是说存为纯网页了,文件尺寸小:2)网页:保存后会生成 xxx.htm和xxx ...

  6. Python--day32--struct模块

    struct模块:该模块可以把一个类型,如数字,转成固定长度的bytes

  7. Spring Data -Specification用法和常用查询方法(in,join,equal等)

    Spring Data -Specification用法和常用查询方法(in,join,equal等) 前言 入门例子 Repository层常用写法 Specification 的用法 总结 前言 ...

  8. css3颜色+透明度渐变

    .linear { width: 630px; height: 120px; line-height: 150px; text-align: center; font-size: 26px; posi ...

  9. H3C重启设备

  10. 2018.12.7 浪在ACM 集训队第八次测试赛

    2018.12.7 浪在ACM 集训队第八次测试赛  https://blog.csdn.net/QLU_minoz/article/details/84886717   感谢苗学林同学C题和D题题解 ...