1

在 Windows 7、32 位家庭专业版上运行

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

c中的代码如下:

char* test = "h";
int main()
{
    _asm 
    {
        push 0xFEEDBACC;
    }
    MessageBoxA(0,test,test,0);
}

这导致在 VS2008 中查看的以下机器代码和相应的程序集(地址在下面重新设置,正常起始虚拟地址为 0x4001000)

char* test = "h";
int main()
{
    _asm 
    {
        push 0xFEEDBACC;
00261000 68 CC BA ED FE   push        0FEEDBACCh 
    }
    MessageBoxA(0,test,test,0);
00261005 6A 00            push        0    
00261007 68 F4 20 26 00   push        offset string "h" (2620F4h) 
0026100C 68 F4 20 26 00   push        offset string "h" (2620F4h) 
00261011 6A 00            push        0    
00261013 FF 15 A4 20 26 00 call        dword ptr [__imp__MessageBoxA@16 (2620A4h)] 
}

现在,我不想调用 MessageBox,而是想在推送 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 看到我的新推送声明。

现在,如果我突然在 IDA 中免费调试 exe,我看到我的代码发生了变化(见下文),push 0FEEDBACC变成了push 0FFA4BACC,我看不出为什么前 2 个字节被更改了。

.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!

谁能解释这里发生了什么以及为什么我正在推动的数字被修改?我尝试更改此地址的起始物理字节(怀疑存在某种对齐问题),但似乎没有什么不同。

谢谢,

斯基蒙

4

1 回答 1

3

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

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

0x00F7 - 0x0040 = 0x00B7。

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

于 2010-10-19T23:50:02.053 回答