Многие программы на х86 перехватывают функции через патч SDT, индексы этих функций меняются в зависимости от версии ОС.
Решение проблемы - это как правило хардкод индексов в коде, но есть и определенные хитрости, позволяющие избежать хардкода в некоторых случаях.
Рассмотрим любую Zw функцию, экпортируемую ядром, например ZwDuplicateToken:
nt!ZwDuplicateToken:
804fe30c b845000000 mov eax,45h
804fe311 8d542404 lea edx,[esp+4]
804fe315 9c pushfd
804fe316 6a08 push 8
804fe318 e874f10300 call nt!KiSystemService (8053d491)
804fe31d c21800 ret 18h
Можно заметить, что id можно получить отсюда, например таким кодом:
offsetToId = (PUCHAR)ZwDuplicateToken;
id = *(PULONG)(offsetToId + 1);
Такое решение подходит лишь для экспортируемых ядром Zw функций, их число хотя и достаточно велико, но все же не покрывает всего диапазона ф-ций в SDT. То есть, решение частное, а не общее.
Решение проблемы - это как правило хардкод индексов в коде, но есть и определенные хитрости, позволяющие избежать хардкода в некоторых случаях.
Рассмотрим любую Zw функцию, экпортируемую ядром, например ZwDuplicateToken:
nt!ZwDuplicateToken:
804fe30c b845000000 mov eax,45h
804fe311 8d542404 lea edx,[esp+4]
804fe315 9c pushfd
804fe316 6a08 push 8
804fe318 e874f10300 call nt!KiSystemService (8053d491)
804fe31d c21800 ret 18h
Можно заметить, что id можно получить отсюда, например таким кодом:
offsetToId = (PUCHAR)ZwDuplicateToken;
id = *(PULONG)(offsetToId + 1);
Такое решение подходит лишь для экспортируемых ядром Zw функций, их число хотя и достаточно велико, но все же не покрывает всего диапазона ф-ций в SDT. То есть, решение частное, а не общее.
Комментариев нет:
Отправить комментарий