Skip to content

iFlyCode 逆向分析最终清零报告

版本: 3.4.2-222 | 分析日期: 2026-05-30 | 文档编号: 104 覆盖内容: Worker.js 首次源码分析 + WebView 资产完整验证 + Agent 二进制分析 + 原生模块 + 配置映射表 + 跨文档差异校正


1. Worker.js 源码深度分析(首次)

Worker.js (999,689 字节, ~3061 函数) 是 Agent 的代码分析 Worker 线程。doc 31 和 doc 66 仅提及它存在但从未分析其内容。

1.1 功能架构

Worker.js 由 webpack 打包(ncc — Node.js Compiler Collection),运行时由 index.js 以 worker_threads 方式启动。主要功能域:

功能域函数数量说明
tree-sitter 代码解析~15 核心函数SitterMap + analyzeFileInfo 入口
文件系统操作~50 函数fs-extra 完整实现(read/write/copy/move/remove/dir)
日志系统~30 函数log4js 格式化和输出(file/console/stdout/stderr appender)
Diff 计算~5 函数codeDiff, MAX_COMPARE_STEP=30, MAX_COMPARE_LINES=60
消息通信~5 核心函数parentPort.postMessage 和 on('message')
UUID 生成~8 函数uuid v1/v4/v35, rng/RFC4122
工具函数其余formatPath, isFileExist, matchRepoUrlProtocal, extractVueContent
第三方库大量log4js, fs-extra, uuid, lru-cache, 色彩支持, supports-color

1.2 导出接口清单

Worker.js 通过 exports.* 暴露的接口分为三类:

配置类(可外部修改):

  • SKIP_LOGIN — 跳过登录(调试用)
  • DNS — DNS 配置
  • URL — API URL
  • NAME — Agent 名称
  • VERSION — Agent 版本
  • DEFAULT_API_URL — 默认 API URL
  • DEFAULT_TRACE_API_URL — 默认 Trace API URL

工具类:

  • analyzeFileInfo(options)核心函数:使用 tree-sitter 解析文件结构
  • codeDiff(oldStr, newStr) — 计算代码差异
  • extractVueContent(code) — 提取 Vue 文件内容
  • checkPath(path) / isFileExist(path) / exists(path) / read(path) / save(path, content)
  • formatPath(path) / randomId() / matchRepoUrlProtocal(url)
  • isArrayCross(a, b) / isRangeInRange(range, target) / isRangeCross(a, b) / isPositionInRange(pos, range)
  • getChartTypeFromContent(code) — 从代码中提取图表类型(Mermaid/流程图)
  • md5(data) — MD5 哈希
  • sha1(data) — SHA1 哈希

日志类:

  • log, workerLogger, clientLog, serverLog, perfLogger, configure, load

1.3 Tree-sitter 解析器配置

支持语言(10 种):

语言变量名语言变量名
JavaScripttree_sitter_js_1Pythontree_sitter_py_1
TypeScripttree_sitter_ts_1Javatree_sitter_java_1
Ctree_sitter_c_1C++tree_sitter_cpp_1
Vuetree_sitter_vue_1React (TSX)tree_sitter_tsx_1
C#tree_sitter_c_sharp_1Gotree_sitter_go_1

解析器缓存: LRUCache, max=4(同一时刻最多缓存 4 个语法的 WASM 解析器)

Java 特别配置(自定义 nodeTypes):

javascript
this.nodeTypesArray = [
    'constructor_declaration', 'method_declaration',
    'package_declaration', 'import_declaration',
    'class_declaration', 'interface_declaration'
];

这些节点类型是 analyzeFileInfo 提取类结构的关键过滤条件。

1.4 与主进程的通信协议

Worker 通过 worker_threads.parentPort 与 index.js 通信:

主进程 → Worker(message):

javascript
parentPort.on('message', async (message) => {
    switch (message.type) {
        case 'analyzeFileInfo':
            // 调用 analyzeFileInfo 进行代码解析
            // 返回解析结果
    }
});

Worker → 主进程(postMessage):

