0

Ok。そのため、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

助言がありますか?

4

2 に答える 2

2

私自身の質問に答えさせてください。この問題は、正しくないパラメーターに関係しているのではなく、スタック スペースの割り当てを間違えたことが原因です。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

乾杯!

于 2013-08-03T01:33:11.687 に答える
0

キーに 2 バイトしか割り当てていません ( phkr dw 0)。少なくとも4バイトあるべきだと私には思えます。

それとは別に、いくつかのエラー チェックを追加することをお勧めします。と の両方が失敗した場合、ゼロ以外のエラー コードRegOpenKeyExを返します。RegSetValueEx

于 2013-07-29T06:46:13.463 に答える