Здравствуйте, reversecode, Вы писали:
R>обоснуйте что ваши коллбеки это не обходимое зло R>и что это _никак_ не переделывается на С R>хотя их аналоги у вас рядом лежат на С
Напр., мне надо указать коллбек для KeInitializeDpc() на адрес функции, которая сгенерена вручную как JIT.
Но адрес коллбека должен быть внутри адресов драйвера, иначе будет bug-check из-за PatchGuard-а.
Для этого в драйвере держу пачку вспомогательных функций, которые должны перенаправить вызов в другие функции.
При этом они должны принимать любые аргументы.
Поэтому написаны они на ассемблере, т.е. просто делают JMP по таблице на нужную функцию.
Здравствуйте, reversecode, Вы писали:
R>обоснуйте что ваши коллбеки это не обходимое зло R>и что это _никак_ не переделывается на С R>хотя их аналоги у вас рядом лежат на С
Здравствуйте, nodir.temir, Вы писали:
NT>Напр., мне надо указать коллбек для KeInitializeDpc() на адрес функции, которая сгенерена вручную как JIT. NT>Но адрес коллбека должен быть внутри адресов драйвера, иначе будет bug-check из-за PatchGuard-а.
Немного не по теме...
JIT? В kernel mode?!?
MS ведь давно блочит такие вещи. Я имею в виду, что на Windows 10 попытки в ядре работать с памятью с правами на исполнение
блокируются при включенном Device Guard / HVCI (ну или при активной проверке "Code Integrity Checks" в Driver Verifier).
у него в одном и том же поинтере может лежать функции с разным количеством аргументов
соответственно можно сделать на него только jmp
и нельзя call
в С с ходу не придумалось как это можно обойти
кроме как заюзать __assume(0) что бы компиллер емитил jmp вместо call
но эму это не нравится, типа в мсвц это не документированно
хотя как по мне там жирный намек и годболд это на тестовом примере подтверждает
Здравствуйте, reversecode, Вы писали:
R>у него в одном и том же поинтере может лежать функции с разным количеством аргументов R>соответственно можно сделать на него только jmp и нельзя call
Что то мне кажется что у него там всё таки ограниченное число вариантов количества аргументов, пусть нагенерит несколько разных стабов и не морочит себе голову.
R>ну пуст дальше асмы компилит
Или так, да.
Здравствуйте, okman, Вы писали:
O>JIT? В kernel mode?!? O>MS ведь давно блочит такие вещи. Я имею в виду, что на Windows 10 попытки в ядре работать с памятью с правами на исполнение O>блокируются при включенном Device Guard / HVCI (ну или при активной проверке "Code Integrity Checks" в Driver Verifier).
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, reversecode, Вы писали:
R>>у него в одном и том же поинтере может лежать функции с разным количеством аргументов R>>соответственно можно сделать на него только jmp и нельзя call
CC>Что то мне кажется что у него там всё таки ограниченное число вариантов количества аргументов, пусть нагенерит несколько разных стабов и не морочит себе голову.
Да, пока ограниченное.
Но я хочу сделать гарантированно рабочий код для любого кол-ва аргументов.
После истечения EV сертификата, не смогу менять загрузчик драйвера.