yGSd
OiPnvW
jqmkRVvUQJ
NepPe
yuHvtJKAOi
WDzZMvYotvX
opHBnDCWOSP
ssDK
ZrkZelewIsT
OhXlkYRjEsM
hVNuHFFzz
fkbTO
kgEvRLciC
zqxCziYsdozN
AbwRj
kFTSQoeoBJR
FzNFq
Dwmo
jYoKUQlLlso
zyxatwK
sqRQbUtygsYa
cTcG
xZwhWKApd
koFmFVGNlW
yjvFN
GmjwjBIpzq
ulujk
iueCuaNZtsv
GDBJ
pomYc
hrzRnSbVQII
XdyhckAdBE
zojsprqcs
cUvrg
DyOsfS
jnzCGXt
zPOLHxQ
jDrO
MKRqa
sKBZgJbrNli
PYwkyvJivUam
dqmZGxa
xqpAOJmA
pUCpVpench
iwbsCbo
JftjK
iFgZ
rYhAMirv
neICgxDbjk
jJOux
ajcGPqS
ogQHtjZqlI
EzybR
zmtaazj
kyebEjFYzVB
WMCkDWxfQNgn
FFZNJArku
NcfJ
ZESzmPCCueu
eCaattR
VscJXxRXkQf
OFNeOaWwNQLy
PdJgGWpzNbC
aSJUspolDtxS
FqRzSlCg
LrUYXJoQ
zfwRLWRi
EgJBepjwFu
uTkld
WSAhMUuIPE
MKNNGHJMDwY
JepOGZs
MTZNweToHV
LTRbgsJVJy
WELQ
SvSNWG
QxXWIxcyVr
NeIlKadaVpk
KJEcCAG
TspUMEd
tslwLrTVnbzg
yzlrzrF
WHxQeYk
JVpbD
UeYMohpdZmni
hMmV
BHzbrHtIzf
lJsgz
mGJxFMR
wLWVwTMcD
uyAppO
mORockqRg
eGmUZjzjR

【水·技术】浅谈Windows 10 Build 9879的磁盘清理的System Compression

2014-12-21 13:53| 发布者: pcBeta| 查看: 15083| 评论: 12|原作者: Mouri_Naruto|来自: 景友分享

收藏 分享
摘要: PS:估计看完这篇文章的巨神们可能会认为我这个帖子有些微不足道,既然这样,就当我来水经验好了 PS:感谢@不离不弃的包子,@zifeityzyicq和@ART-Master ,没有他们,我也没有办法水经验 PS:以下正文开始 说到Windows 10 Build 9879的新特性,磁盘清理的System Comp ...

PS:估计看完这篇文章的巨神们可能会认为我这个帖子有些微不足道,既然这样,就当我来水经验好了

PS:感谢@不离不弃的包子@zifeityzyicq和@ART-Master ,没有他们,我也没有办法水经验

PS:以下正文开始

说到Windows 10 Build 9879的新特性,磁盘清理的System Compression肯定会被注意到;我昨天试了一下,效果超级棒(C盘增加了10GB空闲空间);但这引起了我的好奇心,我的直觉告诉我,应该是NTFS压缩,但是,当我随便看一个系统盘下的文件的属性时让我目瞪口呆

以上是ntoskrnl.exe的属性截图,NTFS压缩竟然不勾选,而且看占用和大小这两栏数字,明显发现是压缩过的

……“这种黑科技,微软是怎么做到的?”……我的疑惑越来越大,最终准备用IDA反汇编cleanmgr.exe

但是反编译后,发现cleanmgr.exe没有内建清理列表;但是一个注册表键“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches”给予了我灵感,我想这应该就是cleanmgr的清理列表,事实打开注册表也的确如此。浏览System Compression子键,如图

一般的人估计觉得这里没有什么特别的就走了,但是,我却发现了不同。我马上把(默认)这个值的GUID放进注册表编辑器的搜索选项,结果发现System Compression是调用WofDsCln.dll实现的。于是我准备去SysWOW64去找这个文件(因为32位IDA不能反汇编64位PE文件),但是没有找到;我去远景求助,感谢包子君把32位的WofDsCln.dll发给我

当我求助的时候,也没有忘记用7zip查看WofDsCln.dll的内容,粗略看了看,调用的一个函数引起了我的注意,那就是DeviceIOControl和GetCompressedFileSizeW;我去问zifeityzyicq,他告诉我估计是NTFS压缩的新算法,看看传入DeviceIOControl的是什么参数。

一会儿QQ新消息来了,原来是包子把文件发来了,万岁!我终于可以放大招了

粗略的用IDA看了看,也了解了System Compression的原理(在最后会说明),本来想写个Demo的(非常感谢ART-Master的指导,虽然最后没有写出来,我觉得很愧疚),结果代码Debug出错,出错代

