gpt4 book ai didi

windows - call immediate 与 call dword near [dword addr]

转载 作者:可可西里 更新时间:2023-11-01 12:03:57 26 4
gpt4 key购买 nike

所以最近我一直想从汇编中调用一些 win32 调用,并且我一直在使用 NASM 作为我的外部汇编程序。我调用 SendMessage在我的代码中以下列方式:

call __imp__SendMessageW@16

这被组装成一个相对跳转(0xE8 操作码),结果是访问冲突。在调试器中,计算出的跳转偏移似乎是正确的(因为 __imp__SendMessageW@16 似乎确实驻留在那儿)但它仍然不起作用。当我从 C++ 调用函数时检查 Visual Studio 生成的程序集,我注意到它不是使用相对直接跳转,而是(用 MASM 的语言)call dword ptr [__imp__SendMessageW@16] ,对应于 0xFF15 操作码。经过一番摸索后,我发现 NASM 语法将其编码为 call dword near [dword __imp__SendMessageW@16] ,并进行更改我的代码突然工作。

我的问题是,为什么一个有效而另一个无效?是否正在进行一些代码重定位导致相对立即调用跳转到不友好的地方?我从来都不是一个汇编程序员,但我的印象总是这两个调用应该做同样的事情,主要区别在于一个是位置独立的,另一个不是(假设他们将 IP 移动到同一个地方).鉴于此,代码理论的重定位是有道理的,但是您如何解释显示正确地址的调试器?

另外:[] 背后的逻辑是什么?此调用中的语法?偏移量仍然是立即数(只是在 0xFF15 之后立即编码的小端),这里除了指令获取之外没有内存访问(我倾向于认为 []lea 上下文之外的取消引用)。

最佳答案

call dword[__imp__SendMessageW@16]

_imp_SendMessageW@16 是您的导入部分的地址,其中包含 API 函数的地址。您使用方括号表示尊重(调用此地址存储的地址)

关于windows - call immediate 与 call dword near [dword addr],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7123045/

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