【发布时间】:2019-11-18 13:31:29
【问题描述】:
我尝试使用
mov rdx, 4
push rdx
mov rsi, temp_str
push rsi
mov rdi, temp_str1
push rdi
call memmove
和
sub rsp, 24
mov [rsp + 16], rdx
mov [rsp + 8], rsi
mov [rsp], rdi
call memmove
add rsp, 24
和其他种类的魔法,但没有任何作用。哪个法术能胜任?
(temp_str 和 temp_str1 定义为
temp_str db "abc", 0
temp_str1 db "def", 0
,memmove 来自 msvcrt)
编辑:
sub rsp, 32
mov rcx, temp_str1
mov rdx, temp_str
mov r8, 4
call memmove
也会崩溃。
编辑 2:完整代码:
format PE64 console
entry prog
include "win64ax.inc"
section '.idata' import data readable writeable
library kernel32, 'kernel32.dll', msvcrt, 'msvcrt.dll'
import kernel32, ExitProcess,'ExitProcess'
import msvcrt, memmove, 'memmove'
section '.text' code readable executable
prog:
;;mov rdx, 4
;;push rdx
;;mov rsi, temp_str
;;push rsi
;;mov rdi, temp_str1
;;push rdi
;;call memmove
;;sub rsp, 24
;;mov [rsp + 16], rdx
;;mov [rsp + 8], rsi
;;mov [rsp], rdi
;;call memmove
;;add rsp, 24
;;push rbp
;;mov rbp, rsp
;;push rdx
;;push rsi
;;push rdi
;;call memmove
;;mov rsp, rbp
;;pop rbp
sub rsp, 32
mov rcx, temp_str1
mov rdx, temp_str
mov r8, 3
call memmove ; crash
add rsp, 32
end_prog:
invoke ExitProcess, 0
section '.data' data readable writeable
temp_str db "abc", 0
temp_str1 db "def", 0
【问题讨论】:
-
您似乎将 sysv abi 与 microsoft 混淆了。请参阅documentation。 TL;DR:分配 32 字节的影子空间并在
rcx、rdx和r8中传递参数。此外,如果您使用的是汇编,那么调用memmove真的毫无意义,尤其是如果您知道您的范围不重叠。 -
也不起作用(见编辑)。为什么 memmove 毫无意义?
-
@Jester 实际上并不是那么毫无意义。简单的
rep movs可能不是最佳解决方案,即使范围不重叠。参见例如howmemmove's backward part is implemented in glibc. -
我建议也检查一下 FASM 论坛board.flatassembler.net,因为它可能有一个宏
-
宏 cinvoke 有 bug,所以我正在寻找直接方法。