我一直在探索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()。同上。 我非常怀疑我遇到了一些无证的安全功能。
答案 0 :(得分:4)
您可能正在运行64位版本的Windows,并且您的程序是32位。当您在c:\Windows\System32
中打开文件时,它将被重定向到C:\Windows\SysWOW64
。因此,您不是要复制c:\windows\system32\calc.exe
,而是复制C:\Windows\SysWOW64\calc.exe
。我认为calc.exe的文件大小为798720。