Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么光盘上的.text部分和ram中的不同?_C++_Windows_Executable_Loader_Relocation - Fatal编程技术网

C++ 为什么光盘上的.text部分和ram中的不同?

C++ 为什么光盘上的.text部分和ram中的不同?,c++,windows,executable,loader,relocation,C++,Windows,Executable,Loader,Relocation,我有一个程序,让我们称之为“SampleApplication”(仅1个exe文件)。我将以两种方式浏览本程序的.text部分 从其他程序中打开文件“SampleApplication.exe”,浏览标题、查找.text部分并将数据逐字节写入文件 运行SampleApplication.exe,其中包含获取其模块指针的指令,通过标题查找其.text部分,并将该部分逐字节打印到其他文件 现在,当我以64位模式编译应用程序时,这些文件是相同的——写入的字节是相同的但是当我以32位模式编译时,有些字节

我有一个程序,让我们称之为“SampleApplication”(仅1个exe文件)。我将以两种方式浏览本程序的.text部分

  • 从其他程序中打开文件“SampleApplication.exe”,浏览标题、查找.text部分并将数据逐字节写入文件

  • 运行SampleApplication.exe,其中包含获取其模块指针的指令,通过标题查找其.text部分,并将该部分逐字节打印到其他文件

  • 现在,当我以64位模式编译应用程序时,这些文件是相同的——写入的字节是相同的但是当我以32位模式编译时,有些字节是不同的。我有理由(如下所述)相信这些字节是地址的一部分。我的问题是它们为什么不同

    我可以提供的其他信息:

  • 当程序在ram中时,总是将字节64(dec)和字节65(dec)(磁盘上)分别更改为一些n和n+1。例如:
  • 运行程序

    a) 64 -> 5, 65 -> 6; 
    
    另一个程序执行

    b) 64 -> 5, 65 -> 6;  // bytes are the same
    
    重新编译sampleApplication,然后再次运行它

    c) 64 -> 17, 65 -> 18;   // or 31, 32 or 34, 35 or many other combinations
    
  • 我用反汇编检查了这些字节代表什么。它们似乎代表内存地址。例如字节
  • 在ram中(注意小端点)

    光盘上有:

    68 60 24 40 00
    push (402460)
    
    (40是十六进制表示64)


    有人能详细告诉我发生了什么吗?我真的需要深入了解这种机制。

    地址空间布局随机化?可以停用。我停用了它,仍然是相同的“问题”地址修复。IIRC 64位不需要它们,32位则需要。解码一些指令,看看它们是什么,或者只是调试程序,看看汇编程序。你能详细说明一下“地址修正。IIRC 64位不需要它们,32位需要它们吗?”@RichardCritten如果你能把它变成一个答案,我会很高兴把它标记为最佳答案。
    68 60 24 40 00
    push (402460)