Microsoft系统可执行副本差异

时间:2014-02-08 21:18:42

标签: c++ windows

我一直在探索Windows系统文件的来龙去脉,并注意到了 奇怪的是:如果我执行Windows系统的低级按位复制 可执行文件到我选择的目标位置生成的文件小于 原来。

示例:我编写了一个小程序来复制无处不在的calc.exe可执行文件...

C:\test> copyit c:\windows\system32\calc.exe c:\test\calc.exe

这是生成的文件:

C:\test>dir
 Volume in drive C is OS
 Volume Serial Number is DEAD-BEEF

 Directory of C:\test

02/08/2014  03:37 PM    <DIR>          .
02/08/2014  03:37 PM    <DIR>          ..
02/08/2014  03:37 PM           798,720 calc.exe
               1 File(s)        798,720 bytes
               2 Dir(s)  291,059,347,456 bytes free

这很有趣,因为查看C:\ windows \ system32 \ calc.exe会给我...

C:\test>dir c:\Windows\System32\calc.exe
 Volume in drive C is OS
 Volume Serial Number is DEAD-BEEF

 Directory of c:\Windows\System32

08/22/2013  05:51 AM           922,112 calc.exe     <------Why is this larger?
               1 File(s)        922,112 bytes
               0 Dir(s)  291,059,322,880 bytes free

为了您的观赏乐趣,我用C ++写的“copyit”程序:

int main(int argc, char* argv[])
{  
    std::ifstream is( argv[0], std::ios::in | std::ios::binary );
    std::ofstream os( argv[1], std::ios::out| std::ios::binary );

    is.seekg(0, std::ios::end);
    std::streampos size = is.tellg();
    is.seekg(0);

    char* buffer = new char[(size_t)size];

    is.read(buffer, size);
    os.write(buffer, size);

    delete [] buffer;

    os.close();
    is.close();

    return 0;
}

如果我在应用程序中设置了一个断点,并在tellg()调用后检查size变量 见798720。

???

请注意,生成的calc.exe将不会在我的测试目录中运行,但如果我降低了我的 它将运行的UAC安全设置。

什么可以解释这个尺寸差异?一些软元数据捆绑在一起 SYSTEM32 \ CALC.EXE?如果是这样,为什么我的小复制程序不会复制那么好 既然它在同一个文件中? Microsoft是否为TrustedInstaller捆绑了一些证书 用吗?如果是这样的话,为什么我的小应用程序没有复制?

如果我使用peexplorer查看这两个文件......它们完全相同。与...相同 使用hexeditor。

使用Cywin的md5sum,文件会产生不同的哈希值。

在其他非MS系统可执行文件上运行我的应用程序会产生完美的副本,包括大小和 hash和performatbles在不触及UAC控件的情况下运行。

我使用CopyFile API重写了copyit ...同样的结果。还有_fopen()。同上。 我非常怀疑我遇到了一些无证的安全功能。

1 个答案:

答案 0 :(得分:4)

您可能正在运行64位版本的Windows,并且您的程序是32位。当您在c:\Windows\System32中打开文件时,它将被重定向到C:\Windows\SysWOW64。因此,您不是要复制c:\windows\system32\calc.exe,而是复制C:\Windows\SysWOW64\calc.exe。我认为calc.exe的文件大小为798720。

另见File System Redirector