首页 > 解决方案 > 对文件进行“系统压缩”(CompactOS)的 Win32 API 是什么?

问题描述

除了 NTFS 上的沼泽标准 LZNT1 压缩之外,Windows 10 还具有一种称为系统压缩的新压缩形式。这种压缩模式针对只读文件(即可执行文件)进行了“优化”。它用于 Compact OS 功能,但也可以通过compact.exe /EXE.

但是获取和设置新型压缩状态的编程方式是什么?我在文件上尝试了旧FSCTL_GET_COMPRESSION的,但它总是为COMPRESSION_FORMAT_NONE.

标签: winapintfs

解决方案


好的,这就是我现在所拥有的,在投掷compact.exeGhidra 之后。

除了FSCTL_GET_COMPRESSION/FSCTL_SET_COMPRESSIONDeviceIoControlcompact还调用FSCTL_GET_EXTERNAL_BACKINGFSCTL_SET_EXTERNAL_BACKING。该文档解释了压缩信息存储在FILE_PROVIDER_EXTERNAL_INFO_V1输入/输出结构中。这些字段有很好的记录。

我现在有点懒得向 Ghidra 添加适当的结构来验证这一发现,但我很确定这就是方法。


有点不正统的是compact.exe调用 FSCTL 的方式。虽然这些函数被记录为仅使用 NT API,但DeviceIoControl这里使用的是 Win32 并且工作正常。错误代码有点奇怪,包括 0x156 和 0x158 等未记录的内容。RtlNtStatusToDosError在我敢于将它们与 Win32 句柄一起实际使用之前,我需要找一些时间来扔东西。

FWIW,设置调用位于 FUN_1400030e0(0x158 和 0x13d 是否可以接受?),get 调用位于 FUN_140002074(0xea?)和 FUN_1400040d,删除调用位于 FUN_1400040dc。这适用于版本 10.0.19041.1。


推荐阅读