javascript
parentPort.postMessage({
    type: 'result' | 'error' | 'progress',
    data: { /* analyzeFileInfo 返回的完整代码结构 */ }
});

analyzeFileInfo 入口位置:Worker.js 第 391-465 行。

1.5 关键阈值常量

常量用途
MAX_SIMILAR_ANALYSIS_SIZE30,000 字节相似代码分析的最大输入大小
MAX_CONTENT_SIZE100,000 字节代码解析的最大文件大小
SQL_STRUCTURE_MAX_LENGTH20,000 字符SQL 结构提取的最大长度
MAX_COMPARE_STEP30Diff 计算的最大比较步数
MAX_COMPARE_LINES60Diff 结果的最大行数
SQL_TABLE_CACHE_TIME10 分钟SQL 表结构缓存时间
autoDestroyTimeLimit5 分钟空闲自动销毁时间
workspaceAliveTime10 分钟工作空间活跃时间

新发现: MAX_CONTENT_SIZE=100KB 意味着超过 100KB 的文件会被截断。MAX_SIMILAR_ANALYSIS_SIZE=30KB 限制相似代码搜索的范围。这两个限制之前未被记录。


2. Agent 二进制与原生模块分析(首次)

2.1 Node.js 二进制版本

Agent 携带了 5 个平台的 Node.js 二进制

文件平台大小类型
x86_64_linux_nodeLinux x6488,946,488 字节 (89MB)ELF x86-64, with debug_info, not stripped
x86_64_darwin_nodemacOS Intel93,223,312 字节Mach-O
x86_64_darwin_arm_nodemacOS Apple Silicon88,561,568 字节Mach-O ARM
x86_64_windows_node.exeWindows x6471,328,408 字节PE
x86_64_windows7_node.exeWindows 7 x6430,274,696 字节PE (旧版)

Node.js 版本: v18.18.0

关键差异: 标准 Node.js 18.18.0 Linux x64 约为 35MB。此二进制 89MB,多出 ~54MB 的嵌入式内容。strings 分析显示它包含的内置模块与标准 Node.js 相同(fs, net, crypto, zlib 等),但体积翻倍说明它可能被定制编译(含额外的静态链接库或调试符号未剥离)。

2.2 SQLite 原生模块

每个平台携带一个编译好的 node_sqlite3.node(基于 node-gyp 编译):

平台文件大小
darwin-arm642,037,374 字节
darwin-x642,187,280 字节
linux-x642,236,440 字节
win32-ia321,605,632 字节
win32-x641,894,912 字节

SQLite3 编译时的 Node.js ABI 版本:v18.18.0(从 .node 文件中的 Node.js 版本字符串确认)

2.3 Snappy 压缩模块

Rust NAPI 模块(@napi-rs/snappy),跨 7 个平台:

目标文件大小
darwin-arm64421,656 字节
darwin-x64435,096 字节
linux-x64-gnu472,504 字节
linux-x64-musl472,312 字节
win32-arm64340,992 字节
win32-ia32313,856 字节
win32-x64386,048 字节

用途: Snappy 是 Google 的快速压缩/解压库,用于压缩 Agent 与 Cloud 之间的大数据传输(如代码补全结果、RAG 搜索结果)。

2.4 其他资产

资产用途
config.jsonAgent 配置(agent.version=3.4.2, URL, update=true)
package.json依赖清单(38 个 npm 依赖, sm-crypto 等关键库)
20 个 *.stub 文件Knex.js 数据库查询构建器模板(SQLite/MySQL/PostgreSQL 的 seed/migration 模板)
velocity.propertiesVelocity 模板配置:file.resource.loader.path = ./unitIncludes/IflyCode macros.java.ft
10 个 tree-sitter WASM每种语言 ~0.2-5.9MB

3. WebView 前端资产完整验证

3.1 文件清单与结构

WebView 前端是 Vite 打包的 Vue.js SPA,入口 index.html

html
<!-- class勿动 -->
<html lang="en" class="iflycode">
&lt;head&gt;
  <script type="module" crossorigin src="./assets/index-f0296668.js">&lt;/script&gt;
  <link rel="stylesheet" href="./assets/index-1edf4661.css">
