2016-11-06 1 views
0

Ich schreibe kleine Anwendung in MASM64 (ML64.exe). Eine der Funktionen ist das Festlegen von Werten in der Registrierung. Ich habe mit dem Öffnen des Schlüssels begonnen, aber es ist ein Fehler aufgetreten.RegOpenKeyEx gibt Fehler 87 in MASM64 zurück

Funktion RegOpenKeyEx gibt Fehler 87 zurück und GetLastError gibt 0x36B7 zurück.

Mein Code:

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 

Bitte helfen Sie mir. Vielen Dank im Voraus für Ihre Hilfe.

+0

Sie verwenden das x64 abi nicht korrekt, Sie können den Schattenraum nicht ignorieren. Schreiben Sie diesen Code zuerst in C und sehen Sie sich den Maschinencode an, den der Compiler generiert. –

+1

Abgesehen davon ist es sinnlos, GetLastError aufzurufen. Der Rückgabewert ist der Fehlercode. Lesen Sie die Dokumentation. –

+0

@HansPassant So, wie man diesen Code repariert? Weißt du was falsch ist? – Dave

Antwort

1

Sie falsch mit Stapel arbeiten. Ihr Hauptfehler - push rax wirklich Sie Setup hier nicht 5-ten Argument, aber nichts. und das 5. Argument war ein zufälliger Wert im Stapel. Korrektes Setup 5-tes Argument - mov [rsp+20h],rax. schau auch mehr auf stack align, und GetLastError ist hier nicht verwandt - Reg * -Funktionen geben Fehlercode yorself zurück, aber nicht lasterror setup. Verwenden Sie keine globale Variable für hReg, sondern ordnen Sie sie im Stapel zu. Beispiel kann so aussehen:

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

Danke @RbMm. Gibt es irgendwelche Möglichkeiten, dies mit 'Push'-Anweisung zu tun? Ich habe immer 'Push' und andere Codes verwendet. – Dave

+0

@Dave - natürlich verwenden Sie 'push'. aber das ist nicht sehr nützlich in x64 – RbMm

+0

Danke @RbMm wieder für die Antwort. Ich denke, dass ich die Stapelausrichtung nicht verstehe. Parameter count + Die Return-Adresse muss durch 16 teilbar sein. Mit einem Parameter gibt es: sub rsp, 16 (1 Parameter + Rückgabeadresse). Mit zwei Parametern wird es sein: sub rsp, 32 (2 Parameter + Rücksprungadresse + Ausrichtung) usw. Ich denke richtig? – Dave

Verwandte Themen