与亿赛通 CDG 搏斗

/ dousha99

不是哥们,我程序怎么就莫名奇妙地崩了呢?

先简单说一下这是个什么玩意:

亿赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全防护软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产。

我就先按下公司配置的漏洞导致实际上任何想整活的人都有办法拿走加密文件这种事情不表;我也按下这货加解密的速度慢到一种境界导致工程编译时间长了 20 倍不止不表。我今天要来吐槽的,是这货干碎了 vcpkg

如果你在用 vcpkg 的时候莫名奇妙地遇到了 0xc0000135 错误,而且装了各种 VC++ 运行库都没卵用,那么基本可以确定是亿赛通搞的问题。我知道你已经给各个编译工具上好解密权限了,但就是这个解密权限导致程序在这个状态下无法导入一个关键 DLL——

DynamicDll64.dll

CDG 的工作原理分两步,一步是内核驱动 FileLock(64)?.dll 做的一些神秘工作,另一步是注入一个 DLL 到有权限读取明文的程序中来做透明解密操作。

那我请问了,你就不能行行好直接让你的内核驱动决定一个程序能不能读明文,然后在内核里面就把数据解密好么?非得注入一个 DLL 到我的程序里是嫌这个世界不够乱么?哪怕钩 FltCreateFile(Ex)?FltReadFile(Ex)? 就已经足够玩了啊!

好吧,为了尽可能减少跟某些杀毒软件打架的可能性,以及不一直拖着内核,选择直接注入应用程序本身,说实话也无可厚非。但在 vcpkg 下面:

你的 PATH 不是我的 PATH

vcpkg 在启动编译环境的时候会有意给它调用的所有工具设置 PATH 为非常精简的干净环境,但是亿赛通的这个 DLL 又是需要通过 PATH 加载的。这就导致在 vcpkg 环境下工作的需要解密权限的程序会直接因为找不到依赖而爆掉。

你可以通过设置 VCPKG_KEEP_ENV_VARS=PATH 的环境变量让 vcpkg 继承全局的 PATH. 但是使用精简的 PATH 在大多数情况下都是需要做的,否则你电脑上安装的其他东西可能会带跨整个编译过程。比如 Strawberry Perl 是自带一个 ccache 的,如果你让 vcpkg 继承你大环境中的 PATH 就会导致怪事发生。

永久的临时解决方案

DynamicDll.dllDynamicDll64.dll 复制一份到 C:\Windows 下面。当然,最好是用 mklink 命令创建符号链接,这样至少这个鬼玩意更新之后你不需要再手动复制一份文件过去。

考虑到 FileLock.dllFileLock64.dll 本身就是被亿赛通塞到这个路径下的,我就实在猜不到为什么他们不干脆也把 DynamicDll.dllDynamicDll64.dll 一并塞进来了。就这样吧,至少这么操作一波之后它能用了。

正在加载评论……

发表评论

您的评论将由管理员审核后方可公开显示。

Your comments will be submitted to a human moderator and will only be shown publicly after approval.