问题描述
除了NTFS上的沼泽标准LZNT1压缩之外,Windows 10还具有称为system compression的新压缩形式。对于只读文件(即可执行文件),此压缩模式已“优化”。它用于Compact OS功能,尽管也可以通过compact.exe /EXE
手动调用它。
但是,获取和设置新型压缩状态的编程方式是什么?我尝试对文件使用旧的FSCTL_GET_COMPRESSION
,但对于COMPRESSION_FORMAT_NONE
,它始终给出0。
解决方法
好的,这是我在吉德拉(Ghidra)投掷compact.exe
之后现在所拥有的。
除了FSCTL_GET_COMPRESSION
/ FSCTL_SET_COMPRESSION
对DeviceIoControl
之外,compact
也称为FSCTL_GET_EXTERNAL_BACKING
和FSCTL_SET_EXTERNAL_BACKING
。该文档说明了压缩信息存储在FILE_PROVIDER_EXTERNAL_INFO_V1
结构中,用于输入/输出。这些字段都有很好的记录。
我有点懒惰,无法立即向Ghidra添加适当的结构来验证此发现,但是我很确定这是方法。
compact.exe
调用FSCTL的方式有点不合常规。尽管已记录了仅使用NT API的功能,但此处使用Win32 DeviceIoControl
并可以正常使用。错误代码有点奇怪,包括未记录的内容,例如0x156和0x158。在我敢将它们与Win32句柄一起实际使用之前,我需要花一些时间向RtlNtStatusToDosError
扔东西。
FWIW,在FUN_1400030e0(可以接受0x158和0x13d吗?)找到设置的调用,在FUN_140002074(0xea?)和FUN_1400040d找到get调用,在FUN_1400040dc找到删除调用。这是用于10.0.19041.1版的。