-
-
[原创]勒索病毒样本分析
-
发表于: 19小时前 117
-
勒索病毒样本分析
本次针对某绒面试提供的真实病毒样本,结合沙箱、Process Monitor 和 x32dbg,重点分析了副本释放、持久化、文件感染及勒索窗口相关行为,并定位了宿主文件的核心解密循环,当前报告侧重行为链和关键代码验证,尚未覆盖所有执行分支。反调试的具体作用、各副本的协作条件、感染筛选与重复感染判断,以及不同感染文件的恢复适用性,仍需进一步分析。
阅读导航
- 第 1 节:沙箱与初步行为观察。
- 第 2 节:主样本调试、宿主解密循环与伪装逻辑。
- 第 3 节:
BgcEwAcE.exe的文件处理记录。 - 第 4 节:
bAsMcgoE.exe的属性操作与窗口观察。 - 第 5–6 节:原始 PML 交叉复核、尚缺证据与验证计划。
- 第 7 节:恢复原文件、拦截进程创建及新增窗口拦截脚本。
- 第 8 节:官方接口参考。
1. 沙箱与初步行为观察
1.1 样本准备与分析平台
拿到的文件使用 .ex_ 扩展名。在隔离虚拟机中将扩展名改为 .exe,便于工具识别。更改扩展名不等于转换文件格式;文件是否为 PE 应通过 MZ、PE 签名和头部结构确认。本文使用微步沙盒辅助观察。
以下为笔记中列出的分析平台,未逐一验证其当前服务状态:
- 微步沙盒:5f6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6i4K6u0W2N6r3S2J5k6h3q4@1j5X3!0G2K9#2)9J5k6h3y4F1i4K6u0r3
- 腾讯哈勃分析系统:4b1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Z5j5h3u0G2i4K6u0W2M7i4q4Q4x3X3g2U0L8$3#2Q4x3V1j5`.
- 魔盾:23bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2E0j5h3I4V1N6h3&6Q4x3X3g2U0L8$3#2Q4x3V1k6S2L8X3q4D9P5i4y4A6M7#2)9J5c8R3`.`.
- 微点沙盒:51bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6j5h3&6V1j5X3!0^5i4K6u0W2k6r3g2H3N6r3S2K6k6h3y4Q4x3X3g2U0L8$3#2Q4x3X3g2U0L8W2)9J5c8X3W2F1k6r3g2^5i4K6u0W2M7r3S2H3i4K6u0r3
- 奇安信文件深度分析平台:e70K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6j5h3&6V1j5X3!0^5i4K6u0W2N6r3W2Q4x3X3g2I4K9h3q4F1P5r3W2F1i4K6u0W2j5$3!0E0i4K6u0r3M7$3q4F1k6r3u0G2P5q4)9J5c8Y4m8S2k6$3f1`.
- ANYRUN:5f5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2M7s2m8Q4x3X3g2S2L8Y4W2Q4x3X3g2J5N6h3&6Q4x3V1j5`.
- HybridAnalysis(Falcon Sandbox):e35K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2Z5P5h3u0J5K9h3c8Q4x3X3c8S2L8X3q4D9P5i4y4A6M7#2)9J5k6h3y4G2L8g2)9J5c8R3`.`.
- CAPE Sandbox:820K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0j5i4m8W2M7$3q4F1k6r3u0G2P5q4)9J5k6h3y4G2L8g2)9J5c8R3`.`.
- BD沙箱分析器:448K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2T1K9i4c8V1k6h3k6W2L8X3c8W2M7W2)9J5k6h3y4G2L8g2)9J5c8X3u0#2M7$3W2F1k6i4y4K6i4K6u0r3k6h3&6@1k6i4u0H3M7X3W2K6k6g2)9J5k6s2m8J5L8$3c8#2j5%4c8K6i4K6u0r3M7$3q4F1k6r3u0G2P5q4)9J5k6r3q4F1j5h3I4&6P5X3g2J5i4K6u0W2K9s2c8E0L8l9`.`.
1.2 沙箱报告

