我正在尝试使用 MessageBoxA Windows API,如下所示 https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxa
执行以下命令时,
r15
是MessageBoxA,我成功执行了API,但没有任何值。
xor rcx, rcx
xor rdx, rdx
xor r8, r8
xor r9, r9
call r15
当我尝试在文本字段中分配字符串值时,它无法执行,我不知道为什么。
xor rcx, rcx
mov rdx, 0x0041414141
xor r8, r8
xor r9, r9
call r15
我可以使用
.data
部分中定义的变量,它工作得很好,但我想知道如何在没有 .data
部分的情况下做到这一点。
例如
section .data
aaaa db 'AAAA',0
...
mov rdx, aaaa
如果使用 x86,您可以在自代码中使用下一个片段:
call @@0
DB 'some demo string',0
@@0:
pop ecx ; or another register, in which you need get address of string
(或者只是将其留在堆栈中以传递给 api 调用)
或者你可以使用这样的宏
createAstring macro name, string
@CatStr(_,name) proc
call @@1
DB string,0
@@1:
pop eax
ret
@CatStr(_,name) endp
endm
并创建函数,返回字符串的地址
createAstring some_string, 'some demo string'
并在代码中使用它:
call _some_string
mov edx,eax ; or push eax, etc
这段代码也可以在x64中使用,但这里也可以简单地使用LEA,因为它与基础无关
createAstring macro name, string
name proc
lea rax,@@1
ret
@@1:
DB string,0
name endp
endm
或者直接用代码
lea r8,@@1
...
@@1:
DB 'aaa bbb ccc...',0