&lt;/head&gt;
&lt;body&gt;<div id="app">&lt;/div&gt;&lt;/body&gt;
&lt;/html&gt;

文件统计: 84 个 JS 文件 + 3 个 CSS 文件 + 3 个字体/图片 + 3 个根文件 = 93 个静态资源

3.2 主要 JS 模块清单

类型文件大小说明
🔵 主入口index-f0296668.js3,759,053 字节主 JS bundle (Vue 2.7.14 + Element UI + 所有组件)
🔵 Storeindex-07af936a.js82,152 字节Pinia store: chat 状态管理
🔵 Storeindex-6b71b008.js51,688 字节Pinia store
🔵 Storeindex-1aaa16d8.js34,038 字节Pinia store
🔵 StoresendMsgMode-8b767ec0.js286,232 字节消息发送模式管理(含权限控制)
🔵 Storeindex-8bf1d656.js8,406 字节Pinia store
🔵 Storeindex-f0296668.js (主)3.7MB主 JS 包含 createApp + store 注册
🔴 BridgeideaUtil-11ab0730.js535 字节IDEA Bridge (myObject.sendMessage)
🔴 BridgevscodeUtil-49d49699.js536 字节VSCode Bridge
🔴 BridgeeclipseUtil-82d0751a.js476 字节Eclipse Bridge
🔴 Bridgeindex-3c7ef179.js42,341 字节Bridge 通信核心(SQL/settings)
🔴 Bridgeindex-4639cb2d.js28,646 字节Bridge 通信核心(Git/auth)
🟡 MermaidarchitectureDiagram-IEHRJDOE-906938ae.js416,006 字节Mermaid 架构图渲染
🟡 MermaidsequenceDiagram-X6HHIX6F-f7169d67.js151,630 字节Mermaid 时序图渲染
🟡 MermaidganttDiagram-APWFNJXF-d5365841.js120,015 字节Mermaid 甘特图渲染
🟡 Mermaidmermaid-parser.core-dc9f3dce.js625,581 字节Mermaid 解析器核心
🟣 FrameworkflowDiagram-4HSFHLVR-1d05d7fb.js102,518 字节流程图
🟣 Frameworktips-f0105b0c.js80,905 字节提示/引导 UI
🟣 Frameworkkatex-db156564.js489,003 字节KaTeX 数学公式渲染
🟣 Frameworkcytoscape.esm-23e802cd.js924,026 字节Cytoscape.js 图可视化
🟣 FrameworkblockDiagram-JOT3LUYC-fee01a68.js135,698 字节块图

3.3 JS→Java 消息类型(完整清单)

从 3.4.2-222 实物 WebView 中提取的 55 种 JS→Java 消息类型(与 doc 65/07 交叉比对此版本的实际值):

Chat (14):

  • CHAT:SEND_MSG, CHAT:NEW_CHAT, CHAT:GET_HISTORY_LIST, CHAT:DELETE_HISTORY_ITEM, CHAT:DELETE_HISTORY_ITEM_ALL
  • CHAT:CHOOSE_FILE, CHAT:CHOOSE_HISTORY_ITEM, CHAT:FEEDBACK_CATEGORY
  • CHAT:GET_CODE_KNOWLEDGE_LIST, CHAT:GET_DOC_KNOWLEDGE_LIST, CHAT:GET_IDE_FILE_STATE, CHAT:GET_OPEN_DIR_LIST
  • CHAT:REFRESH_MODEL, CHAT:SET_MODEL, CHAT:VALID_WEBSITE

SQL Chat (8):

  • SQL_CHAT:SEND_MSG, SQL_CHAT:NEW_CHAT, SQL_CHAT:SQL_LINK_TEST, SQL_CHAT:SQL_SAVE
  • SQL_CHAT:SOURCE_LIST, SQL_CHAT:TABLE_LIST, SQL_CHAT:REQUEST_SOURCE_TYPES, SQL_CHAT:SOURCE_DELETE

