ITPub博客

首页 > 应用开发 > IT综合 > 谈谈代码混淆

谈谈代码混淆

原创 IT综合 作者:AI脑力波 时间:2019-01-23 16:55:32 0 删除 编辑

1.为什么要进行代码混淆?

iOS的任何APP都可以使用class-dump对原程序进行dump,可以dump出所有源程序的函数所有信息:源程序所有函数类型,变量全部泄露。还有利用Hopper分析我们的代码逻辑结果,这样的话,让攻击者,也就是黑客们了解了程序结构方便逆向。因为在工程中,我们这些变量或函数命名都是有一定可读性的,例如跟用户名相关的,那一般里面会有 userName,跟密码相关的一般会有passWord,这样定义也是为了我们自己代码可读性更强,我们修改的时候才更加的方便。这么个定义法,我们只是希望方便我们自己。如何防止核心的代码被别Hook呢,就用到了代码混淆。

 

2.混淆思路

1)程序中添加迷惑性代码

这种方式可以达到混淆的效果,但是负面影响也比较大,使得程序的可读性变成差,可维护性变低,自己维护还好,如果交接项目,后来人员维护总会吐槽一番,头大…😰还有一点就是加入许多无用代码,无疑会增加安装的体积,虽然不会增加很大,但是如果APP优化之后刚好超出苹果允许数据下载的范围,那就尴尬了!

2)Objective-C的方法名混淆

方法名混淆是目前比较好的方案,可以保留清晰的程序代码,在不改变代码清晰的基础上,进行打到混淆的目的,加大对源程序class-dump分析的难度。可以利用程序运行环境来控制是否进行混淆,代码结构基本不变,维护人员也不会为冗余的代码苦恼,接下来我们就了解下class-dump 和方法名混淆的具体过程。

3)class-dump

class-dump is a command-line utility for examining the Objective-Csegment of Mach-O files. It generates declarations for the classes, categoriesand protocols. This is the same information provided by using 'otool -ov', butpresented as normal Objective-C declarations.

这是class-dump的官方解释,我们用的最多就是做iOS的逆向工程。class-dump,是可以把Objective-C运行时的声明的信息导出来的工具。其实就是可以导出.h文件。用class-dump可以把未经加密的app的头文件导出来。class-dump是一个可以导入其他应用头文件的工具,算是逆向工程中一个入门级的工具

链接地址和下载地址:https://github.com/wg689/Security-And-CodeConfuse

简单使用: 使用class-dump导出其他应用头文件

 

  • /user/bin下面添加class-dump 但是实际上/user/bin 在最新的系统下面是没有读写权限的,你可以添加class-dump 到/user/local/bin 下面执行命令:sudo chmod 777/usr/bin/class-dump这样就可以在终端使用 class-dump 命令

  • 终端输入以下命

class-dump -H /Applications/Xcode.app -o/Users/apple/Desktop/heads

/Applications/Xcode.app 这一段的意思是你程序的路径(显示包内容)

/Users/apple/Desktop/heads 这一段是导出头文件存放的路径(这个随意放)

a.使用classdump导出某工程的头文件

                      

可以根据头文件猜出该文件的具体功能,从而进一步分析

b.代码没混淆反编译结果.h.m文件中函数

4)代码混淆的方法

步骤
1. 在工程中添加func.list和confuse.sh两个文件,confuse.sh是混淆相关的脚本,func.list是需要混淆的方法列表。文件名字随便起,不过最后要在工程的pch中导入一下。

自动混淆,方法名字不能一个一个的添加到func.list中,所以方法名只能从.m和.h文件中抽取了,但是如何屏蔽系统的方法名,暂行的策略是:将自己定义的方法名全部添加一个前缀。

例: ayh_configUserAgent 、ayh_login、ayh_mainDelegate…

可以使用脚本进行代码混淆,减少工作量, confuse.sh脚本如下

#!/bin/bash

# 这是Shell脚本,如果不懂shell,自行修炼:http://www.runoob.com/linux/linux-shell.html

# 以下使用sqlite3进行增加数据,如果不了解sqlite3命令,自行修炼:http://www.runoob.com/sqlite/sqlite-tutorial.html

#数据表名

TABLENAME=symbols

#数据库名

SYMBOL_DB_FILE="symbols"

#要被替换的方法列表文件

STRING_SYMBOL_FILE="$PROJECT_DIR/HSKConfuse/Resource/func.list"

#脚本

CONFUSE_FILE="$PROJECT_DIR/Confuse.sh"

HEAD_FILE="$PROJECT_DIR/Confuse/Resource/codeObfuscation.h"

export LC_CTYPE=C

#取以.m或.h结尾的文件以+号或-号开头的行 |去掉所有+号或-号|用空格代替符号|n个空格跟着<号替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list

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"/^hsk_/p" >$STRING_SYMBOL_FILE

#维护数据库方便日后做bug排查

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

}

#生成随机16位名称

randomString()

{

openssl rand -base64 64 | tr -cd'a-zA-Z' | head -c 16

}

#删除旧数据库文件

rm -f $SYMBOL_DB_FILE

#删除就宏定义文件

rm -f $HEAD_FILE

#创建数据表

createTable

#touch命令创建空文件,根据指定的路径

touch $HEAD_FILE

echo '#ifndef CodeObfuscation_h

#define CodeObfuscation_h'>> $HEAD_FILE

echo "//confuse string at`date`" >> $HEAD_FILE

#使用cat将方法列表文件里的内容全部读取出来,形成数组,然后逐行读取,并进行替换

cat "$STRING_SYMBOL_FILE"| while read -ra line;

do

if [[ ! -z "$line" ]]

then

random=`randomString`

echo $line $random

#将生成的随机字符串插入到表格中

insertValue $line $random

#将生成的字符串写入到宏定义文件中,变量是$HEAD_FILE

echo "#define $line$random" >> $HEAD_FILE

fi

done

echo "#endif" >>$HEAD_FILE

sqlite3 $SYMBOL_DB_FILE .dump

在Xcode-->Target--->BuildPhases--->添加Run Script

 

接下来看一下我声明方法名的地方,已经变成了下面的样式

然后使用再使用class_dump获取程序的头文件

接下来再看经过混淆的方法名,相信已经很难从这个方法中读到信息了。

注: 工程中有许多方法名可能是相同的, 在执行方法的时候,可能因通过混淆过的方法,找到不同的方法实现,导致报错,目前的方案是通过类名给方法添加前缀。从而保证每个方法都是唯一的

使用代码混淆有很大概率被苹果发放2.1大礼包,被拒了需要向苹果审核团队说明混淆代码作用,可能会通过审核

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69901781/viewspace-2564585/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: AI新资讯
请登录后发表评论 登录
全部评论

注册时间:2018-12-07

  • 博文量
    7
  • 访问量
    8353