深入解析:OneDrive日志加密机制与逆向分析技术揭秘

本文详细探讨了微软OneDrive日志格式的重大变更,从原有的混淆字符串映射转向基于AES-CBC模式的加密机制,并通过逆向工程分析LoggingPlatform.dll揭示了其加密实现细节与密钥存储方式。

Yogesh Khatri的取证博客

一切与取证和安全相关的事

页面

  • 主页
  • 关于

2022年11月4日,星期五

解读OneDrive日志(第二部分)

在上篇关于OneDrive的博文中,我概述了ODL文件格式的结构,并创建了一个可运行的ODL解析器来读取这些文件。其中一个关键细节是,个人文件/文件夹、位置或凭证标识字符串是如何被混淆的,其原始值存储在ObfuscationStringMap.txt文件中。然而,大约在2022年4月,微软决定改变混淆的工作方式,导致解析器(去混淆部分)不再有效。

发生了什么变化? OneDrive现在似乎对数据进行加密,不再使用ObfuscationStringMap.txt文件。在较旧的安装中该文件可能仍然存在,但较新的安装包含一个不同的文件。

图1 - \AppData\Local\Microsoft\OneDrive\logs\Business1 文件夹内容 如上图1所示,出现了一个名为general.keystore的新文件。此文件是JSON格式,易于读取,显然其中包含一个base64编码的字符串,是解密加密内容的关键。

图2 - general.keystore内容示例

进行一些逆向工程的时候了 通过对OneDrive中的LoggingPlatform.dll文件使用IDA Pro进行一番挖掘,我们可以看到该文件中使用了BCrypt Windows API。请注意,这不是同名的bcrypt哈希算法!

图3 - LoggingPlatform.dll中的BCrypt*导入 跳转到使用这些函数的地方,很快就清楚所使用的加密是CBC模式的AES,密钥大小为128位。

图4 - IDA Pro反汇编 在上述代码片段中,我们可以看到对BCryptAlgorithmProvider的调用,如果成功,随后会调用BCryptSetProperty函数,该函数语法如下:

1
2
3
4
5
6
7
NTSTATUS BCryptSetProperty(
  [in, out] BCRYPT_HANDLE hObject,
  [in]      LPCWSTR       pszProperty,
  [in]      PUCHAR        pbInput,
  [in]      ULONG         cbInput,
  [in]      ULONG         dwFlags
);

不深入太多枯燥的汇编细节,我直接跳到相关部分… 对于每个要加密的字符串,OneDrive使用存储在general.keystore文件中的密钥初始化一个新的加密对象,然后加密该字符串并释放加密对象。加密后的数据块随后进行base64编码,并作为混淆字符串写入日志。过程中还有一些其他特点,例如将字符 /+ 分别替换为 _-,因为前者可能出现在base64文本中,但同时也用于URL,以便后续解析。

为何改变? 在上一版本的ODL(使用ObfuscationStringMap时),存在这样的情况:文件中经常重复使用相同的密钥(3个词的组合),使得难以或无法知道使用哪个值作为替换来获取原始字符串。 采用加密而非查找表似乎是一种更稳健的方案,消除了上述问题。它确实会占用更多的磁盘空间,因为加密后的数据块大小始终是16字节(128位)的倍数,这是基于块(block)的加密。换句话说,对于小文本(小于10字节)来说效率不高。

更新的代码 Python ODL解析器已更新以适应这种新格式,并且适用于新旧版本。可在此处获取。

发布者:Yogesh Khatri 时间:上午10:35

标签: dfir, ODL, OneDrive

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计