1.iOS应用安全之代码混淆设计篇

2.iOS应用安全之代码混淆实现篇

针对设计篇描述的大致思路,现在针对各个问题点,给出实现方法

该脚本大致使用的工具如下:vi、grep、sed、find、awk、cut、sort、uniq、cat、md5等。

针对要加密的内容,分别给出关键字提取脚本命令。

脚本中$ROOTFOLDER代表工程根目录,$EXCLUDE_DIR 代表要排除的目录,举例如下:

[objc] view plain copy

  1. ROOTFOLDER="demoProject"

  2. EXCLUDE_DIR="--exclude-dir=*.framework --exclude-dir=include --exclude-dir=libraries --exclude-dir=Libs --exclude-dir=lib"

关键字提取

1.文件名

第一步先将包含路径的文件名写入文件

[objc] view plain copy

  1. find $ROOTFOLDER -type f | sed "/\/\./d" >f.list

第二步文件中提取文件名

[objc] view plain copy

  1. cat f_rep.list | awk -F/ '{print $NF;}'| awk -F. '{print $1;}' | sed "/^$/d" | sort | uniq

但从文件名提取的功能上,上面两个步骤完全可以合并为一步,但是在实际功能实现中还是要求将上面分为两步的

2.类名

[objc] view plain copy

  1. grep -h -r -I  "^@interface" $ROOTFOLDER  $EXCLUDE_DIR  --include '*.[mh]' | sed "s/[:(]/ /" |awk '{split($0,s," ");print s[2];}'|sort|uniq

其中sort,排序;uniq 去除重复的

3.协议名

[objc] view plain copy

  1. grep -h -r -I  "^@protocol" $ROOTFOLDER  $EXCLUDE_DIR  --include '*.[mh]'| sed "s/[\<,;].*$//g"|awk '{print $2;}' | sort | uniq

4.属性名

[objc] view plain copy

  1. grep -r -h -I  ^@property $ROOTFOLDER  $EXCLUDE_DIR --include '*.[mh]' | sed "s/(.*)/ /g"  | sed "s/<.*>//g" |sed "s/[,*;]/ /g" | sed "s/IBOutlet/ /g" |awk '{split($0,s," ");print s[3];}'|sed "/^$/d" | sort |uniq

其中

[objc] view plain copy

  1. sed "/^$/d"

是去除空行,

5.函数名

[objc] view plain copy

  1. grep -h -r -I  "^[-+]" $ROOTFOLDER $EXCLUDE_DIR --include '*.[mh]' |sed "s/[+-]//g"|sed "s/[();,: *\^\/\{]/ /g"|sed "s/[ ]*</</"|awk '{split($0,b," ");print b[2];}'| sort|uniq |sed "/^$/d"|sed "/^init/d"

函数名提取,目前只是提取函数名第一段的名称,如:

[objc] view plain copy

  1. -(void)funName:(NSString *)param1 secondParam:(NSString *)param2;

那么该脚本只会提取出funName。脚本中

[objc] view plain copy

  1. sed "/^init/d"

是将函数中的以init开头的函数去除,因为,oc中初始化函数默认是以init开头的,如果把该类的函数也混淆的话,会有问题的。

那么,以上脚本即可实现各种关键词的收集,收集后合并成一个文件,然后再排序去重复。

小小结

上述脚本提取出来的关键字包括系统自带的,也包括我们自己自定添加的,如果全部拿出混淆,那么我们混淆后的程序肯定是无法运行的,甚至无法通过编译。那么我们该怎么办?这个问题就是设计篇中提出的比较麻烦多事。最容易想到点方法就是,判断该关键字是否是系统自用的,如果是就不去混淆,相反就去混淆。那怎么系统用了哪些关键字?简单的很了,就是用上述提到的脚本,将系统使用的关键字,提取出来,作为系统自用的保留字。这样用排除法就可以解决这个麻烦的问题了,虽然比较笨拙,但是管用。