Login (4):

  • LOGIN:INIT, LOGIN:CLOSE_QR_CODE, LOGIN:LOGIN_CHECK, LOGIN:LOGIN_ABORT, LOGIN:LOGOUT

Code Review (4):

  • CODE_REVIEW:PAGE_READY, CODE_REVIEW:GET_CHANGE_RESULT, CODE_REVIEW:GET_CHANGE_RESULT_END, CODE_REVIEW:GET_CODEREVIEW_LIST

Git (4):

  • GIT:AUTHORIZE, GIT:GET_STATUS, GIT:SAVE_TOKEN, GIT:RE_INDEX

Batch Unit Test (4):

  • BATCH_UNIT_TEST:CREATE, BATCH_UNIT_TEST:DELETE, BATCH_UNIT_TEST:DOWNLOAD, BATCH_UNIT_TEST:GET_LIST

Unit Test (5):

  • UNIT_TEST:PAGE_READY, UNIT_TEST:SAVE_CODE, UNIT_TEST:FUNCTION_CASE, UNIT_TEST:FUNCTION_CASE_CODE, UNIT_TEST:REGENERATE
  • UNIT_TESTING:MAPPING_FILE

Settings (3):

  • SETTING:UPDATE_CONFIG, SETTING:GET_CAN_OPEN_CODE_ENHANCE, SETTING:SAVE_SHOW_OPERATE_GUIDANCE, SETTING:POPUP_KEYMAP_SETTINGS

Common (4):

  • COMMON:PAGE_READY, COMMON:CODE_CLICK_ACTION, COMMON:FOCUS_FILE_LINE, COMMON:OPEN_URL

Other:

  • JSLOGER — JS 端日志回传
  • CHAT_TALK:RECOMMEND_GAMEPLAY — 游戏化推荐

Java→JS 消息类型(仅 5 种):

  • CODE_CHECK — 代码检查
  • CODE_SEARCH — 代码搜索
  • CODE_TO_CODE — 代码关联
  • USER_CENTER_URL — 用户中心 URL

3.4 与 doc 65/07 的差异

项目doc 65 (先前分析)实物验证 (3.4.2-222)结论
Vue 版本Vue 2.7.14Vue 2.7.14 (确认)✅ 一致
JS→Java 消息类型数~60+55⚠️ doc 65 略高估
Pinia Stores7 stores6 stores⚠️ doc 65 高估
IDE Bridge 数3 (IDEA/VSCode/Eclipse)3 (确认)✅ 一致
Mermaid 支持存在17+ 种图表(确认)✅ 一致
权限代码~39~30+ (确认)✅ 一致

4. 配置与映射表分析(首次)

4.1 国际化和属性配置

BasicActionsBundle.properties(10 条键值对): 插件的基本 UI 字符串:动作标签(创建/获取/比较/设置/退出/帮助/关闭)、插件 ID/版本。

aicode.properties(10 条键值对): 状态栏文本(未登录/请求中)、补全开关、更新消息。

关键配置值(首次从 properties 确认):

properties
aicode.otel.switch=false           # OpenTelemetry 默认关闭!
aicode.otel.endpoint=https://saas.api.example.com/v1/traces
aicode.complete.time.out=10000     # 补全超时 10 秒
aicode.plugin.scene=iFlyCode
aicode.plugin.public.date=2025-04-22  # 发布日期

新发现: aicode.otel.switch=false 说明 OpenTelemetry 默认关闭——这在 doc 74 安全审计中未被记录。OTel 的 SSL 证书验证禁用只会在用户主动启用遥测时才构成风险。此前 doc 74 警告 "SSL 证书验证完全禁用" 可能需要限定在 OTel 已启用的场景。

4.2 文件扩展名映射表(901+396 条目)

fileExtensionLanguageMappings.json(901 个映射): 文件扩展名 → 语言的映射。示例:.javaJava.pyPython.jsJavaScript.tsTypeScript

languageFileExtensionMappings.json(396 个映射): 语言 → 文件扩展名的反向映射。包含 393 种独特扩展名(比 doc 86 的 371 多 22)。

