Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用汇编语言在Windows注册表中设置值?_Windows_Assembly_Parameters_Stack_Masm - Fatal编程技术网

如何用汇编语言在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

嗯。所以我有一个程序,它试图在Windows注册表中创建一个值。不幸的是,什么也没有发生。我一直在试图找出是否有任何参数是错误的。代码如下:

 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”函数)。也许我应该重新措辞这个问题。有人能告诉我程序返回的错误代码吗?