那么第一步就需要制作一个系统保留字字典库。用上述脚本即可完成。

那么第二步就是提取要替换的关键字,同样是用上述脚本,仔细看,你会发现个问题。提取文件名的时候,是将所有文件名都提取出来了,包括排除的目录,因此,在这个地方会有问题。我们要在文件名提取时,排除已经排除的目录或者将排除的目录文件名作为临时保留字。

过滤并加密保留字

将以上两步获取的关键字进行过滤。

[objc] view plain copy

  1. cat $SOURCECODEKEYWORDS |

  2. while read line

  3. do

  4. if grep $line $RESKEYSALL

  5. then

  6. echo filter1: $line

  7. else

  8. md5 -r -s $line  | sed s/\"//g >> $REPLACEKEYWORDS

  9. fi

  10. done

其中$SOURCECODEKEYWORDS是从ROOTFOLDER中提取的要混淆的关键字

替换工程中关键字

该步骤是本功能的核心,要实现文件中的关键字替换,不对,准确的说,应该是文件中的关键字单词替换。这个就是设计篇中提到的问题。

愿字符串:"This is my fish.” 要将is” 替换为”is not“。我们希望的当然是:“This is not my fish.” 而不是“This not is not my fis noth.” 。也就是说,要达到想要的目的,必须是单词匹配替换,这个很重要。经过实践证明,OS X版的sed并没有实现单词匹配替换,只能是将匹配正则表达式的行,进行字符串替换,也就是替换后是我们不想要的结果。这个可肿么办?还好经过一番挖掘,找到一种比较笨拙的办法,效果如下,又要发挥愚公精神了。

