0

Windows レジストリ関数を使用して、アセンブリ言語で「Software\Microsoft\Windows\CurrentVersion\Run」キーにレジストリ キーを作成しようとしています。プログラムがクラッシュし、Windows エラー メッセージが表示されます。コードは次のとおりです。

includelib \Masm64\Lib\Kernel32.lib
includelib \Masm64\Lib\Advapi32.lib
extrn ExitProcess : proc
extrn RegCreateKeyExA : proc

dseg segment para 'DATA'
rhdl dd 0
sbky db 'Software\Microsoft\Windows\CurrentVersion\Run\startupprogram.exe', 0
dseg ends

cseg segment para 'CODE'
start proc                   ;Use link.exe to define entry point
sub rsp, 28h

push 0
push qword ptr [rhdl]
push 0
push 0
push 0
xor r9d, r9d
xor r8d, r8d
lea rdx, [sbky]
mov rcx, 8000001h
call RegCreateKeyExA

xor ecx, ecx        ; exit code = 0
call ExitProcess
start endp
cseg ends
end

よろしくお願いします。おそらく、Windows の呼び出し規約を無視したのでしょうか?

4

2 に答える 2

2

Win64 x64 呼び出し規約では、レジスタに渡される 4 つの引数用にスタック スロットを予約する必要があります。

http://msdn.microsoft.com/en-us/library/ms235286.aspxから:

呼び出し元は、呼び出し先にパラメーター用のスペースを割り当てる責任があり、呼び出し先にそれほど多くのパラメーターがない場合でも、常に 4 つのレジスタ パラメーターに十分なスペースを割り当てる必要があります。

したがって、RegCreateKeyExA()関数は、スタックにプッシュした最後の 4 つのものを 4 つのレジスタ引数用に予約された場所として処理し、最初の引数から他の引数を取得しようとしpush 0ますsub rsp,28h

試す:

push 0
push qword ptr [rhdl]
push 0
push 0
push 0
sub rsp, 20h   ; reserve slots for arguments passed in regs
xor r9d, r9d
xor r8d, r8d
lea rdx, [sbky]
mov rcx, 8000001h
call RegCreateKeyExA
于 2013-06-24T06:46:13.903 に答える
-1

これは私が取り組んだことではありませんが、MASM 以外の例があります。

SYS "SetWindowPos", @hwnd%, 0, xpos%, ypos%, 0, 0, 5

になる

 push 5
 push 0
 push 0
 push ypos%
 push xpos%
 push 0
 push @hwnd%
 call "SetWindowPos" 

コンパイラによるアセンブリの順序があり、プログラム内の内部呼び出しを検索してから、外部呼び出し (つまり、Windows のもの) を検索します。

それはすべて、コンパイラがこれらのことに対してどのように動作するかにかかっています

おそらく、最初は単純な呼び出しで実験する方が簡単です

    push 16d
    call "MessageBeep"

    push 8d
    call "MessageBeep"

例えば

2 回のビープ音

    push 8
    call "MessageBeep"

    mov eax,1

    .ag
    inc eax
    cmp eax,&FFFFFFF
    jb ag


    push 16
    call "MessageBeep"

于 2013-06-24T09:05:34.080 に答える