如何用汇编语言在Windows注册表中设置值?
嗯。所以我有一个程序,它试图在Windows注册表中创建一个值。不幸的是,什么也没有发生。我一直在试图找出是否有任何参数是错误的。代码如下:如何用汇编语言在Windows注册表中设置值?,windows,assembly,parameters,stack,masm,Windows,Assembly,Parameters,Stack,Masm,嗯。所以我有一个程序,它试图在Windows注册表中创建一个值。不幸的是,什么也没有发生。我一直在试图找出是否有任何参数是错误的。代码如下: includelib \Masm64\Lib\Kernel32.lib includelib \Masm64\Lib\Advapi32.lib extern RegOpenKeyExA : proc extern RegSetValueExA : proc extern ExitProcess : proc dseg segmen
includelib \Masm64\Lib\Kernel32.lib
includelib \Masm64\Lib\Advapi32.lib
extern RegOpenKeyExA : proc
extern RegSetValueExA : proc
extern ExitProcess : proc
dseg segment para 'DATA'
vlnm db 'Startup', 0
sbky db 'Software\Microsoft\Windows\CurrentVersion\Run', 0
phkr dd 0
path db 'C:\Users\School\AppData\Roaming\Startups.exe', 0
dseg ends
cseg segment para 'CODE'
start proc
lea rdx, [phkr]
push rdx
sub rsp, 28h
mov r9d, 2
xor r8d, r8d
lea rdx, [sbky]
mov ecx, 80000001h
call RegOpenKeyExA
add rsp, 28h
push 45
lea rbx, [path]
push rbx
sub rsp, 28h
mov r9d, 1
xor r8d, r8d
lea rdx, [vlnm]
mov ecx, phkr
call RegSetValueExA
call ExitProcess
start endp
cseg ends
end
有什么建议吗?您只为密钥分配了2个字节(
phkr dw 0
)。在我看来,它至少应该是4个字节
除此之外,我建议您添加一些错误检查。如果失败,
RegOpenKeyEx
和RegSetValueEx
都返回非零错误代码。请允许我回答我自己的问题。这个问题并不真正与不正确的参数有关,而是我在分配堆栈空间时犯的一个错误。虽然我希望为rcx、rdx、r8和r9分配20小时的堆栈空间,并在16字节边界上对齐返回地址,但我错误地创建了一个模板,如下所示:
*empty* (rsp-8)
param2 (rsp-16)
param1 (rsp-24)
*empty* (rsp-32... causes incorrect parameters and convention!)
space for r9 (rsp-40)
space for r8 (rsp-48)
space for rdx (rsp-56)
space for rcx (rsp-64)
return address (rsp-72... not on a 16-byte boundary!)
正确的模板是
*empty* (rsp-8)
param2 (rsp-16)
param1 (rsp-24)
space for r9 (rsp-32)
space for r8 (rsp-40)
space for rdx (rsp-48)
space for rcx (rsp-56)
return address (rsp-64)
在调用RegSetValueEx之前,我无意中在堆栈参数和寄存器参数之间分配了额外的8个字节,因此提供了一个不正确的参数。以下是正确的代码:
includelib \Masm64\Lib\Kernel32.lib
includelib \Masm64\Lib\Advapi32.lib
extern RegOpenKeyExA : proc
extern RegSetValueExA : proc
extern ExitProcess : proc
dseg segment para 'DATA'
vlnm db 'Startup', 0
sbky db 'Software\Microsoft\Windows\CurrentVersion\Run', 0
phkr dd 0
path db 'C:\Users\Games\AppData\Roaming\Startups.exe', 0
dseg ends
cseg segment para 'CODE'
start proc
lea rdx, [phky]
push rdx
sub rsp, 20h
mov r9d, 2
xor r8d, r8d
lea rdx, [sbky]
mov ecx, 80000001h
call RegOpenKeyExA
add rsp, 20h
push 44
lea rbx, [path]
push rbx
sub rsp, 20h
mov r9d, 1
xor r8, r8
lea rdx, [vlnm]
mov ecx, phkr
call RegSetValueExA
fini: call ExitProcess
start endp
cseg ends
end
干杯 是的,“dw”应该是“dd”。顺便说一句,在我发布代码的那一刻,我已经发现了这个错误,正如你所暗示的,这个程序仍然无法运行。遗憾的是,我似乎无法理解如何读取错误代码,因为我在使用“FormatMessage”函数时遇到了问题。是否有人愿意提供返回的(神秘的)错误代码的描述?如果安装了MASM32,您可以在windows.inc中找到许多错误代码。很抱歉,我当前的问题不是“读取”错误代码。它涉及在某种消息框中“打印”错误代码(显然使用了“FormatMessage”和“MessageBox”函数)。也许我应该重新措辞这个问题。有人能告诉我程序返回的错误代码吗?