【发布时间】:2012-10-22 12:30:40
【问题描述】:
假设我想在一个返回其返回地址的 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。 汇编视图(alt+8)是否显示不正确的地址,因为 VS2010 运行的是虚拟机?
这是我在这里的第一篇文章,所以也许我没有把我的观点说得很清楚。如果我能解释清楚,请告诉我。
【问题讨论】:
-
无论如何这在 64 位中是不可能的,因为没有内联汇编
-
只需使用
_ReturnAddress内在函数。 -
@RaymondChen 我喜欢这个只是为了评论。我什至不知道它的存在。谢谢!
-
那么,生成自修改代码的问题#1 解决了,接下来是问题#2 ...??
标签: c++ visual-studio-2010 assembly stack