Skip to content

21 混淆技术分析

混淆方法概览

iFlyCode 使用了多种混淆技术保护代码:

1. 字符串 XOR 编码

所有字符串常量经过 XOR 编码,运行时解码。存在多个不同的编码器:

编码器方法所在类用途
H(String)NewFileUtils通用字符串
H(String)RequestResultListWebSocket 相关
H(String)AICodeStringUtil命令类型
H(String)IdeActionIDE Action
H(String)FileService文件操作
H(String)GitReviewServiceGit 操作
H(String)EditorUtils编辑器操作
H(String)Maps配置键
H(String)GeneratorConfig生成器配置
H(String)PositionUtil位置相关
H(String)ChatInputController聊天输入
H(String)JComponentKtUI 组件
H(String)CodeCompleteService补全相关
H(String)FileExtensionLanguageDetails文件扩展名
H(String)RequestCancelException异常
H(String)ActionButtonUI 操作
H(String)OverlayUtils覆盖层
H(String)Maps映射

编码原理: 使用调用者的类名/方法名作为 XOR 密钥。

2. 字段名混淆

使用 Java 关键字和保留字作为字段名:

字段实际类型实际用途
byteLogger日志记录器
enumLogger日志记录器
finalString端口号
floatObject同步锁
tryPluginAgentProcessHandler进程处理器
caseAgentModuleEnum模块枚举

3. 控制流混淆

  • 大量不可读的变量赋值
  • 交织的 try-catch 块
  • 反编译后出现 void 声明和 WARNING 注释
  • CFR 反编译器部分方法反编译失败(如 RestartableAgentProcessService.onReconnectException

4. 内部类命名

非标准的内部类命名模式:

PluginStartupActivity$01
AcceptInlaysAction$pa
AcceptLineCodeInlaysAction$va
AcceptWordInlaysAction$wa
SocketMessageHandleListener$Ka
HeartBeatCheckRunner$Ga, $ma
AutoCodeGenerateListener$Q, $T
GitBranchChangeListener$H, $R, $b
PluginAgentProcessHandler$01

5. 顶层包混淆

Q/ 包下的类使用极短名称:

Q.q    — 用途未知
Q.sa   — 用途未知
Q.ua   — 用途未知

6. 反编译对抗

  • 部分方法包含反编译陷阱(不可达代码、循环引用)
  • CFR 报告 ConfusedCFRExceptionStarted 2 blocks at once 错误
  • 字符串编码使得静态分析无法直接搜索关键字

对逆向分析的影响

混淆技术影响应对策略
字符串 XOR无法直接搜索关键字运行时 hook 或逐个 H() 方法分析
字段名混淆降低可读性通过类型推断和上下文分析
控制流混淆反编译结果不完整手动分析字节码或使用多种反编译器
内部类命名增加理解难度通过外部类引用推断用途

编码器示例

java
// 典型的 XOR 编码器 (推测原理)
public static String H(String encoded) {
    String callerClassName = getCallerClassName(); // 通过堆栈获取
    char[] key = callerClassName.toCharArray();
    char[] chars = encoded.toCharArray();
    for (int i = 0; i < chars.length; i++) &#123;
        chars[i] ^= key[i % key.length];
    &#125;
    return new String(chars);
&#125;

这种混淆不算特别强(可以通过运行时 Hook 完全绕过),但足以阻止简单的静态分析。

本项目仅供学习研究,逆向分析内容归原厂商所有。