gpt4 book ai didi

c++ - 以十六进制修改 exe 后推送指令中的地址发生变化

转载 作者:行者123 更新时间:2023-11-30 03:09:37 25 4
gpt4 key购买 nike

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

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

c中的代码如下:

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

在 VS2008 中会产生以下机器代码和相应的程序集(下面的地址 rebase ,正常的起始虚拟地址为 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 免费中打开可执行文件,我会在我的 .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!

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

谢谢,

滑雪

最佳答案

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

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

0x00F7 - 0x0040 = 0x00B7 到它。

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

关于c++ - 以十六进制修改 exe 后推送指令中的地址发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3973674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com