C++ 在十六进制中修改exe后,push指令中的地址发生更改

C++ 在十六进制中修改exe后,push指令中的地址发生更改,c++,assembly,free,ida,C++,Assembly,Free,Ida,在windows 7上运行,32位home pro 我在VisualStudio2008中创建了一个非常简单的几行应用程序,在发布模式下编译并与标准库链接到可执行的test.exe中 c中的代码如下所示: char* test = "h"; int main() { _asm { push 0xFEEDBACC; } MessageBoxA(0,test,test,0); } 这将导致以下机器代码和相应的程序集,如VS2008中所示(地址在下面

在windows 7上运行,32位home pro

我在VisualStudio2008中创建了一个非常简单的几行应用程序,在发布模式下编译并与标准库链接到可执行的test.exe中

c中的代码如下所示:

char* test = "h";
int main()
{
    _asm 
    {
        push 0xFEEDBACC;
    }
    MessageBoxA(0,test,test,0);
}
这将导致以下机器代码和相应的程序集,如VS2008中所示(地址在下面重新设置,正常起始虚拟地址为0x4001000)

现在,我不想调用MessageBox,而是想在push 0之后再推一个字符串“h”,所以使用hexedit搜索包含FF15A420的部分。。。并将其改写为

90 68 CC BA ED FE
现在,如果我在IDA free中打开可执行文件,我会在.text部分看到以下内容:

.text:00401000                 push    0FEEDBACCh
.text:00401005                 push    0
.text:00401007                 push    offset unk_4020F4
.text:0040100C                 push    offset unk_4020F4
.text:00401011                 push    0FFFFFF90h
.text:00401013                 nop
.text:00401014                 push    0FEEDBACCh
.text:00401019                 retn
到目前为止,这看起来不错,我在0x401014看到了我的新push语句

现在,如果我在IDA free中调试exe,我会突然看到我的代码发生了变化(见下文)push 0FEEDBACC变为push 0FFA4BACC,我看不出为什么前两个字节会发生变化

.text:00F71000 push    0FEEDBACCh
.text:00F71005 push    0
.text:00F71007 push    offset unk_F720F4
.text:00F7100C push    offset unk_F720F4
.text:00F71011 push    0FFFFFF90h
.text:00F71013 nop
.text:00F71014 push    0FFA4BACCh  // im puzzled!
有谁能解释一下这里发生了什么,为什么我要推的数字会被修改?我尝试更改这个地址的起始物理字节(怀疑存在某种对齐问题),但似乎没有什么不同

谢谢


skimon

在最后两个屏幕之间,图像基础也发生了变化

我认为它刚刚被重新定位(曾经有一个地址):0x15处的dword:
A4 20 26 00
指向IAT,因此在重新定位后,其高位字(字节0x17 0x18)将通过添加

0x00F7-0x0040=0x00B7将其添加到该文件中


尝试禁用基于图像的随机化(或只是删除重定位)。

好吧,这是找出重定位意味着什么的困难方法。链接:@Hans:我敢打赌skimon学得不错,tho.)我明白了,如果我在它之前覆盖了push指令(因为它们不包括重新定位的函数),那么我的指令就可以了。我刚检查过,这很有效。我还将查找如何删除重新定位。谢谢你的帮助。
.text:00F71000 push    0FEEDBACCh
.text:00F71005 push    0
.text:00F71007 push    offset unk_F720F4
.text:00F7100C push    offset unk_F720F4
.text:00F71011 push    0FFFFFF90h
.text:00F71013 nop
.text:00F71014 push    0FFA4BACCh  // im puzzled!