IOS混淆插件介绍

89 阅读4分钟

背景

由于 IOS 审核机制的要求,我们需要对接口的入参、出参和接口路径进行混淆处理。具体来说,混淆的方式是通过替换入参和出参的参数名称以满足审核要求。

然而,这些替换操作往往是重复性的,并且不涉及具体业务逻辑。因此,我们需要一种高效且简单的解决方案来完成这项工作。

方案分析

对于混淆最关键点就是生成控制器接口,以及入参/出参对象,因为这个混淆本来就没有业务逻辑,只是把参数作一些映射而已。

我们考虑了以下两种实现方式:

  1. 动态替换接口入参/出参 动态替换虽然灵活,但可能会导致性能损耗,并增加技术实现的复杂性,因此被放弃。

  2. 通过插件生成混淆代码 基于上述原因,我们选择使用第二种方式,通过插件生成混淆代码。这种方式更高效,且便于维护。

解决方案

我们的核心思路是:

  • 准备一些代码模板文件,通过 Velocity( vm )模板引擎将模板中的关键参数进行替换。
  • 使用 Idea 插件生成混淆后的代码文件。
  • 对于入参和出参的参数替换,通过调用大模型生成与原始参数含义相近的词汇,确保混淆后的代码语义合理且规整。

此方案在兼顾实现效率的同时,也最大程度减少了人工干预,使代码生成过程更加自动化、智能化。

插件安装

通过本地安装方式,将jar包导入进去

配置插件

这样就配置完成了,插件安装配置之后,最重要的是,模板的维护。

上面配置中,路径配置是生成代码保存的路径。文心一言配置是接入的文心一言大模型配置(主要用户获取参数名称的相近词汇)。本地代码模板配置指生成的代码模板,以及代码模板配置文件,这两种文件不同项目是不同的,但是配置需要按照一定的规则。

安装之后右键,可以看到有 full code(全量)、raised code(增量)生成代码。

全量生成代码

首次打开是没有任何接口的,需要修改配置

接口读取的是全量代码JSON配置文件

全量代码JSON配置文件

配置文件也在模板文件里面,也是需要维护的,配置文件定义了生成哪些类,该如何生成

以cms 服务配置文件为例:

serviceName:表示服务名,也就是插件选择要生成哪些服务的名称来源。

items:具体要生成的内容。

type: 类型,0 控制器,1 入参 2 出参 3 转换器。

Methods: 只有 type 为 0 才会有,表示控制器有哪些方法。

className: 生成的类名后缀(一般与模板名称一致)

loadPath: 加载路径(template 后一个目录即可)

params: 这是需要生成相近词汇的原词汇

这里的接口名称读取的就是 JSON文件中的 serviceName。

生成代码就是通过这个配置文件的 系统配置的路径 + loadPath 找到对应的模板来动态生成代码。

增量生成代码

增量生成代码的需求是在已经生成过这个控制器了,然后需要在该控制器下新增一些方法,我们知道全量生成方式是会把整个控制器生成出来,但是如果想只加某一个方法就不行了。

增量是以 url 来识别生成哪个方法的,因此增量的配置文件也是围绕这 方法级别配置的。

增量代码JSON配置文件

Url: 指接口路径,IOS客户端一般都是给我们要混淆的接口路径,通过这个找到对应的接口方法。

Item 里面的和全量的类似了,唯一区别是 type 没有0,而是增加了一个 type = 4,表示生成的控制器接口方法,这个时候 params 不是表示参数名了,也是表示接口方法名

代码模板

地址:xxxxx

上面的模板配置,就是把这个模板拉取到本地,然后关联上。

模板类型以下代码,

控制器能使用的参数如下:

  1. controllerInfo.pck

  2. controllerInfo.importPackage

  3. controllerInfo.path

  4. controllerInfo.classPrefix

入参类:

出参依此类推

值得注意的是,JsonProperty 的值就是需要生成相近词汇的原单词,而这个词汇在 配置文件中体现

注意

去掉转换器,转换代码统一写在入参/出参里面,这样的好处是,考虑增量插件的时候,不需要考虑转化器的生成

问题:

  1. 貌似接口众多,JSON配置文件越来越大,导致JSON文件臃肿 -------- 方案 拆
  2. 提示词中已使用的词汇越多,提示词内容越大,不知道会不会有影响。

源代码

gitee.com/listen_w/co…