我不知道如何更好地问这个,但为什么会这样:
call ExitProcess
做同样的事情吗?:
mov eax, ExitProcess
mov eax, [eax]
call eax
我认为这些将是等效的:
call ExitProcess
mov eax, ExitProcess
call eax
从 DLL 导入代码时,符号ExitProcess
实际上并不是退出进程的代码的地址(它是address 的地址)。因此,在这种情况下,您必须取消引用它才能获得实际的代码地址。
这意味着您必须使用:
call [ExitProcess]
调用它。
例如,此位置的一些代码包含以下内容:
;; Note how we use 'AllocConsole' as if it was a variable. 'AllocConsole', to
;; NASM, means the address of the AllocConsole "variable" ; but since the
;; pointer to the AllocConsole() Win32 API function is stored in that
;; variable, we need to call the address from that variable.
;; So it's "call the code at the address: whatever's at the address
;; AllocConsole" .
call [AllocConsole]
但是,直接在用户代码中导入 DLL 并不是获得该功能的唯一方法。我将解释为什么你会在下面看到这两种方式。
调用 DLL 函数的“正常”方式是先从 DLL 中标记extern
它import
:
extern ExitProcess
import ExitProcess kernel32.dll
:
call [ExitProcess]
因为这会将符号设置为对代码的间接引用,所以您需要间接调用它。
经过一番搜索,在野外似乎有使用裸形式的代码:
call ExitProcess
据我所知,这一切似乎都使用了alink
链接器,它与win32.lib
库文件链接。该库可能提供了用于调用实际DLL 代码的存根,例如:
import ExitProcessActual kernel32.dll ExitProcess
global ExitProcess
ExitProcess:
jmp [ExitProcessActual]
在中,这将从DLLnasm
导入地址并调用它,请记住,此地址是对代码的间接引用,而不是代码本身的地址。ExitProcess
ExitProcessActual
然后它将导出ExitProcess
入口点(此 LIB 文件中的入口点,而不是 DLL 中的入口点),以便其他人可以使用它。
然后有人可以简单地写:
extern ExitProcess
:
call ExitProcess
退出进程 - 库将跳转到实际的 DLL 代码。
事实上,通过更多的研究,这正是正在发生的事情。从下载alink.txt
附带的文件中alink
:
Win32 的示例导入库包含在
win32.lib
.Kernel32
,User32
,GDI32
,Shell32
,ADVAPI32
,version
,winmm
,lz32
和commdlg
中的所有命名导出commctl
都包括在内。采用:
alink -oPE file[.obj] win32.lib
包括它或指定
INCLUDELIB "win32"
在您的源文件中。
这包括一系列用于导入重定向的条目 -
call MessageBoxA
,并跳转到[__imp_MessageBoxA]
导入表中的 。
call [__imp_importName]
因此,如果使用 代替 ,对导入的调用将运行得更快call importName
。看
test.asm
,我的示例程序,它以两种方式调用一个消息框:
includelib "win32.lib"
extrn MessageBoxA:near
extrn __imp_MessageBoxA:dword
codeseg
start:
push 0 ; OK button
push offset title1
push offset string1
push 0
call MessageBoxA
push 0 ; OK button
push offset title1
push offset string2
push 0
call large [large __imp_MessageBoxA]
(__imp_MessageBoxA
是从DLL中导入的符号,相当于我ExitProcessActual
上面的)。