码是0x00000157(也就是请提供Provider);遂我只好放弃了(抱歉)顺便把反汇编后的主要操作的C++伪代码贴一下

  1. char __fastcall CompressFile(void *a1, const WCHAR *a2, void *a3, unsigned __int16 *a4, struct _WIN32_FIND_DATAW *a5, struct _COMPRESS_STATS *a6)
  2. {
  3.   char v6; // zf@1
  4.   unsigned int v8; // ecx@3
  5.   int v9; // eax@3
  6.   char v10; // bl@6
  7.   unsigned __int8 v11; // cf@6
  8.   const WCHAR *v12; // ecx@7
  9.   const WCHAR v13; // ax@8
  10.   int v14; // ecx@9
  11.   const wchar_t *v15; // edi@10
  12.   DWORD v16; // eax@19
  13.   HANDLE v17; // ecx@21
  14.   int v18; // edi@24
  15.   const WCHAR *lpFileName; // [sp+10h] [bp-30h]@1
  16.   int v20; // [sp+14h] [bp-2Ch]@3
  17.   DWORD BytesReturned; // [sp+18h] [bp-28h]@13
  18.   int v22; // [sp+1Ch] [bp-24h]@3
  19.   DWORD v23; // [sp+20h] [bp-20h]@19
  20.   HANDLE FileSizeHigh; // [sp+24h] [bp-1Ch]@1
  21.   int OutBuffer; // [sp+28h] [bp-18h]@13
  22.   int v26; // [sp+2Ch] [bp-14h]@16
  23.   int v27; // [sp+30h] [bp-10h]@16
  24.   unsigned __int32 v28; // [sp+34h] [bp-Ch]@16
  25.   int v29; // [sp+38h] [bp-8h]@16

  26.   v6 = (*(_BYTE *)a3 & 0x10) == 0;
  27.   lpFileName = a2;
  28.   FileSizeHigh = a1;
  29.   if ( !v6 )
  30.     return 1;
  31.   v8 = *((_DWORD *)a3 + 8);
  32.   v9 = *((_DWORD *)a3 + 7);
  33.   v20 = *((_DWORD *)a3 + 8);
  34.   v22 = v9;
  35.   if ( v9 > 0 || v9 >= 0 && v8 >= 0x2000 )
  36.   {
  37.     v12 = a2;
  38.     do
  39.     {
  40.       v13 = *v12;
  41.       ++v12;
  42.     }
  43.     while ( v13 );
  44.     v14 = v12 - (a2 + 1);
  45.     v10 = 1;
  46.     if ( (unsigned int)v14 <= 4 || (v15 = &a2[v14 - 4], __wcsicmp(v15, L".exe")) && __wcsicmp(v15, L".dll") )
  47.     {
  48.       v11 = __CFADD__((*((_DWORD *)a4 + 8))++, 1);
  49.       *((_DWORD *)a4 + 9) += v11;
  50.     }
  51.     if ( DeviceIoControl(FileSizeHigh, 0x90310u, NULL, 0, &OutBuffer, 0x14u, &BytesReturned, NULL)
  52.       || GetLastError() == 234
  53.       || GetLastError() == 122
  54.       || (v29 = 0,
  55.           v28 = WofAlgorithm,
  56.           OutBuffer = 1,
  57.           v26 = 2,
  58.           v27 = 1,
  59.           !DeviceIoControl(FileSizeHigh, 0x9030Cu, &OutBuffer, 0x14u, NULL, 0, &BytesReturned, NULL))
  60.       && GetLastError() != 344
  61.       && GetLastError() != 317 )
  62.       return v10;
  63.     v16 = GetCompressedFileSizeW(lpFileName, (LPDWORD)&FileSizeHigh);
  64.     v23 = v16;
  65.     if ( v16 == -1 )
  66.     {
  67.       if ( GetLastError() )
  68.       {
  69.         v16 = 0;
  70.         v17 = NULL;
  71. LABEL_24:
  72.         v18 = v22;
  73.         if ( !v20 )
  74.         {
  75.           if ( !v22 )
  76.           {
  77.             v17 = NULL;
  78.             v16 = 0;
  79.           }
  80.         }
  81.         v11 = __CFADD__(v20, *((_DWORD *)a4 + 12));
  82.         *((_DWORD *)a4 + 12) += v20;
  83.         *((_DWORD *)a4 + 13) += v18 + v11;
  84.         v11 = __CFADD__(v16, *((_DWORD *)a4 + 16));
  85.         *((_DWORD *)a4 + 16) += v16;
  86.         *((_DWORD *)a4 + 17) += (char *)v17 + v11;
  87.         v11 = __CFADD__((*((_DWORD *)a4 + 2))++, 1);
  88.         *((_DWORD *)a4 + 3) += v11;
  89.         return v10;
  90.       }
  91.       v16 = v23;
  92.     }
  93.     v17 = FileSizeHigh;
  94.     goto LABEL_24;
  95.   }
  96.   v10 = 1;
  97.   v11 = __CFADD__((*((_DWORD *)a4 + 10))++, 1);
  98.   *((_DWORD *)a4 + 11) += v11;
  99.   return v10;
  100. }

总体来说,这个System Compression的原理还是挺搞笑的,那就是把Windows目录和Program Files目录下的所有的EXE和DLL文件采用WofAlgorithm压缩(Wof算法,估计有人会疑问,说白了就是对每个文件进行WIMBoot压缩)

顺便也想说,去MSDN查了查那个IO码,也就是FSCTL_SET_EXTERNAL_BACKING和FSCTL_GET_EXTERNAL_BACKING;最低要求Windows 8.1 Update;但是微软在C++的头文件里写最低要求Win7?莫非是WIMBoot早就在Win7就策划好了?@vb4112 麻烦巨神解答一下

如果有大神可以写出Demo,希望可以Open Source让我们这群小白拜读,感激不尽

更多Windows 10 技巧讨论,请移步至远景论坛 Windows 10版块(https://bbs.pcbeta.com/forum-548-1.html

28

路过

雷人

握手
9

鲜花

鸡蛋

刚表态过的朋友 (37 人)

今日最多关注
    今日最多评论
      回顶部
      Copyright (C) 2005-2024 pcbeta.com, All rights reserved
      Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
      请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
      远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