iOS代码混淆

代码易读字符串混淆

混淆分许多思路,比如:

1)花代码花指令,即随意往程序中加入迷惑人的代码指令

2)易读字符替换

防止class-dump出可读信息的有效办法是易读字符替换

1.首先切换到我们的项目目录下,我这里是统一放在了Resource文件夹中,创建两个文件(图1):

confuse.sh: 存放混淆的脚本

func.list:      需要混淆的方法、变量名

图1

此时在Resource文件夹中生成了以上两个文件,将其导入项目中:

然后打开confuse.sh文件,添加以下脚本(图2):

图2

#!/usr/bin/env bash

TABLENAME=symbols

SYMBOL_DB_FILE="symbols"

#LSJDemo切换为自己的项目名称

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

CONFUSE_FILE="$PROJECT_DIR/Demo"

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

exportLC_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/[ ]*$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 -base6464| tr -cd'a-zA-Z'|head -c16

}

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

2.配置Phases

    TARGETS ---> Build Phases ---> Run Script,如(图3):

图3

在里面添加 $PROJECT_DIR/Demo/Resource/confuse.sh ,这句命令的意思的应用每次启动的时候,都会先去跑我们confuse.sh 脚本

然后编译,发现报错,如(图4):

图4

解决方法:切换到工程目录下,输入命令行 chmod 755 confuse.sh 给我们的脚本本间授权,如(图5):

图5

此时,我们再编译一下项目,然后在工程目录下,我们会多出一个codeObfuscation.h文件,如(图6):

图6

这里面是用来装混淆前 —> 混淆后的代码对比

同样把这个文件拉到项目中,我们再建一个PCH文件来引入这个文件,那么整个项目都可以实现,宏的替换了。如(图7):

图7

然后打开PCH文件,导入头文件,如(图8):

图8

3.混淆的变量、方法名:

我想混淆以下变量、方法名,这里我想测试变量,把脚本文件中的必须是方法的限制去掉了,如(图9):

图9

那么打开 func.list 文件,一一把名称打进去,如(图10):

图10

然后点击编译,这样子我们需要混淆的代码就已经混淆成功了。但是也不会影响到我们的阅读。这里是通过宏定义来修改的,左侧是混淆前,右侧是混淆后,如(图11):

图11

注意:

1、 系统的方法

2、XIB中拖线的控件名

这些都不能用这个方法混淆,因为会导致运行的时候出错。

参考

念茜女神http://blog.csdn.net/yiyaaixuexi/article/details/29201699

附反编译:

1.1 Class-Dunp 简介

Class-Dump是一款可以导出头文件的命令行工具,改程序用于检查objective - c运行时信息存储在Mach-O文件,它生成类的声明,类别和协议。

1.2 Class-Dump 下载地址

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

1.3 安装

双击.dmg 文件打开,把里面的文件拖到    /usr/local/bin  目录下,因为是修改了系统的路径,所以需要输入本机的密码,这样就可以在终端使用 class-dump 命令了。

1.4 使用

注意这里dump的是应用后缀是.app而不是.ipa:

然后打开终端,输入命令

class-dump -H XXX.app -o XXX

图12

-H 后面的内容为需要dump的 .app 文件路径

-o 后面的内容为输出的头文件保存路径

因为我是保存到桌面的,所以等命令执行完成之后,我就可以在桌面上找到Dump这个名字的文件夹了,并且里面已经装满了我们想要的头文件了:

图13

打开ViewController.h,已经是混淆过的代码了

图14

2.1 什么是Hopper

Hopper Disassembler是Mac上的一款二进制反汇编器,基本上满足了工作上的反汇编的需要,包括伪代码以及控制流图(Control Flow Graph),支持ARM指令集并针对Objective-C的做了优化。

2.2 下载地址

官网地址:https://www.hopperapp.com

2.3 使用

这个工具的强大之处,在于二进制文件在它面前,基本是毫无遮掩的,所有函数名,方法名,代码逻辑结构,你都可以一览无遗。

链接:2.1 什么是Hopper

Hopper Disassembler是Mac上的一款二进制反汇编器,基本上满足了工作上的反汇编的需要,包括伪代码以及控制流图(Control Flow Graph),支持ARM指令集并针对Objective-C的做了优化。

2.2 下载地址

官网地址:https://www.hopperapp.com

2.3 使用

这个工具的强大之处,在于二进制文件在它面前,基本是毫无遮掩的,所有函数名,方法名,代码逻辑结构,你都可以一览无遗。

链接:iOS简单逆向之:Class-Dump、Hopper - 简书

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 什么!我们的代码拿去安全扫描啦?什么!还扫描出来问题啦?什么!源码都别看到啦? 居于上一篇文章iOS简单逆向...
    甘邦阅读 18,166评论 24 40
  • 前言: 在iOS移动端开发中很多时候在考虑安全问题的时候只是单纯的请求体加密,但是在一个用户量级很大的App上就会...
    退役程序猿阅读 6,251评论 2 17
  • 一. 为什么要代码混淆? 系统安全性很高是iOS一大特征,上传到appstore的应用,虽然已经被系统加密,但并非...
    突刺刺阅读 1,568评论 1 0
  • 该方法只能针对有.m.h的类进行混淆,静态库等只有.h文件的没法进行混淆 代码混淆,刚刚看到是不是有点懵逼,反正我...
    iLeooooo阅读 538评论 0 0
  • 宝宝:妈妈,我想去吃昨天你不让我吃的牛仔骨。 妈妈:你腮腺炎还没好,不能吃太油腻的。 宝宝:可是你说太大份要爸爸来...
    瑛红阅读 236评论 0 0