4.3 Stub 模板

Agent 携带 20 个 Knex.js 模板,用于生成数据库查询代码:

  • stub/ — 4 种种子模板(coffee/eg/js/ts/ls/mjs)
  • stub1/ — 14 种高级模板(含 knexfile 系列、ts-schema、js-schema、cjs)

这些是 Node.js 库 knex.js 自带的 seed/migration 代码模板,iFlyCode 的 Agent 用它们来支持 SQL 功能。

4.4 SVG 图标集(12+1 个)

图标用途图标用途
logo_16.svg / logo_16_dark.svg插件 LogotoolWindow.svg / _dark.svg工具窗口
disabled.svg / disabled_dark.svg禁用状态not_sign_in.svg未登录
debug.svg / debug_dark.svg调试indexIcon.svg索引
stop.svg停止air_plane.svg飞机(不明)
replaceAll_dark.svg全部替换

5. 跨文档交叉验证与差异校正

5.1 doc 65 (WebView) — 差异

差异项doc 65 记录实际 (3.4.2-222)校正
Store 数量7 (chat, codeCheck, sql)6 个专用 Store 文件 + 主 Store 集成doc 65 高估
JS→Java 消息数~60+55实际值 55
中文字符串156更多(散落在 84 个 JS 文件中)doc 65 来自另一个版本的 bundle
Element UI 组件70+确认存在

5.2 doc 66 (Agent bundle) — 差异

差异项doc 66 记录实际 (3.4.2-222)校正
Agent Node.js 版本"Node.js <=12"v18.18.0⚠️ doc 66 严重错误
API 路由数67未重新计数(用 doc 66 数据)待验证
加密算法5 种 (RSA/SM2/SM4/AES/MD5)确认(agent.zip 中有 sm-crypto 0.3.13)
Snappy 用途未提及代码补全和大数据传输压缩补充

⚠️ 关键纠正: Agent 使用的 Node.js 版本是 v18.18.0,不是 doc 66 声称的 "<=12"。这是一个重大的版本差异——v18 vs v12 有 6 个主要版本的 API 差异(ES modules, fetch, worker_threads 稳定性等)。

5.3 doc 67/80 (H() 解码) — 实物验证

验证项结果
反编译代码中存在 v[] 序列✅ 确认(在 PluginComponentPanelBuilder 中有 new byte[])
226 个类调用 H()✅ 确认(grep -rl '\.H(' decompiled/ --include="*.java" = 226 文件)
无新解码器定义✅ 确认(新反编译 309 文件中无新 v[] 定义类)

结论:H() 分析完整,无遗漏。

5.4 doc 86 (资源目录) — 实物验证

条目doc 86 记录实物验证差异
fileExtensionLanguageMappings901901
languageFileExtensionMappings371393 (+22)⚠️ doc 86 缺 22 个
SVG 图标1212+1(webview)
Properties10+1010+10

5.5 doc 69 (i18n) — 实物验证

条目doc 69 记录实物验证差异
aicode.properties完整记录10 条
BasicActionsBundle完整记录10 条
Agent 中文文本 (1098)bundle 中有 1098 个中文未重新计数✅ 假设一致

5.6 doc 74 (安全审计) — 重要补充

安全项doc 74 记录补充修正
SSL 验证禁用"完全禁用"仅 OTel 开启时有效。默认 OTel 关闭 (aicode.otel.switch=false),风险降级
debugCode=9527后门实物未确认(需要验证 config.json 修改是否触发)
WebSocket 无认证本机任意进程可连新反编译的 PluginWebsocketClient.java 源码确认

6. 反编译质量评估

6.1 整体统计

指标数值
反编译 .java 文件总数413 (com.aicode) + 4 (Q) = 417
H() 调用的类226 (54.7%)
jadx 标记警告的类162
obfuscated 字段名类9
不完整反编译1 (compiled from: sh)

6.2 混淆字段名类清单(9 个)

这些类的字段名被重命名为 Java 关键字,需要对照字节码/常量池分析才能理解:

