我们在XSDK的iOS版本中, 除了AppStore官方支付之外还集成了第三方支付(微信支付H5和支付宝支付H5版本)。 如果用于企业签,不需要做处理,直接使用即可。 但是如果需要上架AppStore,我们需要屏蔽第三方支付。 这个我们后台设置开关,直接后台切换支付方式即可。 上架审核的时候, 切换为Appstore支付;审核通过的时候,切换为第三方支付。因为第三方支付,是H5方式,不会被机审检测到。 同时,防止被抽查,后台也可以设置,将每次前多少次支付,设置为AppStore支付,之后用第三方支付,降低被抽查到的风险。

但是只是做到这个还不够, 如果需要用这套SDK上多个游戏,或者多个马甲包。 防止一样的代码被4.3的风险或者被代码标记的风险,我们需要对SDK的代码进行混淆, 每次出一个马甲SDK。

关于iOS代码的混淆, 查阅了网上很多文章,混淆的原理性文章都是多年之前的了纯字符随机替换,这种按照目前的机审政策,已经很难过审了。另外也有一些混淆工具,不过是按时间收费的。

所以,我们这里就XSDK这个项目,来谈一谈iOS中的代码混淆。

如果在开发之初, 开发者经验丰富, 或者运营经验丰富, 提前将混淆这个事情重视起来, 那么混淆就会很简单。 可以事先指定代码编写规则,尽量保证类方法变量等的唯一性。 比如所有的类以X开头,所有的方法函数以F开头,所有的属性以P开头, 所有的内部变量以S开头等等这样的规则。 那么在后续写混淆的时候,几行代码就可以搞定了。

但是我相信多数项目和XSDK一样,可能都是事后诸葛亮,等到需要做这件事情的时候,才发现代码命名随心所欲带来的代价。 但是,为了方便混淆来重写框架是不可能的了,程序也不愿意呀。

所以,我们就只能来费些心思来写混淆脚本了。 我们采用python来写混淆脚本,用python来干这个事情,还是很合适的。

首先,我们确定一下混淆目标:

列出了混淆目标, 我们来设计混淆思路了。

一、词汇替换

混淆,也就是替换, 将老的名称替换为新的名称。 之前网上很多都是使用纯随机字符来替换,但是目前这个方式风险很大,很容易被苹果检测出来有隐藏功能的意图。

所以,我们采用双词库的形式来进行混淆。 我们准备两套词库。 一套是常用的单词词库(词汇量大概1000个);一套是程序常用单词词库(词汇量大概100个)。

在生成混淆后的新名称的时候, 我们根据需要, 从两套词库中随机单词,进行拼接。

比如混淆类名称的时候, 当前有一个类名是AppStorePay。 我们先从常用词库中随机单词进行拼接,直到长度大于等于AppStorePay长度的时候为止。 然后再从程序词库中随机一个单词作为后缀。 这样混淆后的名称可能是OneForTestListener这样的形式。 看起来就接近了正常的类名命名。

另外混淆的时候, 我们记录一个已经生成的新的名称的列表, 如果生成的新名称已经存在,那么重新生成。 防止生成的新名称重复导致问题。

二、混淆思路

混淆的时候, 我们可以逐行混淆, 但是这种方式, 误差可能会很大。 我们希望执行混淆之后, 一次性编译通过, 不需要再手动修改某些混淆失败的地方。 所以我们放弃了逐行混淆的方式。采用一种更加精细化的混淆方式。

另外混淆的方式,我们希望尽可能地符合语法通用的规则,而不简简单单地适应XSDK这个项目。 (防止后续我们其他项目也需要做混淆)

首先,我们将代码目录下所有的代码文件加载进来, 我们设计一个符合代码结构的层级:

图中我们可以看到, 我们首先设计了四个类。 XFolder代表一个代码目录; XClass类代表一个类文件;XFunction类代表一个类中的一个函数;XProperty类代表一个类中的一个属性。

设计好了这个之后,我们就可以调用XFolder中的load方法,加载XFolder对应目录下的所有class文件,以及所有Class文件中的函数和属性。

三、混淆实现

将代码类文件都加载到内存之后, 现在我们就需要对混淆目标中的各个目标的混淆进行实现了。 我们设计一系列混淆实现类,来进行混淆:

1、PCHCodeMixer: 对XSDK.pch文件中定义的全局变量进行混淆,同时对源码中所有引用的地方进行替换

2、PropertyCodeMixer: 对每个类中定义的属性进行混淆, 同时对源码目录中所有引用的地方进行替换

3、FunctionCodeMixer: 对每个类中定义的函数进行混淆,同时对源码目录中所有引用的地方进行替换

4、FunctionCodePostMixer: 对函数内部定义的属性进行混淆,同时在合适的地方插入垃圾代码。

5、ClassCodeMixer:对类名称进行混淆,同时对源码目录以及xcode工程文件中所有引用的地方进行替换

6、ResourceMixer:对资源进行混淆, 对所有图片文件进行md5变更,对所有图片名称进行混淆,对所有源码目录以及xcode工程文件中所有引用的地方进行替换

7、GlobalNameMixer: 对目录,对框架名称,对Bundle名称等全局民名称进行混淆。 同时对所有文件和xcode工程文件中所有引用的地方进行替换

有了以上这些组件,就可以完成对框架代码和资源进行混淆和替换。另外还有两个辅助的mixer类,主要完成对demo工程和文档内容的替换:

8、DemoMixer: 对demo工程中的引用进行替换。

9、DocMixer:对文档中对应的引用进行替换。

