我使用NASM在x86汇编中构建一个COM对象。我对COM的理解很好,我很了解x86的组装,但是把它们组合起来会让我挂断......(顺便说一下,如果你想阻止我使用x86汇编,请不要这么做,我有非常特别的原因,为什么我在x86组建这个!)在x86汇编中构建一个COM对象vtable
我想建立一个在我的COM对象中使用的Vtable,但我不断收到奇怪的指针,而不是实际指向我的函数。 (我想我正在获得相对偏移量或者NASM在那里嵌入临时值,并且在链接过程中它们不被替换为实际值)
我试图构建的当前接口是IClassFactory
界面,代码如下:
%define S_OK 0x00000000
%define E_NOINTERFACE 0x80004002
section .text
; All of these have very simple shells rather than implementations, but that is just until I can get the vtable worked out
ClassFactory_QueryInterface:
mov eax, E_NOINTERFACE
retn 12
ClassFactory_AddRef:
mov eax, 1
retn 4
ClassFactory_Release:
mov eax, 1
retn 4
ClassFactory_CreateInstance:
mov eax, E_NOINTERFACE
retn 16
ClassFactory_LockServer:
mov eax, S_OK
retn 8
global ClassFactory_vtable
ClassFactory_vtable dd ClassFactory_QueryInterface, ClassFactory_AddRef, ClassFactory_Release, ClassFactory_CreateInstance, ClassFactory_LockServer
global ClassFactory_object
ClassFactory_object dd ClassFactory_vtable
注:这还不是全部的代码,我的DllGetClassObject,DllMain中,等在不同的文件中。
但是当我组装(使用NASM:nasm -f win32 comobject.asm
)和链路(使用MS链接:link /dll /subsystem:windows /out:comobject.dll comobject.obj
),并检查使用OllyDbg的可执行文件,虚函数表出来奇怪值。例如,在我最后的构建,是功能的实际地址如下:
- 的QueryInterface - 0x00381012
- 的AddRef - 0x0038101A
- 发布 - 0x00381020
- 的CreateInstance - 0x00381026
- LockServer - 0x0038102E
但是vtable出来这些值:
- 的QueryInterface - 0x00F51012
- 的AddRef - 0x00F5101A
- 发布 - 0x00F51020
- 的CreateInstance - 0x00F51026
- LockServer - 0x00F5102E
这些值气色好可疑......几乎像搬迁没有采取。另外,vtable出现为0x00F5104A,所有这些都是不可访问的内存地址。 (仅供参考,这些值每次都会有所不同)
我试过在使用Visual Studio 2010 Express的C++中做同样的事情,并且一切都很好。所以我假设这只是我在我的程序集中丢失的东西...
任何人都可以指出为什么这些值不能正确显示吗?
我不知道你的vtable,但你的函数实现没有足够的参数。例如,AddRef应该是retn 4,你会一直忘记这个指针。 – 2010-07-26 00:46:08
啊!是的,谢谢Logan!我完全忘了这个指针! – Miquella 2010-07-26 00:59:37