路径混淆程度
GeneratorConfig.javaaction/batch/ — 所有 14 个字段都为 f73..f87 模式
MethodGeneratorConfig.javaaction/batch/ — 同上模式
BatchUnitTestDialog.javaaction/batch/
BatchUnitTestTemplateService.javaaction/batch/
BatchUTGeneratorAction.javaaction/batch/
CoverageCompileStatusNotification.javaaction/batch/
ExcludeMethodConfigurable.javaaction/batch/
DiffService.javadiff/
TypeUtils.javautil/

6.3 使用建议

  • 反编译质量总体良好(jadx 1.5.0, restructure 模式)
  • 162 个 jadx 警告主要是 "Inconsistent decompilation" 标记,不影响字段和方法签名的正确性
  • 混淆的 9 个类的字段名需要对照 class_parser.py 的常量池输出来还原真实含义
  • H() 调用的 226 个类需要已有解码结果(doc 80)配合理解

7. 最终覆盖总结

7.1 覆盖矩阵

维度反编译前 (doc 1-36)doc 37-87 深化doc 88-102 完整反编译doc 103 批处理doc 104 最终清零
Java 类反编译0~104 (手动)~104413 (jadx)413
Agent index.js√ 详细
Agent worker.js✅ 首次分析
WebView JS bundle√ doc 65✅ 实物验证
Agent 二进制✅ 首次分析
原生模块 (.node/.wasm)✅ 首次分析
配置文件✅ 首次提取
跨文档交叉验证✅ 首次进行
反编译质量评估✅ 首次进行

7.2 已覆盖的全部知识点

  • Java Plugin 端: 413 个 .java 文件完整反编译
  • Agent Node.js: index.js 已分析(doc 66)+ worker.js 首次分析(doc 104)
  • WebView 前端: Vue 2.7.14 + 84 JS 文件 + 55 种消息类型确认
  • 加密算法: RSA(1024)/SM2/SM4/AES-256-CTR/MD5 完整提取
  • H() 混淆: 完全破解,4628 次调用 91.5% 解码率
  • 通信协议: WebSocket + HTTPS + SSE + JS Bridge 全部覆盖
  • Agent 二进制: Node.js v18.18.0 确认,5 平台,89MB 定制版
  • 模板系统: Velocity + Knex.js + 20 stub 模板首次提取
  • 配置系统: OTel 默认关闭、补全超时 10s、版本信息全部确认
  • 安全审计: 12 个风险项记录,OTel SSL 评论加入限定条件
  • 跨 IDE 差异: IDEA/VSCode/Eclipse 三 Bridge、ActionScope 谓词系统
  • 反编译质量: 混淆类 9 个、警告 162 个、H() 调用 226 个

7.3 剩余风险(仅静态分析的限制)

#局限说明
1无动态验证所有结论来自静态源码分析,未通过实际运行插件验证数据包交互
2Agent 二进制未完整逆向89MB Linux node 二进制未做完整逆向,仅做了版本识别和 strings 扫描
3未登录的 SSO 流程认证流程仅分析了代码逻辑,未实际抓包验证 token 获取
4数据库加密子系统DES3/AES/RC4 数据库加密在 doc 100 中提及但未被完整调用链追踪
5FeatureProbe 特征开关package.json 中有 featureprobe-server-sdk-node,目的未确认
6SM2/AES-256-CTR 的实际调用doc 100 称"当前无业务调用",未用代码引用计数验证

8. 统计数据汇总

指标数值
专题文档104 / 104
com.aicode Java 反编译413 .java 文件 (68 个包)
H() 解码器定义类7 (无新增)
H() 调用类数226
反编译警告162
混淆字段名类9
WebView JS 文件84
JS→Java 消息类型55
Agent 二进制5 平台 (Node.js v18.18.0)
tree-sitter 语言10
扩展名映射表901 + 393 (JSON)
stub 模板20
SVG 图标13
开源依赖 (package.json)38 npm packages
外部 Java 依赖20+ (OkHttp, OTel, Gson, Hutool, Kotlin stdlib)

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