1.3 使用 Process Monitor 捕获运行行为
在隔离虚拟机中运行样本并使用 Process Monitor 采集,观察文件创建、进程启动及注册表操作。

运行记录中出现多个 EXE 副本和 BAT 脚本。挂起不同副本可辅助观察行为变化,通过对这些程序的挂起可以确定,后续的恶意行为(感染)主要由这些实例执行,而主线程主要用来解密产生这些文件的,
本次与.PML文件 对照,大量文件替换由 BgcEwAcE.exe 执行;bAsMcgoE.exe 明确出现自启动、伴随文件映射和周期性属性检查。其他调试批次的职责应分别确认,不能仅凭文件名套用。
比如说,这里搜索的创建进程

可以看到可疑副本及 BAT 相关启动记录。这里“释放/生成文件”不一定等于解压;需结合文件写入、命令行和进程启动结果区分。

出现了伪装执法机构的勒索界面。界面自称使用“4096-bit key”,这是攻击者的界面宣称,不能作为实际加密算法的证明。
1.4 沙箱信息提供
沙箱报告可提供后续动调的线索,但不能代替调用参数、返回值和分支证据。

这说明很有可能存在反调试

这张本地截图实际显示的是“通过创建服务实现自启动”,支持服务持久化线索,不能作为自解密证据。自解密应另外提供代码/数据的前后变化及执行流证据。
在看这个样本的行为,我们这里主要看的是win10的,别的系统版本和win10的不同
我们观察到图标生成与多类文件处理。PML 涉及 EXE、JPG、PNG 和 P12 等目标;

用了这么多api看一下他的导入表
导入表较少或动态调用较多,可能涉及运行时 API 解析;仅凭导入表和节权限,不能直接判定使用某种壳。

看到这里就差不多了,进入x32dbg吧
2. x32dbg:主样本、宿主解密与伪装逻辑
2.1 确定壳与入口与控制流观察
分析病毒是否加壳

信息熵7.9,.text段高度混淆,被启发式识别,显然加壳。
入口附近存在大量跳转。可从明确的运行行为定位相关 API,再回到样本侧分析调用链;大量 JMP 可以推测是某种壳或保护。

2.2 确定反调试线索
IsDebuggerPresent

存在,进行反反调试,使用相应的插件试试,ScyllaHide插件是一个很好的选择
2.3 根据内存和文件行为设置观察点
通常来说:解密后的代码需要一个安身之所,通常是一个具有可执行权限的新内存区域**VirtualAlloc**
代码段(.text)通常是只读的。要往里面写入解密后的代码,必须先获得“写”权限VirtualProtectReadProcessMemory / WriteProcessMemory:这对 API 常用于跨进程操作,要是不是跨进程的就是WriteFileCreateThread创建一个新线程来执行解密后的代码
创建一个新的进程来运行病毒
可将下列接口作为候选观察点:
| 观察点 | 可确认的动作 | 不能直接推出的结论 |
|---|---|---|
VirtualAlloc |
申请/提交内存;需看大小、权限和返回值 | 不一定用于解密,也不一定需要申请新区域 |
VirtualProtect |
修改已提交内存页权限 | .text 权限以实际页属性为准;修改权限不等于已经写入代码 |
ReadProcessMemory / WriteProcessMemory |
通过进程句柄读写地址空间 | 不能仅凭函数名认定跨进程注入 |
| 普通汇编内存写入 | 当前进程直接修改自己的缓冲区 | 不需要调用 WriteFile |
WriteFile |
把缓冲区内容写入句柄所指对象 | 不等于向本进程内存写入 |
CreateThread |
创建线程,需看线程入口 | 不一定执行解密后的代码 |
CreateProcessA/W |
尝试创建进程,需看返回值及新 PID | 不等于解密完成,也不等于已经执行成功 |
搜索有没有相应的api
存在
VirtualProtect,并下断点
但是这个具体的效果不大存在
VirtualAlloc,下断存在
WriteFile,下断观察
CreateThread。观察
CreateProcessA/W。
2.4 内存分配与落盘观察
命中 VirtualProtect ,可以看他的参数,检查目标地址、区域大小、原权限、新权限及返回值。返回成功才能确认该次权限修改生效。

