Всем привет Взял отсюда код https://gist.github.com/coldfusion39/87ac72c083bca73cad809d1f4653061a#file-wow64_call-cpp-L61 который с х86 процесса переключается в х64 и вызывает syscall инструкцию после чего обратно переключается в х86 режим Немножко сделал под себя для теста, вручную вписал номера из ntdll ( win 10 home, 19044 ), NtOpenFile=0x33 NtClose=0xF и обнаружил что работает такой механизм через "раз" то есть я иногда получаю access violation exception почему-то. Вот мой код: https://pastebin.com/ujVWpGvw Я решил чтоб разобраться зациклить: Код (Text): while (true) { DWORD Status = x64_Syscall(0x33, Args, 6); printf("NtOpenFile: Status = 0x%.8x, FileHandle = 0x%.8x\n", Status, (HANDLE)Params->FileHandle); DWORD64 Args2[1]; Args2[0] = Params->FileHandle; Status = x64_Syscall(0xF, Args2, 1); printf("NtClose: Status = 0x%.8x\n", Status); Sleep(100); } И вообщем-то вот результат в windbg: Как видите якобы Код (Text): mov esp,dword ptr [ebp-8] даёт access violation с записью по адресу 0 ( не представляю откуда это может взяться ) При этом на момент эксепшена состояние регистров вот такое Сначала я подумал что может действительно выравнивание стека играет роль но! Выравнивае есть в коде: https://gist.github.com/coldfusion39/87ac72c083bca73cad809d1f4653061a#file-wow64_call-cpp-L93 Как видно делается and а оригинал esp сохраняется в локальной переменной Это какой-то защитный механизм от такого рода манипуляций в x86 процессе? Сталкивался ли кто-то с подобным? Для чистоты эксперимента: Код (Text): while(true) { DWORD64 Args2[1]; Args2[0] = 0; Status = x64_Syscall(0xF, Args2, 1); printf("NtClose: Status = 0x%.8x\n", Status); Sleep(100); } сискол с 1им параметром числовым в цикле даёт такой же виолейшен в том же месте, спустя рандомное число итераций ( это может быть 10 а может быть 20 ) Я собираю бинарь с отключёнными проверками стека,sdl, cfg и тд - только црт прилинкован. При этом если гонять это под дебагером и скипнуть эксепшон то сисколы отрабатывают - я получаю хендл на открытый файл и тд Почему такое может происходить? Было ли такое у кого-нибудь и может ли кто сделать репродьюс такого же результата у себя?
Привет. Дома буду гляну. Пока посмотри это https://wasm.in/threads/access-violation-pri-vozvrate-iz-64-bitnogo-rezhima.33604/ Тоже было av когда после переключения в 32 битный режим было обращение к стеку. Нужно перезагружать ss регистр.