実験と試行錯誤の目的で、次の短い x64 アセンブリ プログラムを作成しました。
.code
AsmFun proc
mov rax, MyLabel
mov byte ptr [rax], 0C3h ; C3 is x64 machine code for "ret"
MyLabel:
mov rax, 239847 ; This isn't "ret"
AsmFun endp
end
(その後、C からコードを呼び出しました。)
コンパイル/アセンブル/リンクは正常に行われますが、プログラムを実行すると、Visual Studio は未処理の例外が発生したと不平を言います:「[MyLabel] としてのアクセス書き込み違反」。 「[MyLabel]」ではなく、たまたまメモリ内にあるアドレスです。
なぜこうなった?セキュリティの悪用を避けるために導入されたのは Windows のものですか?