jjzjj

c++ - Microsoft 系统可执行拷贝差异

coder 2024-06-17 原文

我一直在探索 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() 调用后检查大小变量 参见 798720。

???

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

是什么导致了这种大小差异?一些软元数据与 system32\calc.exe?如果是这样,为什么我的小复制程序不直接复制它呢? 因为它在同一个文件中? Microsoft 是否为 TrustedInstaller 捆绑了一些证书 使用?如果是这样,为什么我的小应用程序没有复制它?

如果我使用 peexplorer 查看这两个文件...它们看起来完全相同。与 使用十六进制编辑器。

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

在其他非 MS 系统可执行文件上运行我的应用程序会得到一个完美的拷贝,无论是大小还是 哈希和可执行文件在不接触 UAC 控件的情况下运行。

我使用 CopyFile API 重写了 copyit... 结果相同。还有 _fopen()。同上。 我高度怀疑我遇到了一些未记录的安全功能。

最佳答案

您可能正在运行 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 .

关于c++ - Microsoft 系统可执行拷贝差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21651945/

有关c++ - Microsoft 系统可执行拷贝差异的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  5. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  6. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  7. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  8. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  9. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  10. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

随机推荐