2016-11-06 136 views
0

我在MASM64(ML64.exe)中編寫小型應用程序。其中一個功能是在註冊表中設置值。我開始打開鑰匙,但有一個錯誤。RegOpenKeyEx在MASM64中返回錯誤87

函數RegOpenKeyEx返回錯誤87,並且GetLastError返回0x36B7。

我的代碼:

extrn ExitProcess : proc 
extrn MessageBoxA : proc 
extrn RegOpenKeyExA : proc 
extrn RegSetValueExA : proc 
extrn RegCloseKey : proc 
extrn GetLastError : proc 

.const 
HKEY_CURRENT_USER equ 80000001h 
KEY_SET_VALUE equ 2 
KEY_CREATE_SUB_KEY equ 4 
KEY_WOW64_64KEY equ 0100h 
KEY_WRITE equ 00020006h 
REG_SZ equ 00000001h 

.data 
hReg dq 0 
szRegKeyName db "Software\Microsoft\Windows\CurrentVersion\Run",0 

.code 

    Main proc 
     sub rsp, 30h 
     lea rax, hReg 
     push rax 
     mov r9, KEY_SET_VALUE+KEY_CREATE_SUB_KEY+KEY_WOW64_64KEY 
     mov r8, 0 
     lea rdx, szRegKeyName 
     mov rcx, HKEY_CURRENT_USER 
     call RegOpenKeyExA ;returns 87 
     call GetLastError ;returns 0x36B7 
     add rsp, 30h 

     xor rcx, rcx 
     call ExitProcess 
    Main endp 
end 

請幫助我。在此先感謝您的幫助。

+0

您沒有正確使用x64 abi,​​您不能忽略陰影空間。先用C語言編寫這段代碼,然後看看編譯器生成的機器代碼。 –

+1

另外,調用GetLastError是毫無意義的。返回值是錯誤代碼。閱讀文檔。 –

+0

@HansPassant那麼如何解決這個問題呢?你知道什麼是錯的嗎? – Dave

回答

1

您錯誤地操作堆棧。你的主要錯誤 - push rax真的你在這裏設置不是第5個參數,但沒有。第5個參數是堆棧中的隨機值。正確設置第5個參數 - mov [rsp+20h],rax。看起來更多也在堆棧對齊,並且GetLastError在這裏不相關--Reg *函數返回錯誤代碼,但不是設置lasterror。而不是爲hReg使用全局變量,而是將其分配在堆棧中。 examle可能看起來像這樣:

extrn ExitProcess : proc 
extrn MessageBoxA : proc 
extrn RegOpenKeyExA : proc 
extrn RegSetValueExA : proc 
extrn RegCloseKey : proc 

.const 
HKEY_CURRENT_USER equ 80000001h 
KEY_SET_VALUE equ 2 
KEY_CREATE_SUB_KEY equ 4 
KEY_WOW64_64KEY equ 0100h 
KEY_WRITE equ 00020006h 
REG_SZ equ 00000001h 

.data 
szRegKeyName db "Software\Microsoft\Windows\CurrentVersion\Run",0 

.code 

hReg equ 28h 

    test proc 
     sub rsp, 38h 
     lea rax,[rsp+hReg] 
     mov [rsp+20h],rax 
     mov r9, KEY_SET_VALUE+KEY_CREATE_SUB_KEY+KEY_WOW64_64KEY 
     mov r8, 0 
     lea rdx, szRegKeyName 
     mov rcx, HKEY_CURRENT_USER 
     call RegOpenKeyExA 
     test eax,eax 
     jnz @@1 
     mov rcx,[rsp+hReg] 
     call RegCloseKey 
@@1: 
     add rsp, 38h 
     ret 
    test endp 
end 
+0

謝謝@RbMm。有什麼方法可以用'push'指令來做到這一點?我總是使用'push'和其他代碼工作。 – Dave

+0

@Dave - 當然你使用'push'。但是這在x64 – RbMm

+0

中並不是非常有用,謝謝@RbMm再次回答。我認爲我不明白堆棧對齊。參數count +返回地址必須可被16整除。有一個參數將有:sub rsp,16(1參數+返回地址)。有兩個參數將會有:sub rsp,32(2個參數+返回地址+對齊)等等。我想對嗎? – Dave