Здравствуйте, idiMAN, Вы писали:
MAN>Каким образом можно вызвать функцию NtCreateThread, если её перехватил другой процесс путём подмены её адреса в SYSTEM_SERVICE_TABLE?
Если идти по принципу наименьшего сопротивления, то попробую изложу свои мысли...
Насколько мне известно, все оригинальные адреса функций в SDT статичны, но эти адреса разные в разных ОС и сервис паках.
Например, для WinXP SP2 x86 NtCreateThread имеет оригинальный адрес 0x805cf804.
Идея в том, чтобы на чистой машине с нужной ОС, где хуки отсутствуют, посмотреть оригинальные адреса SDT, например, с помощью WinGdb или Rootkit Unhooker'a,
потом либо восстановить оригинальный адрес на хукнутой ОС и вызвать нужную функцию, либо напрямую, зная оригинальный адрес, вызвать функцию, положив в стек нужные параметры.
Здравствуйте, -prus-, Вы писали:
P>Насколько мне известно, все оригинальные адреса функций в SDT статичны, но эти адреса разные в разных ОС и сервис паках.
P>потом либо восстановить оригинальный адрес на хукнутой ОС и вызвать нужную функцию, либо напрямую, зная оригинальный адрес, вызвать
функцию, положив в стек нужные параметры.
С адресом функции всё понятно — допустим он у меня есть, с восстановлением тоже понятно, а вот как произвести вызов нужной функции напрямую, зная её адрес — нет. Ведь вызов происходит через Sysenter/Syscall (int 2Eh) а для этого передаётся не адрес функции, а её номер.
MAN>С адресом функции всё понятно — допустим он у меня есть, с восстановлением тоже понятно, а вот как произвести вызов нужной функции напрямую, зная её адрес — нет. Ведь вызов происходит через Sysenter/Syscall (int 2Eh) а для этого передаётся не адрес функции, а её номер.
Sysenter из кернелмода делать не надо
Просто вызываете и все.
Мм. Возможно потребуется озаботиться Previous mode'ом, но поскольку вы не сказали толком надо вам это или нет пока этот вопрос опустим.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
O>Sysenter из кернелмода делать не надо O>Просто вызываете и все. O>Мм. Возможно потребуется озаботиться Previous mode'ом, но поскольку вы не сказали толком надо вам это или нет пока этот вопрос опустим.
Извиняюсь, что сразу не написал, но вообще то хотелось вызвать вместо перехваченного NtCreateThread оригинальный из UserMode. Такое возможно без написания драйвера?
Здравствуйте, idiMAN, Вы писали:
MAN>Извиняюсь, что сразу не написал, но вообще то хотелось вызвать вместо перехваченного NtCreateThread оригинальный из UserMode. Такое возможно без написания драйвера?
O>>Sysenter из кернелмода делать не надо O>>Просто вызываете и все. O>>Мм. Возможно потребуется озаботиться Previous mode'ом, но поскольку вы не сказали толком надо вам это или нет пока этот вопрос опустим. MAN>Извиняюсь, что сразу не написал, но вообще то хотелось вызвать вместо перехваченного NtCreateThread оригинальный из UserMode. Такое возможно без написания драйвера?
Если перехват был в кернелмоде то без драйвера тяжко будет. Впрочем есть техники восстановления кернелмода из юзермода, навроде тулзы sdtrestore, но это эквилибристика к тому же в принципе не работающая на последних осях. Так что без драйвера не то что тяжко, — а ваще никак.
Как много веселых ребят, и все делают велосипед...
Re[6]: Вызов функции, перехваченной на уровне SDT
От:
Аноним
Дата:
29.03.11 00:37
Оценка:
Здравствуйте, ononim, Вы писали:
O>>>Sysenter из кернелмода делать не надо O>>>Просто вызываете и все. O>>>Мм. Возможно потребуется озаботиться Previous mode'ом, но поскольку вы не сказали толком надо вам это или нет пока этот вопрос опустим. MAN>>Извиняюсь, что сразу не написал, но вообще то хотелось вызвать вместо перехваченного NtCreateThread оригинальный из UserMode. Такое возможно без написания драйвера? O>Если перехват был в кернелмоде то без драйвера тяжко будет. Впрочем есть техники восстановления кернелмода из юзермода, навроде тулзы sdtrestore, но это эквилибристика к тому же в принципе не работающая на последних осях. Так что без драйвера не то что тяжко, — а ваще никак.
P>Если только восстанавливать SDT через непосредственную работу с \device\physicalmemory.
Секция \Device\PhysicalMemory недоступна для user mode кода уже очень давно (кажется, начиная с Windows XP SP3 и Server 2003 SP1).
Так что, остаётся только драйвер.
Вообще, восстановление адресов в nt!KiServiceTable() не самый лучший вариант, т.к. некоторый софт (NOD32, например) проверяет в цикле целостность своих перехватов.