iOS 代码安全加固--反编译和代码混淆

摘要:
1、 类转储反编译1.对打包的ipa进行反编译并更改。ipa到Zip并解压缩6.右键单击以显示包内容。找到以下7个白色框和黑色背景。将其复制到桌面xx文件夹。在终端中输入相关命令cd,以输入xx文件夹class-dump-H二进制文件名。然后,您可以看到更多信息。tt文件中的h文件。2.IOS代码混乱。1.在项目的Resource文件夹中创建一个新的脚本文件:confuse.sh,宏定义文件:codeObfu

一、class-dump反编译 

1、将打包的ipa反编译下,.ipa改成.zip,并解压 

这里写图片描述

6、右击—显示包内容,找到如下有个白框黑底的 
这里写图片描述

7、将其复制到桌面xx文件夹中,在终端中输入相关命令 
cd 进入xx文件夹

class-dump -H  二进制文件名字

然后在tt文件中就可以看到多出的很多.h文件

这里写图片描述

二、ios代码混淆

1、在项目的Resource文件夹中新建 
脚本文件:confuse.sh, 
宏定义文件:codeObfuscation.h, 
函数列表文件:func.list, 
头文件:PrefixHeader.pch

可脚本创建 
cd 项目/YCFMixConfuseDemo/Resource 
touch confuse.sh 
touch func.list 
touch codeObfuscation.h 
touch PrefixHeader.pch

此处使用的混淆方法是:将一些以ycf_xxx开头的方法替换成随机的字符,目前该方法只能针对1个的参数的方法 
这里写图片描述

2、在confuse.sh文件中,输入以下代码,注意路径

TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="$PROJECT_DIR/YCFMixConfuseDemo/Resource/func.list"

CONFUSE_FILE="$PROJECT_DIR/YCFMixConfuseDemo"

HEAD_FILE="$PROJECT_DIR/YCFMixConfuseDemo/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 "/^ycf_/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='http://t.zoukankan.com/$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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

注意:需要将ycf换成你自己的函数前缀 
这里写图片描述

3、在项目——Target——Build Phases中 新增New Run Script Phase 
这里写图片描述

这里写图片描述

4、将新建的头文件PrefixHeader.pch中导入codeObfuscation.h

#ifndef PrefixHeader_pch
#define PrefixHeader_pch

// Include any system framework and library headers here that should be included in all compilation units.
// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.
#import "codeObfuscation.h"
#endif /* PrefixHeader_pch */

5、将新建的PrefixHeader.pch头文件添加到Xcode中去

在Build Settings中搜索Prefix Header,在Prefix Header中写入我们新建头文件的路径 
这里写图片描述

6、运行项目,但是会报如下问题 
这里写图片描述

/Users/xxx/Library/Developer/Xcode/DerivedData/YCFMixConfuseDemo-bampqtmksvysbbbaixdeifkkoaqd/Build/Intermediates.noindex/YCFMixConfuseDemo.build/Debug-iphonesimulator/YCFMixConfuseDemo.build/Script-1ED6530E2004577400286FE9.sh: line 2: /Users/youchunfen/Desktop/项目复件/demo/YCFMixConfuseDemo/YCFMixConfuseDemo/Resource/confuse.sh: Permission denied
  • 1

是说confuse.sh没有权限,那么我们cd 到 Resource文件夹中,查看它的权限,发现它没有执行权限,将其修改有可执行的权限 
cd /Users/xxx/demo/YCFMixConfuseDemo/YCFMixConfuseDemo/Resource 

查看某个文件的权限 ls -l 文件名 
chmod a+x 文件名 给该文件可执行权限,a是所有人

这里写图片描述

7、这次就可运行了,但是发现第一次的运行后,然后使用本文的第一部分的class-dump来反编译发现,并没有代码并没有混淆,再次运行后,相关以ycf_开头的函数名才被混淆

appdelegate中原来的函数名 
这里写图片描述 
混淆后 
这里写图片描述

在ViewController中方法名混淆前 
这里写图片描述

混淆后 
这里写图片描述

参考链接

 
 
 

免责声明:文章转载自《iOS 代码安全加固--反编译和代码混淆》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇第148天:js+rem动态计算font-size的大小,适配各种手机设备Kubernetes核心原理(四)之Kubelet下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

多分类问题中混淆矩阵(Confusion Matrix)的Matlab画法 | 丕子

在多分类问题中,有一种很实用的分类问题结果统计图。比如说多类别文类问题,那么每一个类别分到其他类别都有一些数据,但是分到自己类别的毕竟多,这样计算百分比之后就形成了一个矩阵,如果分类正确率高的话,那么对角线上的元素的值,也就是自己到自己的那一部分,value就大。我最近也在做多分类问题,要画这样的图,但是发现确实很少有代码,自己画的确实不好看,还牵扯到值的...

密码算法详解——AES

0 AES简介   我们知道数据加密标准(Data Encryption Standard: DES)的密钥长度是56比特,因此算法的理论安全强度是256。但二十世纪中后期正是计算机飞速发展的阶段,元器件制造工艺的进步使得计算机的处理能力越来越强,DES将不能提供足够的安全性。1997年1月2号,美国国家标准技术研究所(National Institut...

Gradle配置最佳实践

https://blog.csdn.net/devilnov/article/details/53321164 本文会不定期更新,推荐watch下项目。如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request。本文意在分享作者在实践中掌握的关于gradle的一些技巧。 本文固定连接:https://github...

C#实现短链接生成服务

项目中有一处需求,需要把长网址缩为短网址,把结果通过短信、微信等渠道推送给客户。刚开始直接使用网上现成的开放服务,然后在某个周末突然手痒想自己动手实现一个别具特色的长网址(文本)缩短服务。 由于以前做过socket服务,对数据包的封装排列还有些印象,因此,短网址服务我第一反应是先设计数据的存储格式,我这里没有采用数据库,而是使用2个文件来实现: Url...

如果你不懂.net逆向,又对它感兴趣

先声明,偶既不是专业程序员,从事的工作也和IT毫无关系,只是有兴趣时就看一点逆向的东东,纯粹是当游戏。所以各位大牛不用以专业的眼光来审视偶写的文章及偶做的工作。偶接触.net可能比某些新手早些,为了让对.net逆向有兴趣的朋友少走弯路,特写此文。1、从哪儿着手    要想逆,首先对写程序多少要有点了解。因此,偶觉得掌握一门高级的.net编程语言是必须的,一...

关于HTML、js加密、混淆、源码保护、代码安全,防止解压直接看源码

一直有人问HTML加密混淆怎么做,其实这在业内是早已很多人研究过的课题。假日期间整理一篇文章分享给大家。 我们先理下需求,加密的目的是什么?加密到什么级别?为此我们可以牺牲什么?我们知道这个世界不存在绝对的安全,加密会被破解、混淆会被反混淆。技术小白、开发者、黑客,是完全不同的级别,防范不同级别的人策略都不一样。防范力度越大,投入代价也越大,比如聘请专业的...