iOS代码混淆

最近在做银行的项目,所以对安全性要求很高。这不安全检测没过??,这里面的问题就提到了代码混淆问题

准备工作

  1. cd到你自己的项目目录级这里写图片描述
  2. 创建confuse.sh(confuse.sh里面的代码贴在了最下方这里需要先把下方的内容复制进来)文件和func.list文件这里写图片描述
  3. 选中项目选择运行脚本。这里需要注意的是$PROJECT_DIR/confuse.sh这个的路径和创建pch文件时的路径是一样的,$PROJECT_DIR代表整个工程,/confuse.sh是这个文件的路径。 这里写图片描述
  4. 然后command + B编译一下,如果报错了就cd到项目的目录级下,然后输入命令行 chmod 755 confuse.shchmod 777 confuse.sh 给我们的脚本本间授权这里写图片描述
  5. 成功之后会自动生成一个codeObfuscation.h文件,注意:如果没有生成也可以自己创建一个空白的.h文件这里写图片描述
  6. 然后在pch文件中导入codeObfuscation.h文件。这里写图片描述

重点来了

  1. 全局混淆。如果我们之前没有考虑到混淆的问题现在用全局混淆并不明智,因为有的时候方法名的命名并不是那么规范,这里我们全局混淆以sk_开头的方法名,如果不想做特定的限制的话可以把|sed -n "/^sk_/p"这里给删除掉,我们来看下效果:这里写图片描述这里写图片描述这里写图片描述
  2. 局部混淆。可以在func.list文件中手动添加方法。编译之后就可以了这里写图片描述

    重中之重confuse.sh里的内容

#!/usr/bin/env bash

TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="$PROJECT_DIR/func.list"
HEAD_FILE="$PROJECT_DIR/codeObfuscation.h"
####这里是全局混淆要查找的内容路径,不需要全局混淆的时候要注释掉
#CONFUSE_FILE="$PROJECT_DIR/MobileOA"
export LC_CTYPE=C
####这里是全局混淆要查找的条件,不需要全局混淆的时候要注释掉
#取以.m或.h结尾的文件以+号或-号开头的行 |去掉所有+号或-号|用空格代替符号|n个空格跟着<号 替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list
## |sed -n "/^sk_/p" 是特定问方法名的开头,不需要的话可以删掉
#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 "/^sk_/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
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

传送门DEMO

猜你喜欢

转载自blog.csdn.net/shutongit/article/details/80886573