Драйвер под Win7x86. После подмены адресов в SSDT таблице хочу получить адрес возврата из стека путем получения значения из регистра [ebp + 4]. В итоге адрес не совпадает с ожидаемым. Как правильно реализовать данный механизм?
intrinsic процедурку _ReturnAddress не пробовали? https://docs.microsoft.com/en-us/cpp/intrinsics/returnaddress?view=vs-2017
Межкольцевое переключение приводит к смене контекста. При входе потока в ядро формируется KTRAP_FRAME. Если выполняется проход по цепочке фреймов(x86), то он оканчивается на этом фрейме. Далее вам нужно взять из него юзер указатель(EBP) и продолжить бэктрейс. И не забыть что это юзер память и указатель может быть любым. Ну что бы не создать уязвимость. Кстате забыл про важный нюанс. Вы спросите как этот фрейм обнаружить - там есть отладочный маркер.