Skidfuscator: 前所未见的混淆技术。
加入Discord: https://discord.gg/QJC9g8fBU9
🕵️ Skidfuscator是什么?
Skidfuscator是一个概念验证混淆工具,旨在利用SSA形式来优化和混淆Java字节码的代码流。这是通过过程内传递来实现的,每个传递都旨在以一种既不会显著增加时间复杂度也不会显著增加空间复杂度的方式来混淆代码。为了达到这个目的,我们设计了一些众所周知的技巧,在保持足够稳定的执行时间的同时,显著增强混淆强度。
这个项目尚未完成。这是我一直在研究的一个概念验证。据我所知,参数注入方面存在一些严重的缺陷。
✨ 特性
以下是我一直在为Skidfuscator添加的所有酷炫功能。这是一个有趣的项目,所以不要对它期望太高。它的目的不是商业化,而是为了启发一些更聪明的代码流混淆方法,特别是那些利用SSA和CFG的方法。
第三代流程
什么是第三代流程混淆?与Zelix的第二代流程混淆相比,我们使用了一个更复杂的系统,包含私有和公共种子。以下是它的工作原理:
图表展示了Zelix(17.0)和Skidfuscator(0.0.1)在流程混淆方面的两种不同方法
我们目前正在研究各种方法来实现这个系统,使用多种轻量级混淆方法。以下是目前的功能:
功能 | 类型 | 描述 | 状态 |
---|---|---|---|
Flow GEN3 | 流程(社区版) | 使用GEN3混淆方法对方法进行混淆 | ✅ |
虚假跳转 | 流程(社区版) | 跳转到随机生成的无效代码以防止抄袭 | ✅ |
虚假异常 | 流程(社区版) | 跳转到随机生成的无效异常 | ✅ |
混淆跳转 | 流程(企业版) | 对跳转条件进行变异,使其看起来比实际更复杂 | ❌ |
异常跳转 | 流程(企业版) | 通过强制抛出异常然后在catch子句中处理所有代码来改变流程语义 | ❌ |
异常返回 | 流程(企业版) | 抛出带有值的异常并捕获它,而不是直接返回(非常耗资源) | ❌ |
强不透明谓词 | 流程(社区版) | 使用继承和方法调用来传递谓词,而不是在CFG开始时声明 | ✅ |
方法内联 | 流程(企业版) | 内联不太常见且不太大的方法 | ❌ |
方法外联 | 流程(企业版) | 外联一些非敏感代码块 | ❌ |
循环展开 | 流程(企业版) | 如果循环限制可以预先确定,将一些循环指令重写为连续段 | ❌ |
扁平化 | 流程(社区版) | 使用调度方法来强化某些代码块范围的语义(不要用于整个方法) | ⚠️ |
字符串加密 | 字符串 | 使用不透明谓词加密字符串 | ✅ |
引用加密 | 引用 | 使用不透明谓词通过InvokeDynamic加密引用调用 | ❌ |
引用代理 | 引用 | 使用构建器模式或调度类代理引用(主要用于初始化) | ❌ |
新 数字变异
Switch变异
虚假异常
虚假跳转
待办事项
- 将代码块创建转换为工厂风格,以便我们在处理语句等内容时有更大的灵活性,而无需包装它们
- 出于同样原因,也将方法节点和modasm转换为工厂风格
- 创建一个合适的工具,允许轻松添加、编辑等IR操作。例如,一个可以找到边缘的合适工具。也许还可以在语句中添加对适当跳转边缘的引用,反之亦然?对于我设想的工具,可以做类似Build.new().Integer(<参数>).create()或Build.new().IllegalStateException(<参数>).create()或Build.invokevirtual(方法).build()或Build.jump(目标)或Build.if(<条件>).jump(<目标>).build()或Build.if(<条件>).invokevirtual(方法).store().build()这样的操作。根据我们想要它返回的内容,我们给它多个选择,使创建混淆等更容易
- 开始使用我们拥有的类似LLVM风格的语句结构实现LLVM编译器。我们需要重写它们所有并添加一个LLVM编译方法来将它们编译为LLVM字节码。一旦完成,将来我们就能够创建一个网站,在后端使用LLVM-clang运行该代码进行交叉编译,为客户提供流畅的体验
- 添加适当的参数混淆,并配备合适的种子系统。我的想法是,种子应该在类型上有所变化而不是保持一致,例如一个种子将作为双精度数传递,然后使用其哈希码等进行转换
- 添加一个合适的调用解析器,预先缓存所有内容。确保支持排除等功能
- 优化MapleIR的类继承构建。目前相当薄弱
示例
构建器示例
Builder
.invokevirtual(method) // 调用方法并将其添加到栈中。我们必须在退出构建器之前使用栈值来生成语句
.asImplicitInt() // 将构建器转换为整数构建器,允许我们使用算术运算。如果不是整数,我们也可以让它引用哈希码函数
.add() // 添加下一个值,切换到加法构建器
.invokevirtual(method2) // 弹出一个值,切换回表达式构建器
.condition() // 添加条件,切换到条件构建器
.ifEqual(target)
.ifSmaller(5, target2)
.ifBigger(6, target3)
.else(target4)
.buildStmt() // 根据之前的指令创建语句(或语句列表)