资讯专栏INFORMATION COLUMN

iOS开发系列--代码混淆

chenatu / 1145人阅读

摘要:以下内容大部分来源于实现原理其实插件的实现方式十分简单,提取用户编写的文件中的方法名,使用宏定义将其更换为任意的无规则字符串。

由于iOS系统的封闭性,相对于安卓来说,iOS开发过程中代码混淆可能就显得并不是得非有不可了。但是在安全性(可通过class-dump反编译暴露出类的方法名)和特殊需求上(例如马甲包的混淆过审)还是有一定需求的!
此脚本借鉴于kaich/codeobscure。在使用原作者脚本的过程中,发现了一些BUG和不足,比如正则表达式的判断不准确,生成过多无用的替换宏,需要花费过多时间去人工排错...
由于本人对python并不是很熟,所以只是在原作者的基础上作了一些完善修改。

优化内容:

修改正则表达式,更精准地找出关键词。

替换规则更改:随机字符串==>随机生成2个单词拼接。防止苹果审核过程被误认加入混淆乱码。

增加-k选项,通过ignoreKey.txt文件添加需要过滤的关键词,可避免每次生成都要手动删除部分关键词的麻烦。

增加property关键词、懒加载方法名过滤,减少无用宏的生成。

增加IBAction方法关键词的二次过滤(原脚本存在自定义方法跟IBAction方法重名,无法排除的情况)。


以下内容大部分来源于kaich/codeobscure 实现原理

其实插件的实现方式十分简单,提取用户编写的文件中的方法名,使用宏定义将其更换为任意的无规则字符串。但这种方式有一些需要注意的点:

对于系统库产生的方法名,不可替换;对于系统使用到的关键字,也不可以替换;否则会报错;

Swift混编的项目,Swift中的代码不可替换;同时Swift调用Objective-C的特定方法名也不可以轻易替换;

第三方库暴露的头文件的方法名,不可替换;

根据上面的规则(可能有遗漏),该脚本采用了相对简单的方法来避免:

只扫描.h和.m文件,只扫描方法名。(对于属性名,尝试过扫描,但由于属性的访问方式多样,并不建议做混淆,会产生额外的工作量);

对于系统库,让用户手动指定,这个是可以提取的,直接拿到系统库的头文件即可,脚本会自动扫描到所有的系统关键字,直接做排除处理。(以iOS11的SDK为例,系统关键字约6万个);

对于Swift代码,可以直接排除在扫描目录外;

对于第三方库,用户可以手动指定目录,脚本会自动扫描提取关键字,在混淆时避免这些关键字。

依据上述原理,基本可以避免多数情况下产生的混淆错误;当然,由于各种项目的复杂性,有一些复杂的混淆错误无法避免,需要后续手动调整代码。

使用方式

clone本仓库;

你需要安装python3的运行环境,这个可以使用brew进行安装,这里不再赘述。

你首先需要确定以下几项:

提取一份你当前项目编译环境的SDK库头文件目录;(Demo中提取了iOS11的SDK头文件目录)

你需要混淆的代码的目录;

你不需要混淆的代码的目录;

你需要提取关键字做排除混淆的目录;(例如Pod仓库、第三方头文件)

Swift代码目录;(理论上不会扫描替换,可以用于排除桥接文件)

输出文件目录;脚本运行后会产生多个log文件,以及最终需要使用到的混淆头文件;

注:建议目录使用绝对路径,相对路径容易出问题。

确定以上几项后,找到仓库根目录的Confuse.py文件,使用以下命令行模板运行:

python3 Confuse.py 
-i 你需要混淆的代码的目录,可以是多个目录,以`,`分隔 
-s 当前项目编译环境的SDK库头文件目录,可以是多个目录,以`,`分隔 
-e 你不需要混淆的代码的目录,Swift代码目录,可以是多个目录,以`,`分隔 
-c 你需要提取关键字做排除混淆的目录,可以是多个目录,以`,`分隔 
-k 可选,用于存放需要过滤的key(增加内容)
-o 输出文件目录
注:各参数的意义如下:

-i(input_dirs):必须,项目需要处理的主要文件所在的目录

-s(system_dirs):可选,配置系统Framework文件的目录,一般用于做排除字典,避免替换系统关键字

-e(exclusive_dirs):可选,用于存放不扫描处理的文件的目录,比如Swift文件目录

-c(clean_dirs):可选,用于存放排除关键字的文件的目录,例如Pods下的目录,或者静态库(头文件修改后会出错)

-k(ignore_key_dir):可选,用于存放需要过滤的key(增加内容)

-o(output_dir):必须,输出文件的目录,用于输出关键字、日志以及最后生成的混淆头文件的目录

运行后会在你指定的输出目录下产生一份Confuse.h文件,内容一般如下:

#ifndef NEED_CONFUSE_h
#define NEED_CONFUSE_h
// 生成时间: 2018-04-03 17:20:51
#define Function1 linotypistStonecrop
#define function1 exactingnessMimologist
#define function2 sheepmanSupersublimated
#define functionWithTitle kensititeCratinean
#define subTitle icelandicUntell
#endif

