ntdll.dll を介さずにシステム コールを直接呼び出すプログラムを作成しようとしています。
私のコード(Visual Studio構文...):
#include <windows.h>
int main()
{
_asm{
push arg1
push arg2
push arg3
mov eax,syscall_id
mov edx,esp
_emit 0xf
_emit 0x34 //sysenter opcodes...
}
プログラムが sysenter 命令を実行しようとすると、次のアクセス違反でプログラムがクラッシュします。
CALL DWORD PTR DS:[EAX+EDX*4] // Access Violation when reading [00000128]
EAX == 0x00000000
EDX == 0x0000004D
カーネル デバッガーを使用して目的のシステム コールに hw ブレークポイントを設定しようとしましたが、実行フローがそこに到達しません...
問題はスタックの順序/深さに関係していると思います。
どうもありがとう!
解決済み:
問題は、user32 および gdi32 dll をロードせずに win32k システム コールを実行しようとしたことだと思います。
追加したばかりです:
LoadLibraryW(L"user32.dll");
LoadLibraryW(L"gdi32.dll");
そして問題解決..
これらのdllをロードせずになぜこれが起こるのか、誰かがより良い考えを持っているなら、私は喜んで知っています:)