从头学习OC代码逆向和保护(更新ing)

2018-04-09  本文已影响78人  杨闯

dump

作用

导出头文件

下载地址

http://stevenygard.com/projects/class-dump/

安装方式

把dmg打开,把文件class-dump放到/usr/local/bin目录下,就完成安装

使用

1、因为下载下来的iOS安装包一般都是ipa文件,但是dump的需要是app文件,所以需要将ipa文件转换为app文件,通过右击ipa文件,通过归档实用工具的方式提取出来app文件。
2、执行dump

class-dump -S -s -H app文件路径 -o dump出的头文件路径
结果

头文件都大白于天下了

混淆部分头文件

方案一 手动

1、创建脚本文件 confuse.sh,具体文件内容见下

#!/usr/bin/env bash

TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/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

在这里,会生成一个sqlite数据库文件,但是如果不想保存数据库文件的话,将脚本改写成

STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/codeObfuscation.h"
export LC_CTYPE=C

ramdomString()
{
openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
}

rm -f $HEAD_FILE

touch $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
echo "#define $line $ramdom" >> $HEAD_FILE
fi
done
echo "#endif" >> $HEAD_FILE

2、将混淆脚本confuse.sh放到工程目录下
3、在工程对应的pch文件中添加混淆作用的头文件(这个文件名是脚本confuse.sh中定义的)

    #import "codeObfuscation.h"  

4、配置Build Phase
在工程Build Phase中添加执行脚本操作

$PROJECT_DIR/confuse.sh

5、创建函数名列表func.list,写入待混淆的函数名,如:
-(void)sample;
-(void)seg1:(NSString *)string seg2:(NSUInteger)num;

就这样写:
sample
seg1
seg2

6、并将文件放置于与confuse.sh脚本同级
mv func.list your_proj_path/

5.编译查看结果
直接build,混淆脚本会在编译前运行,进行字符随机替换,并且每次build的随机字符不同

如果在debug过程中,不需要进行混淆
直接在工程中将codeObfuscation.h文件移除即可
该方式实现了对部分指定字符串进行了混淆,实现很容易,并且可以通过codeObfuscation.h查看混淆前和混淆后的字符串的对比,可以根据文件进行崩溃时的相关问题的查找

如果一些代码是被pod进来的,那么不要对这些文件的方法名称进行混淆,要不就会引起崩溃

方案二、Camo全自动混淆

下载地址:http://yonsm.net/camo/

方案三、SMC(self modifying code),不能上线App Store

Hopper

下载地址:https://www.hopperapp.com

参考文章

上一篇下一篇

猜你喜欢

热点阅读