这份文件包含了一堆的宏定义,将需要替换的方法名都替换为了一些随机的字符串,因为宏定义是全局替换,我们只需要将该文件引入到自己的项目中,并在PCH文件中进行引入即可。

引入该文件后,Command+B测试编译,如果无法避免而产生编译错误则需要手动调整;由于将所有的替换归集到了头文件中了,所以遇到有错误的地方尝试删除对应宏定义替换信息重新编辑即可。

另外附上一个系统系统库路径:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks

图文教程

了解完原理,接下来用图文来详细介绍使用方法:
首先去我的Github上获取下源代码资源文件。

注:关键文件如下:

Confuse.h最终生成的替换文件就是这个了,该文件里记录了所有需要混淆的方法名和与之对应的替换字符串

Confuse.py该文件是脚本内容所在,所有实现方法都在这。

ignoreKey.txt该文件下记录需要过滤的特殊key,每个key换行读取

start.sh开始执行脚本 ,在此脚本内更改路径

现在开始集成:

首先需要一个pch文件,至于pch的用法自行百度吧.。

#ifndef TMPrefixHeader_pch
#define TMPrefixHeader_pch
//代码混淆关键导入文件头,注释后不混淆
#import "Confuse.h"
#endif /* TMPrefixHeader_pch */

根据自行需求添加特殊keyignoreKey.txt文件内

通过start.sh脚本快速执行

终端执行内容大概如下:

生成的混淆文件:

编译结果:对无参数、无返回值、多参数等方法名完成识别替换。

接下来我们用class-dump来反编译一下:

class-dump -H /Users/wuaming/Library/Developer/Xcode/DerivedData/TMConfuse-becmpkjuhzbzfldtqwaiznqcmmxq/Build/Products/Debug-iphonesimulator/TMConfuse.app -o /Users/wuaming/Desktop/heads

对比结果:

附上个人Github:https://github.com/TMWu/TMCon... 简书:https://www.jianshu.com/p/c90...

最后还是要感谢下几位大佬!
相关链接:
Objective-C Class-dump 安装和使用方法(原创)
iOS安全攻防(二十三):Objective-C代码混淆
感谢原作者的Github

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17012.html

相关文章

  • iOS开发系列--代码混淆

    摘要:以下内容大部分来源于实现原理其实插件的实现方式十分简单,提取用户编写的文件中的方法名,使用宏定义将其更换为任意的无规则字符串。 由于iOS系统的封闭性,相对于安卓来说,iOS开发过程中代码混淆可能就显得并不是得非有不可了。但是在安全性(可通过class-dump反编译暴露出类的方法名)和特殊需求上(例如马甲包的混淆过审)还是有一定需求的!此脚本借鉴于kaich/codeobscure。...

    zhichangterry 评论0 收藏0
  • Android 代码混淆 混淆方案

    摘要:中调用的方法布局使用的构造函数等。检查混淆结果混淆过的包必须进行检查,避免因混淆引入的。将混淆过的包进行全方面测试,检查是否有产生。前者是提供的默认混淆文件,后者是开发者自定义混淆规则的地方。 本篇文章:自己在混淆的时候整理出比较全面的混淆方法,比较实用,自己走过的坑,淌出来的路。请大家不要再走回头路,可能只要我们代码加混淆,一点不对就会导致项目运行崩溃等后果,有许多人发现没有打包运行...

    zhonghanwen 评论0 收藏0
  • Gradle - 收藏集 - 掘金

    摘要:为什么是教程一掘金开发的同时,也应该了解其构建构建工具。配置指南掘金简介是一个基于和概念的项目自动化建构工具。代码混淆,说白了就是代码压缩代码混淆以及资源压缩配置最佳实践掘金本文会不定期更新,推荐下项目。 为什么是Gradle?- Gradle教程(一) - Android - 掘金开发 Android 的同时,也应该了解其构建构建工具。特别是在实际的生产开发项目中,对于需要分发的包有...

    ivyzhang 评论0 收藏0
  • Android Studio

    摘要:应用程序响应速度最糟糕的是应用程序无响应对话框。然而,不幸的是,并不能获取所要的结果,宽高值均为。提供侧滑操作的控件这是一款提供侧滑功能的,可以设置它的滑动方向左右上下。 写给 Android 开发者的混淆使用手册 点击打开链接 毫无疑问,混淆是打包过程中最重要的流程之一,在没有特殊原因的情况下,所有 app 都应该开启混淆。 首先,这里说的的混淆其实是包括了代码压缩、代码混淆以及资源...

    dunizb 评论0 收藏0
  • android 技术 - 收藏集 - 掘金

    摘要:神兵利器掘金技术征文掘金匕首,鼎鼎大名的公司旗下又一把利刃没错还有一把黄油刀,唤作故此给本篇取名神兵利器。站点全面使用及懒加载初试指北掘金随着的使用越来越简便好用,项目中使用越来越频繁。 快来看看 Google 出品的 Protocol Buffer,别只会用 Json 和 XML 了 - Android - 掘金前言 习惯用 Json、XML 数据存储格式的你们,相信大多都没听过Pr...

    xcold 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<