另外注意下,混淆的时候, 通过正则表达式来解析对应的函数和属性, 但是因为iOS的特殊性, 函数中有中括号,而且函数的地方可以无限嵌套。 所以,在对函数进行处理的时候,可以采用栈结构来解析和匹配。

另外解析函数体内容的时候, 我们也是采用栈结构来解析。 也就是先解析出了类中所有的函数名称, 然后从后往前解析函数体内容。这样解析也方便很多。 其他地方的混淆,基本用正则表达式就可以完成,只是写正则的时候或者用正则匹配替换的时候, 尽可能的精细化规则,严谨地匹配。替换的时候, 按照被替换串的长度,优先替换长串,再替换短串。

目前XSDK代码经过混淆工具混淆之后, 无需再手动替换, 直接xcode打开,编译重新生成XSDK的framework和bundle文件,然后替换到XSDK的Demo工程中的SDK目录下,然后直接运行XSDK Demo就可以了。

如果提供给研发那边的话, 只需要将上面替换过的XSDK Demo和文档提供给研发那边即可。 经过混淆工具混淆之后, Demo工程和文档中都会被替换,无需手动替换操作。

python混淆ios代码_XSDK——iOS代码混淆原理相关推荐

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

    1.iOS应用安全之代码混淆设计篇 2.iOS应用安全之代码混淆实现篇 针对设计篇描述的大致思路,现在针对各个问题点,给出实现方法 该脚本大致使用的工具如下:vi.grep.sed.find.awk. ...

  2. python项目打包部署到ios_Python的iOS自动化打包实例代码

    前言 这段时间刚刚学习了一段时间的Python,加上自己是做iOS开发的,就想着用Python来做一个自动化打包,可以自动完成打包,上传到蒲公英,并且发送邮箱给测试人员. 一是可以减少打包功夫,二来可 ...

  3. [ios开发基础之]代码块

    iOS4引入了一个新特性,支持代码块的使用, 这将从根本上改变你的编程方式.代码块是对C语言的一个扩展,因此在Objective-C中完全支持.如果你学过Ruby,Python或Lisp编程 语言,那 ...

  4. iOS使用shell脚本注入混淆内容

    2019独角兽企业重金招聘Python工程师标准>>> 背景 公司需要做一系列的壳版本,壳版本如果内容雷同提交到App Store会有被拒绝的风险,其中有一种解决方案是在壳版本中注入 ...

  5. 对对碰 代码 android,iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码...

    iOS精选源码 iOS优质博客 前言当前互联网行业的竞争已经是非常激烈了, "功能驱动"的时代已经过去了, 现在更加注重软件的细节, 以及用户的体验问题. 说到用户体验,就不得不提 ...

  6. iOS协同开发-iOS代码版本控制-GitHub代码托-关东升-专题视频课程

    iOS协同开发-iOS代码版本控制-GitHub代码托-4908人已学习 课程介绍         介绍了如何使用Git进行代码版本控制,其中包括Git服务器的搭建.Git常用命令和协同开发,还介绍了 ...

  7. delphi 实现屏幕旋转代码_X86指令混淆之函数分析和代码块粉碎

    本文为看雪论坛优秀文章看雪论坛作者ID:三猫原理二进制分析的时候经常遇到经过混淆的函数,所以一直想自己学习实现一个简单的指令乱序demo,也不需要太复杂(其实就是自己菜而已).能阻止IDA F5党(就 ...

  8. android studio 混淆jar,android studio如何生成混淆代码的jar

    释放双眼,带上耳机,听听看~! 今天,简单讲讲android里如何在生成jar包时,同时对jar包的代码进行混淆,避免别人看到核心代码. 之前,我对领导说我打包生成的SDK,别人使用android s ...

  9. 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

    一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...

最新文章

  1. “ yield”关键字有什么作用?
  2. python飞机大战源代码-python版飞机大战代码分享
  3. kali Linux 安装
  4. 20190829:(leetcode习题)环形链表
  5. oracle 10g ocp 047解析(精简版),ORACLE 10G OCP 043 笔记
  6. 将华为路由器做成ftp服务器(实现上传下载功能)
  7. android开题报告模板下载,毕业设计开题报告模板
  8. Linux实验四——Linux用户和用户组管理
  9. 知己知彼 看CIO如何成功领导80后
  10. 路由器 设置DNS 域名拦截 重定向
  11. Quant面试好题汇总
  12. 海康威视2022届校招面经(内含内推码)
  13. 【java基础练习】打印空心菱形
  14. 什么是内部类?内部类的作用
  15. IDEA使用Spark 进行对所有数据进行统计
  16. 揭秘Google排名的60个因素
  17. Revit数据导入SuperMap iDesktop方法详解
  18. 【NeurIPS2020视频解读】图机器学习热门方向及应用
  19. h5+app打开pdf,图片,excel,world(亲测可用)
  20. Excel输入汉字,出现Setup Error错误解决方法

热门文章

  1. MTK 方案电池保护机制设计
  2. 面对找不到工作的困难,小伙选择创业开酒吧,月收入竟达到了6万
  3. 电商后台设计:商品维护
  4. 织梦选php哪个版本,织梦DedeCMS网站及其版本的判断
  5. 【获奖榜单公布】遇见27岁的Java,分享你的开发者故事
  6. 华南农业大学课设——数据结构课设、Java课设、操作系统课设
  7. php html5 框架,几个很好用的HTML5移动开发框架
  8. 在matlab中使用spm8,[转载]在matlab中同时使用spm2,spm5,spm8
  9. 重点人口动态管控轨迹分析系统开发,可视化大数据平台建设
  10. jq获取页面中所有的a链接并执行下载功能