[objc] view plain copy

  1. sed -i '' '

  2. '"$v2"'s/)'"$var2"':/)'"$var1"':/g

  3. '"$v2"'s/('"$var2"':/('"$var1"':/g

  4. '"$v2"'s/ '"$var2"':/ '"$var1"':/g

  5. '"$v2"'s/\"'"$var2"':/\"'"$var1"':/g

  6. ' $v1

其中,v2代表行号;var2代表要替换的关键字,即例子中的“is”;var1是混淆后的字符串;v1 是指文件路径,包括文件名;-i表示直接修改文件,后面必须带两个单引号,要不然会有错误,单引号内容应该是要备份的文件名,在此不需要备份所以为空;在第一行和最后一行之间的意思是,描述单词出现时的各种场景,要想达到单词匹配的效果,那就在此必须列举所有情景,这个真够蛋疼的~~,愚公上吧!!!

这个还有一个办法是,自己写一个程序实现文件中的单词替换;

还还有一个方法是:大神,您给个呗!最后的办法:求大神了.....

替换属性设置方法

[objc] view plain copy

  1. cat repProperty.txt |

  2. while read line

  3. do

  4. ar=(`echo "$line"|cut -f 1-2 -d " "`)

  5. first=`echo ${ar[1]}|cut -c -1| sed "y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/"`

  6. second=`echo ${ar[1]}|cut -c 2-`

  7. lastFind=`echo set$first$second`

  8. lastRep=`echo setZ${ar[0]}m`

  9. rm -f rep.tmp

  10. if grep -r -n -I -w "$lastFind"  $ROOTFOLDER $EXCLUDE_DIR   --include="*.[mhc]" --include="*.mm" --include="*.storyboard" --include="*.xib" >rep.tmp

  11. then

  12. cat rep.tmp |

  13. while read l

  14. do

  15. v1=$(echo "$l"|cut -d: -f 1 )

  16. v2=$(echo "$l"|cut -d: -f 2 )

  17. sed -i '' ''"$v2"'s/'"$lastFind"'/'"$lastRep"'/g' $v1

  18. echo "step3:"$l

  19. done

  20. else

  21. echo "step3:do not find:"$lastFind

  22. fi

  23. done

这个也是相对比较麻烦的,因为oc的属性系统是可以自动合成setter函数的,所以属性的混淆需要额外多考虑点。上面的做法是,根据提取的过滤后的属性关键字,生成属性设置函数,然后查找过程中是否有用到,有就混淆掉。

文件名混淆

[objc] view plain copy

  1. cat f_rep.list |

  2. while read line

  3. do

  4. echo "old name:"$line

  5. v1=$(echo "$line" | sed "s/\// /g" | awk '{print $NF}')

  6. echo "v1="$v1

  7. v2=$(echo $v1 | sed "s/\./ /g" | awk '{print $1}')

  8. echo "v2="$v2

  9. if grep -w $v2 $RESKEYSALL

  10. then

  11. echo "find."

  12. else

  13. v3=$(echo $v1 | sed "s/\./ /g" | awk '{print "."$2}')

  14. echo "v3="$v3

  15. v4=$(md5 -q -s "$v2" | sed "s/.*/z&m/g")

  16. echo "v4="$v4

  17. v5=$(echo "$line" | sed "s/"$v1"//g")

  18. echo "v5="$v5

  19. mv $line $v5$v4$v3

  20. echo "new name:"$v5$v4$v3

  21. fi

  22. done

文件名混淆的原理就是将需要混淆的文件路径,提取出要混淆的部分,然后组合成最终的文件名,使用mv命令完成文件名混淆。

至此,设计篇中提及的要混淆的内容已经全部完成混淆。

注意事项

1.需要将工程名称作为临时保留关键字

如:工程名称demoProject,那么demoProject要作为保留字,否则混淆后,可能target的名称也会被混淆掉,这个不是我们期望的;

2.需要将工程中的子目录名称作为临时保留关键字

如:在工程目录下有子文件夹AFNetworking,在Xcode工程的导航里也可以看到AFNetworking的分组,此时,如果AFNetworking也被混淆,那么工程中的分组会变成混淆后的字符串,但是工程目录下的子文件夹AFNetworking并没有改变,所以此时,会找不到响应的文件;根本原因是我们的混淆没有对文件夹名进行混淆。

3.需要将访问网络时组织的参数名称作为临时保留关键字

如:有一个属性名为:passport;恰好在组织网络参数时,有一个字段也叫passport,如果作为属性关键字passport被混淆了,那么组织网络参数时用的passport也会被混淆掉,所以此时传给后台的关键字passport就变了,导致后台无法识别;因此,出现这个情况时,要添加到临时的保留字中;如果编码规范的话,不用添加临时保留字也会避免~

4......

下面是混淆后的效果截图:

完整脚本下载地址:ZMConfuse

本文转自ljianbing51CTO博客,原文链接:http://blog.51cto.com/ljianbing/1874417 ,如需转载请自行联系原作者

iOS应用安全之代码混淆实现篇相关推荐

  1. iOS逆向:【代码混淆】1、基于编译器混淆静态库(StaticLib)2、字符串加密:使用clang-c接口将源代码转换成抽象语法树,并对抽象语法树进行遍历和分析,分析代码中的字符串,并进行加密处理。

    文章目录 前言 I .LLVM编译一个源文件的过程 1.1.预处理 1.2.将符号化后的内容转化为一棵解析树 (parse tree) 1.3.将 AST 转换为更低级的中间码 (LLVM IR) 1 ...

  2. Objective - C 进行代码混淆

    关于反编译和防止反编译: http://www.cnblogs.com/iCocos/p/4870539.html iOS应用安全之代码混淆设计篇: http://blog.csdn.net/zm53 ...

  3. Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)

    前言 最近一直在看Python,也很喜欢Python的灵活性:今天主要想说的是iOS的代码混淆,为什么想做代码混淆?为了APP的安全,为了防止别人破壳轻易破解我们代码:还有就是做 马甲包 了,我们知道 ...

  4. iOS代码混淆的探索

    目的 为了进一步增加应用的安全性,防止我们的应用程序很容易的被攻击者分析.破解.重打包,提高攻击者逆向分析应用的难度 应用的加固方案 数据加密:静态字符串.本地存储和网络传输的加密 静态混淆:类名.方 ...

  5. ios APP加密探究几维安全iOS 代码混淆效果参考

    几维安全ios代码混淆效果参考: 什么是加密 加密是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作.大多数病毒就是基于此原理. 加密作用 加壳的程序可以有效阻止对程序 ...

  6. APP加密,ios代码混淆工具,虚拟化技术 适用于移动应用程序的虚拟化加密软件

    概述: KiwiVM是用于移动应用程序的虚拟化加密软件. 它基于Clang编译器扩展,并且在编译项目时虚拟化指定的函数.借助自定义CPU指令的功能,一旦对代码进行加密并且从未解密,攻击者将无法恢复代码 ...

  7. iOS安全攻防(二十三):Objective-C代码混淆

    iOS安全攻防(二十三):Objective-C代码混淆 class-dump可以很方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完善的程序给同行留下笑柄. 所以, ...

  8. iOS 初探代码混淆(OC)

    前言 自己做iOS开发也有几年的时间了,平时做完项目基本就直接打包上传到Appstore上,然后做上架操作了.但是最近,客户方面提出了代码安全的要求.说是要做代码混淆,这方面的工作之前从来没有接触过. ...

  9. ios代码混淆小工具

    一  绪言 写在前面的话:之前做了五年ios开发,现在转了开发方向(数据科学/大数据),今天帮以前ios开发小组的同学,写了一个ios代码混淆小工具,下面介绍下. 这种方式不是最佳方案,更好的方案是c ...

最新文章

  1. asp.net mysql 创建变_[ASP.net教程]EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型...
  2. relationship between freedom,potential, risk
  3. python中not加变量是_MyPython--基础篇--变量
  4. 关于DOM2级事件的事件捕获和事件冒泡
  5. Game(HDU-6669)
  6. 如何将js加入到HTML中
  7. 『C#基础』XML文件的读与写
  8. ubuntu16.04安装opencv3.3
  9. (转)Windows 7 with SP1中英文原版MSDN下载汇总(全版本收录完毕)
  10. C语言嵌入式系统编程修炼之键盘操作
  11. Python爬虫最细致的讲解,Python爬虫之Python,爬虫入门
  12. stm32 带通滤波器_带通滤波器详解_带通滤波器工作原理_带通滤波器原理图
  13. [从零开始学FPGA编程-2]:本系列主要内容预览(持续更新):快速入门篇、提升篇、高阶篇
  14. 百度推广怎么调整计算机优先,百度竞价优化关于帐户层级的一些设置方法与技巧...
  15. React Native 参考资料 (转自简书)
  16. Go 的时间转换和时区校对总记不住?给你一份备忘单
  17. ubantu下部署python
  18. python统计单词出现次数最多的5个单词_【Python】统计文本中单词的出现次数前十的单词...
  19. hping3使用手册
  20. 关于自己搭建的邮件被微软反垃圾邮件标记为垃圾邮件

热门文章

  1. Nature子刊:视网膜计算使眼睛先于大脑产生视觉信息
  2. Unity中那些事半功倍的好插件
  3. php跟web前端的区别,php与javascript的区别是什么?
  4. 3篇量子计算里程碑论文同登Nature封面:保真度超99%,达到实用化水平
  5. 打一针就可修复受损心脏,“癌症克星”CAR-T跨界疗法登上Science封面
  6. 微软2022新bug:大量程序员连夜加班,只因日期数据溢出
  7. GPT-3获NeurIPS 2020最佳论文奖,苹果华人学者获经典论文奖
  8. 电商的「穿衣AI」用得好,剁手根本停不了 | CVPR 2020
  9. 微软这次发布会巨硬:安卓折叠手机、双屏电脑,还有无线耳机和超薄平板
  10. 004_列表list操作