根据VirtualAlloc可知,进行了命中了39次,根据传参可知申请空间大小
根据WriteFile,他要往里面写入解密信息,我们并不确定是不是一次性全部写入目标地址,但是如果是一次就写入的可运行文件,他会直接调用CreateProcess,多次写入,他就会多次调用WriteFile,最后才使用CreateProcess,但是如果是加密文件,他不一定会调用CreateProcess,但是他一定会使用WriteFile
2.5 WriteFile 参数与 PE 缓冲区
下表仅适用于 32 位 WriteFile API 入口、尚未执行函数序言时 的栈布局;
| 栈位置 | 参数 | 本次值 | 含义 |
|---|---|---|---|
[esp+4] |
hFile |
00000278 |
目标对象句柄;路径需从创建/打开记录关联 |
[esp+8] |
lpBuffer |
048E0000 |
源数据缓冲区地址 |
[esp+C] |
nNumberOfBytesToWrite |
00000600 |
写 1536 字节 |
[esp+10] |
lpNumberOfBytesWritten |
0045E7FD |
实际写入字节数的存放地址 |
[esp+14] |
lpOverlapped |
00000000 |
未提供 OVERLAPPED;还应核对句柄是否按异步方式打开 |
第一次命中,

可以发现堆栈

跟进写入数据的缓冲区,发现:
展开:048E0000 缓冲区原始转储(保留完整记录)
048E0000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ..........ÿÿ..
048E0010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ¸.......@.......
048E0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0030 00 00 00 00 00 00 00 00 00 00 00 00 B8 00 00 00 ............¸...
048E0040 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 ..º..´.Í!¸.LÍ!Th
048E0050 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F is program canno
048E0060 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 t be run in DOS
048E0070 6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 mode....$.......
048E0080 65 0D A3 87 21 6C CD D4 21 6C CD D4 21 6C CD D4 e.£.!lÍÔ!lÍÔ!lÍÔ
048E0090 AF 73 DE D4 2B 6C CD D4 21 6C CD D4 20 6C CD D4 ¯sÞÔ+lÍÔ!lÍÔ lÍÔ
048E00A0 52 69 63 68 21 6C CD D4 00 00 00 00 00 00 00 00 Rich!lÍÔ........
048E00B0 00 00 00 00 00 00 00 00 50 45 00 00 4C 01 03 00 ........PE..L...
048E00C0 F8 2D AB 54 00 00 00 00 00 00 00 00 E0 00 0F 01 ø-«T........à...
048E00D0 0B 01 05 0C 00 BA 06 00 00 04 00 00 00 00 00 00 .....º..........
048E00E0 00 10 00 00 00 10 00 00 00 D0 06 00 00 00 40 00 .........Ð....@.
048E00F0 00 10 00 00 00 02 00 00 04 00 00 00 00 00 00 00 ................
048E0100 04 00 00 00 00 00 00 00 00 F0 06 00 00 06 00 00 .........ð......
048E0110 00 00 00 00 02 00 00 00 00 00 10 00 00 10 00 00 ................
048E0120 00 00 10 00 00 10 00 00 00 00 00 00 10 00 00 00 ................
048E0130 00 00 00 00 00 00 00 00 20 D0 06 00 50 00 00 00 ........ Ð..P...
048E0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0190 00 D0 06 00 20 00 00 00 00 00 00 00 00 00 00 00 .Ð.. ...........
048E01A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E01B0 2E 74 65 78 74 00 00 00 00 C0 06 00 00 10 00 00 .text....À......
048E01C0 00 BA 06 00 00 06 00 00 00 00 00 00 00 00 00 00 .º..............
048E01D0 00 00 00 00 20 00 00 60 2E 72 64 61 74 61 00 00 .... ..`.rdata..
048E01E0 00 10 00 00 00 D0 06 00 00 02 00 00 00 C0 06 00 .....Ð.......À..
048E01F0 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 40 ............@..@
048E0200 2E 64 61 74 61 00 00 00 74 01 00 00 00 E0 06 00 .data...t....à..
048E0210 00 02 00 00 00 C2 06 00 00 00 00 00 00 00 00 00 .....Â..........
048E0220 00 00 00 00 40 00 00 C0 00 00 00 00 00 00 00 00 ....@..À........
048E0230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0250 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0270 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0290 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E02A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E02B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E02C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E02D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E02E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E02F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0310 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0320 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0330 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0350 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0370 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0380 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0390 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E03A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E03B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E03C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E03D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E03E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E03F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0400 6A 00 68 05 30 40 00 68 00 30 40 00 6A 00 E8 17 j.h.0@.h.0@.j.è.
048E0410 04 00 00 6A 00 E8 16 04 00 00 E8 17 04 00 00 E8 ...j.è....è....è
048E0420 1E 04 00 00 E8 13 04 00 00 C3 00 00 00 00 00 00 ....è....Ã......
048E0430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0440 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0450 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0460 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0470 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0480 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0490 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E04A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E04B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E04C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E04D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E04E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E04F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0500 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0510 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0520 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0530 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0540 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0550 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0560 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0570 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0580 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E0590 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E05A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E05B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E05C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E05D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E05E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
048E05F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
该缓冲区以 MZ 开头,并包含 PE\0\0 和节表,可判断正在输出 PE 相关内容。0x600 是本次请求写入长度,不是整个 PE 的长度,也不能仅凭它判断整个文件已解密。对缓冲区设置写入观察点可追查数据来源,但命中位置可能是解密,也可能只是复制或 PE 头构造。
再次按 F9 运行至 CreateProcess,笔记记录命中 4 次。这只能说明观察到了 4 次进程创建调用;需要按返回地址、参数和返回值去重,不能推出存在 4 次分段解密。

并且保存位置

为观察新建子样本,可在 CreateProcessA/W 入口检查第六个参数 dwCreationFlags,保留已有标志并按位 OR 0x4(CREATE_SUSPENDED)。这使新进程的主线程初始挂起,不是取消进程创建,也不会暂停当前进程或其他已运行副本。其他 CreateProcess 变体的参数位置不同,不可照搬。应另外记录输出文件是否完整落盘及哈希,不能仅凭挂起判定成功脱壳。
2.6 主样本继续生成副本和释放宿主
暂不进入子样本,继续观察下一次 CreateProcess 的参数与对应生成文件。是否为另一个病毒子样本

再次运行,直到下次CreateProcess,发现一个文件sample,这里就要想了,为什么会生成这个文件


这里我直接在CreateFile下断,一步步跟,最终发现了病毒创建文件的地方

在WriteFile处下断点

这里可以看到42 4D------BM,通过查找发现是.bmp的标志头
接下来就是要还原解密出被感染文件了,我们要找出它的解密逻辑,先看他要在哪里写WriteFile 的第一个参数是目标对象句柄 hFile,第二个参数 lpBuffer 才是要观察的源缓冲区地址;具体文件写入偏移由文件指针或 OVERLAPPED 等决定。
2: [esp+8] 00469452 sample.00469452 "BM妇"
2.7 定位 BMP 缓冲区与记录指令流
对本次 lpBuffer = 00469452 设置硬件写入断点,并且重新运行可以直接抓到解密后开始往里面写的位置,我试着运行一下,但是我发现他并没有往里面写入解密的信息,说明有可能他是在后面直接进行解密的,多次尝试F9,直到写入的内存位置是感染文件的标志,最后在第一次下段的地方直接用步进直到条件满足,这里罗列一下我的条件
以下保留当时使用的条件。它适合截取循环片段,不能当作已经记录完整解密过程的证明:
- 暂停条件:
cip == 0x00401815。

- 日志文本:
0x{p:cip} {i:cip} | EAX={p:eax} ECX={p:ecx} EDX={p:edx} ESI={p:esi} EDI={p:edi} ESP={p:esp}。 - 日志条件:
1(每条被追踪指令均记录)。 - 最大步数:
10000(当时设置的)。
提示:
00401815位于循环内部,会在某次迭代中就达到暂停条件,并非整轮结束地址。若本次确实执行0x2FB7次、每次 8 条指令,单循环约需 97,720 条指令,10,000 步不足以记录全程。我这里是恰好“验证一轮变换”,并记录初始与最终寄存器。
2.8 宿主块 DWORD 解密循环
下面是直接将日志给到啊AI。AI 可辅助整理,但报告应附原始 .log、输入/输出片段和独立校验。这里的“参数化算法”与后面汇编是同一个循环的两种表述,不是两层独立算法;外层混淆应另行说明。
for (i = 0; i < 0x2FB7; i++) {
uint32_t x = buffer[i];
x ^= 0x6034E9B7;
x = ROR32(x, 23);
buffer[i] = x;
}
本次参数(不可直接套用另一感染文件):
Key = 0x6034E9B7
Rotate = 0xB7 & 0x1F = 23
DWORD数 = 0x2FB7 = 12215
总长度 = 0x2FB7 * 4 = 0xBEDC
解密区起始地址 = 0x00469432
BMP 数据起始地址 = 0x00469452
BMP 数据长度 = 0x0000BEB8 = 48824 字节
对应的核心汇编片段如下。代码地址、加密块地址和最终 BMP 地址是不同概念:
0040180D mov ebx, dword ptr ds:[esi]
0040180F xor ebx, ecx
00401811 ror ebx, cl
00401813 mov dword ptr ds:[esi], ebx
00401815 add esi, 4
00401818 inc edi
00401819 cmp edi, edx
0040181B jnz 0040180D
for (;;) {
uint32_t x = *(uint32_t *)esi;
x ^= ecx;
x = _rotr(x, ecx & 31);
*(uint32_t *)esi = x;
esi += 4;
edi++;
if (edi == edx)
break;
}
该片段明确给出了每个 DWORD 的 XOR + ROR 变换,但尚不足以单独证明已具备通用文件恢复能力。仍需补全外层解码、宿主块定位、每文件密钥与长度获取、元数据剥离、计数/校验检查,以及实际恢复结果验证。此前脚本曾出现“宿主块密钥/校验和不匹配”,因此本报告不将真实样本恢复写为已完成。
这时候他的解密逻辑就完全了,可以通过这些写一个脚本将一个感染文件给还原出来了
2.9 扩展名、图标与宿主打开尝试
当资源管理器隐藏已知文件类型的扩展名,且感染后的 EXE 使用类似原文件的图标时,外观可能具有欺骗性。这取决于资源管理器显示设置和图标资源,不是 Windows 主题本身。
这里其实在CreateProcess那一步,.bat文件就已经提醒了,这是一个会伪装的病毒,我在这里说一下他的逻辑吧:
对于一个没有设置后缀名的系统主题,一个被病毒感染的文件,伪装出来的.exe文件和正常的.bmp图片看起来是一样的,并且当你再点击这两个相同的文件,他都会启动,为什么病毒会启动图片呢,这个.bat文件就是启动项,所以这就是病毒的伪装逻辑

看,后面的文件还试图关闭文件扩展名
3. x32dbg:BgcEwAcE.exe 文件处理记录
3.1 分析目标与运行批次
前次 PML 显示,BgcEwAcE.exe(PID 4632)直接进行了临时 ICO/EXE 生成及大量文件替换,可能是感染行为
3.2 尝试启动伴随副本
对 BgcEwAcE.exe 的 CreateProcess 下断,观察到尝试启动 bAsMcgoE.exe。发现和沙箱中的执行流对的上,会再次生成一个bAsMcaoE

与沙箱可见行为存在相似之处,但仍需按本次调用参数和结果关联。

沙箱中出现多个文件。而且这几个文件并没有运行,我们要搞清楚这些文件是在干什么。
观察ProcessMonitor,在我抓取的.PML文件中,是存在CreateFIle与CloseFile这两个事件名称的,先找一找有没有api,先从CreateFile中找,因为这个api会打开文件,一般病毒会在我们的文件里面动手脚,所以他一定会打开文件
第一次打开

第二次打开

第三次打开

第四次观察到可疑文件相关访问;是否为新建文件,要核对创建方式、返回值和 OpenResult。

之后可以看见这个样本开始找本机的文件,一个图片

后续还出现 OeskIQIQ 相关文件访问。仅凭路径或 CreateFile 命中,不能确认已经写入内容,需要补充写入事件/缓冲区和返回值。

再往后又会打开我的图片,再次尝试运行子样本
之后开始获取我的电脑文件

随后再次观察进程创建尝试。

是否启动成功,还需核对返回值和新 PID。
之后他会再次获取我的电脑文件

下面这张本地截图显示 \\.\Global\vmhgfs 设备路径及 vmhgfs.NPOpenEnumEntr+76 相关返回位置,属于设备/共享文件系统相关访问线索,不是进程启动证据。是否用于环境探测仍需调用链支持。

3.3 手工调用记录与重复启动现象
继续观察,直到最后出现

这个是个关键点,当我们电脑中毒后点击桌面上文件,就会出现这个提示框,之后再次运行,这是我的抓去过程,很乱,重新整理一下
CreateFile :057FDBA8 04D40000 L"C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Extensions\\nmmhkkegccagdldgiimedpiccmgmieda\\1.0.0.6_0\\images\\flapper.gif"---------------------5D4
ReadFile: 5D4
CreateFile: 0522D2 0522DF0C L"KMUI.ico"
WriteFile: 648
WriteFile: 648
WriteFile: 648
CreateProcess: bAsMcgoE
051EF2 051EF4F0 L"TcoY.exe"
WriteFile
WriteFile
WriteFile
WriteFile
CreateProcess:bAsMcgoE
这里可以大致看出来他的逻辑
0571EC 0571F008 L"wUYO.exe"
057FDBA8 04D40000 L"C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Extensions\\nmmhkkegccagdldgiimedpiccmgmieda\\1.0.0.6_0\\images\\flapper.gif"
051EF6A4 04D80000 L"D:\\Everything\\Everything.exe"------------614--1000
056FEA 05230000 L"D:\\FlClash\\data\\flutter_assets\\assets\\images\\avatar\\arue.jpg"
ReadFile: 640----7000
056FF4 05230000 L"D:\\IDA_Pro_9.2\\dbgsrv\\win32_remote32.exe"
0583F9 05230000 L"E:\\python-3.13.16-amd64.exe"
05A3F8 05A3F8B0 L"\\\\.\\Global\\vmhgfs"
可以通过这个和ProcessMonitor简单分析出来
上述记录中应把文件访问与进程启动分开:CreateFile 仅用于打开/创建对象;只有实际命中 CreateProcess 等创建接口,并结合返回值和新 PID,才能确认启动行为。调试中多次出现 bAsMcgoE.exe 的启动尝试,具体重试原因仍需分析调用前的判断分支。

结合.PML进程抓取可知可能大概是:
读取原文件、查询大小
↓
生成临时 ICO、随机名 EXE
↓
临时文件重建并替换随机名 EXE
↓
将生成结果写回目标位置
↓
非 EXE 目标删除原件,清理临时文件
↓
继续处理下一个文件,
说明这个程序他跟本就不是锁我们屏幕的程序,沙箱里没有这个东西可能就说明这时bAsMcgoE已经运行起来了,所以之后没有这个行为的分析了
4. x32dbg:bAsMcgoE.exe 属性操作与窗口观察
本节观察 bAsMcgoE.exe 的自启动、伴随文件、周期检查与窗口行为。不能直接从上一个副本尝试启动它,推出“真正感染逻辑只在它里面”。前次 PML 的直接文件替换证据属于 BgcEwAcE.exe;若本次动调还发现 bAsMcgoE 处理用户文件,应另外记录该运行批次的 PID、线程与完整操作链。


通过这个两个Monitor可以看到他的行为与沙箱报告基本一致,但是我还是想进去看一下他的自启动、状态文件和周期检查与锁屏逻辑
4.1 文件和目录属性
重点观察 GetFileAttributesW、SetFileAttributesW 的路径、标志、返回值及调用后的条件分支。

调用 SetFileAttributesW 修改文件或目录属性:

第二个参数是指文件属性 0x6 = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM 样本正在尝试把 C:\Users\Administrator\xQsEgUYY 设置为隐藏 + 系统属性
调用 GetFileAttributesW 查询文件或目录属性:

调用 SetFileAttributesW 修改文件或目录属性:

调用 GetFileAttributesW 查询文件或目录属性:

调用 GetFileAttributesW 查询文件或目录属性:
04BEFF 047A0000 L"C:\\ProgramData\\siMUkQEc"
04BEFF 047A0000 L"C:\\ProgramData\\siMUkQEc"
04BEFF 04770000 L"C:\\ProgramData\\siMUkQEc\\OeskIQIQ.exe"
04E6F4 07320000 L"C:\\$Recycle.Bin\\S-1-5-21-2007155649-3056361496-518139155-500\\$I0GJIPS.exe"
04E6F4 07320000 L"C:\\$Recycle.Bin\\S-1-5-21-2007155649-3056361496-518139155-500\\$I0GJIPS.exe"--------------------------------清除文件的只读、隐藏、系统属性,为后续文件操作做准备。
04BEFF 04700000 L"C:\\ProgramData\\AQIgwIcg\\BgcEwAcE.exe"
$+A1F52C 0 04E60000 L"C:\\ProgramData\\AQIgwIcg\\BgcEwAcE.exe"-------------这时候我没有打开BgcEwAcE,在上一步中尝试创建进程,这一步是在看这个子样本的属性
04BEFF6C 04700000 L"C:\\ProgramData\\AQIgwIcg\\BgcEwAcE.exe"-------------这一步之后又在尝试打开子样本进程
0560DBC0 04D40000 L"C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Extensions\\nmmhkkegccagdldgiimedpiccmgmieda\\1.0.0.6_0\\images\\flapper.gif"
04BEFF40 047A0000 L"C:\\ProgramData\\siMUkQEc"
04BEFF40 04770000 L"C:\\ProgramData\\siMUkQEc\\OeskIQIQ.exe"
04BEFF6C 04700000 L"C:\\ProgramData\\AQIgwIcg\\BgcEwAcE.exe"-------------这里我感觉他的整个运行逻辑和另一个病毒样本运行时CreateFile获取文件的是一样的
---------------------------------------------------------------这里又在尝试打开子样本进程
0584F6B8 04D50000 L"D:\\Everything\\Everything.exe"
04BEFF40 047A0000 L"C:\\ProgramData\\siMUkQEc"
04BEFF40 04770000 L"C:\\ProgramData\\siMUkQEc\\OeskIQIQ.exe"
04BEFF40 04770000 L"C:\\ProgramData\\siMUkQEc\\OeskIQIQ.exe"
04BEFF6C 04700000 L"C:\\ProgramData\\AQIgwIcg\\BgcEwAcE.exe"--这里又在尝试打开子样本进程
055CEA78 04D50000 L"D:\\FlClash\\data\\flutter_assets\\assets\\images\\avatar\\arue.jpg"
04BEFF40 047A0000 L"C:\\ProgramData\\siMUkQEc"
04BEFF40 04770000 L"C:\\ProgramData\\siMUkQEc\\OeskIQIQ.exe"
04BEFF6C 04700000 L"C:\\ProgramData\\AQIgwIcg\\BgcEwAcE.exe"--这里又在尝试打开子样本进程
051EF448 04D50000 L"D:\\IDA_Pro_9.2\\dbgsrv\\win32_remote32.exe"
04BEFF40 047A0000 L"C:\\ProgramData\\siMUkQEc"
04BEFF40 04770000 L"C:\\ProgramData\\siMUkQEc\\OeskIQIQ.exe"
04BEFF6C 04700000 L"C:\\ProgramData\\AQIgwIcg\\BgcEwAcE.exe"--这里又在尝试打开子样本进程
051EF930 04D50000 L"E:\\python-3.13.16-amd64.exe"
04BEFF40 047A0000 L"C:\\ProgramData\\siMUkQEc"
04BEFF40 04770000 L"C:\\ProgramData\\siMUkQEc\\OeskIQIQ.exe"
04BEFF6C 04700000 L"C:\\ProgramData\\AQIgwIcg\\BgcEwAcE.exe"
04BEFF40 047A0000 L"C:\\ProgramData\\siMUkQEc"
04BEFF40 04770000 L"C:\\ProgramData\\siMUkQEc\\OeskIQIQ.exe"
调用 SetFileAttributesW 修改文件或目录属性:
04BEFF 047A0000 L"C:\\ProgramData\\siMUkQEc"
04BEFF 00000006
04BEFF 04770000 L"C:\\ProgramData\\siMUkQEc\\OeskIQIQ.exe"
04BEFF 00000006
04E6F4 07320000 L"C:\\$Recycle.Bin\\S-1-5-21-2007155649-3056361496-518139155-500\\$I0GJIPS.exe"
04E6F4 00000020
0560F444 04E60000 L"C:\\ProgramData\\AQIgwIcg\\BgcEwAcE.exe"
0560F448 00000080 ------------------------------------------------这一步是获取子样本属性后的一步,属性变成了普通状态
0584F6B8 04D50000 L"D:\\Everything\\Everything.exe"
0584F6BC 00000080
0584F6B8 04D50000 L"D:\\Everything\\Everything.exe"
0584F6BC 00000020
055CEA74 04D50000 L"D:\\FlClash\\data\\flutter_assets\\assets\\images\\avatar\\arue.jpg"
055CEA78 00000080
055CEA74 04D50000 L"D:\\FlClash\\data\\flutter_assets\\assets\\images\\avatar\\arue.jpg"
055CEA78 00000020
051EF444 04D50000 L"D:\\IDA_Pro_9.2\\dbgsrv\\win32_remote32.exe"
051EF448 00000080
051EF444 04D50000 L"D:\\IDA_Pro_9.2\\dbgsrv\\win32_remote32.exe"
051EF448 00000020
以上保留当时手工抓取的顺序。原始记录中的“清除属性”“尝试打开进程”等注释含有推断:GetFileAttributesW 只查询文件属性,不会清除属性或打开进程。SetFileAttributesW 参数 0x6 表示隐藏+系统,0x20 表示归档,0x80 表示普通属性;设置是否成功还需看返回值。文件属性不表示进程是否运行、被挂起或具有 SYSTEM 身份。
从文件访问顺序相似,不能直接推出两个副本的线程、职责或配置完全相同。
4.2 勒索窗口创建与显示
CreateWindowExA:

HWND hWnd = CreateWindowExA(
0, // 扩展窗口样式
"JekMcsYw", // 窗口类名
"CscEcsc", // 窗口标题
WS_POPUP, // 弹出式窗口
0, // X
0, // Y
1414, // 宽度
890, // 高度
NULL, // 父窗口
NULL, // 菜单
(HINSTANCE)0x400000,// 实例句柄
NULL // 附加参数
);
ShowWindow:

BOOL ShowWindow(
HWND hWnd,
int nCmdShow
);
多次调试中:允许一次伴随进程创建后,也就是子样本,继续运行至 UpdateWindow 附近,观察到勒索界面出现。这是时间上的先后关系,尚不能证明伴随进程是显示窗口的必要条件。
CreateWindowExA 负责创建窗口;ShowWindow 请求显示;UpdateWindow 在更新区域非空时直接触发 WM_PAINT。因此画面在 UpdateWindow 后显现,可能是窗口内容此时才绘制,并不说明该函数本身完成“锁屏”。需要记录 HWND → 所属 PID/TID → 窗口过程,并检查置顶、尺寸和输入控制机制。

以下保留当时的断点截图。后续应按 PID/TID 和样本侧调用返回地址关联。

[招生]科锐逆向工程师培训(2026年11月13日实地,远程教学同时开班, 第57期)