gpt4 book ai didi

c++ - 是否可以使用内联汇编在 visual studio 2010 c++ 中查找代码地址?

转载 作者:太空狗 更新时间:2023-10-29 20:05:28 25 4
gpt4 key购买 nike

假设我想在返回其返回地址的 C++ 代码中编写一个内联汇编函数。

因此,如果我从某个地址调用函数 returnAddress() 并且它需要在函数完成后返回到地址 X,我希望 returnAddress() 返回值 X。

returnAddress() 的代码示例:

void* getAddress()
{
__asm {
pop ebx; // moving return offset to ebx?
push ebx; // restoring stack state
xor eax, eax;
mov ax, cs; // ax <- code segment
mov ecx, 16;
mul ecx; // multiplying the code segment by 16
add eax, ebx;// adding offset
}
}

前面的代码不能正常运行,因为当我按下 alt+8 时,我可以清楚地看到我的代码地址与该函数的返回值完全不同。

我想在内存中找到我的代码地址的原因是因为我想在代码本身运行时尝试更改它。如果有任何其他方法可以在不使用内联汇编(也许使用 Windows API?)的情况下找到我的代码的地址,请告诉我。

此外,我很确定我什至不能使用 Visual Studio 2010 使用 CS(代码段)值,所以也许这就是导致我出现问题的原因......CS 始终等于 35。程序集 View (alt+8) 是否显示不正确的地址,因为 VS2010 运行虚拟机?

这是我在这里的第一篇文章,所以可能我没有表达清楚我的观点。请让我知道我是否可以解释自己以使其更清楚。

最佳答案

代码段仅在 16 位系统中使用。随着 32 位的引入,代码段消失了。

您可以使用 VisualStudio 的内部 _ReturnAddress() 函数:

void * _ReturnAddress(void);
#pragma intrinsic(_ReturnAddress)

void* getAddress()
{
return _ReturnAddress();
}

如果您想手动执行此操作,比如在非 VisualStudio 编译器上,则 32 位 x86 函数调用的调用堆栈包含完整的 32 位返回地址,因此您可以按原样返回它:

void* __declspec(naked) getAddress()
{
asm
{
mov eax, [esp];
ret;
}
}

对于 x64 函数调用,您应该能够使用等效的 64 位寄存器:

void* __declspec(naked) getAddress()
{
asm
{
mov rax, [rsp];
ret;
}
}

关于c++ - 是否可以使用内联汇编在 visual studio 2010 c++ 中查找代码地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13185222/

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