Вызов функции, перехваченной на уровне SDT
От: idiMAN  
Дата: 23.12.10 08:03
Оценка:
Добрый день!

Каким образом можно вызвать функцию NtCreateThread, если её перехватил другой процесс путём подмены её адреса в SYSTEM_SERVICE_TABLE?
Re: Вызов функции, перехваченной на уровне SDT
От: -prus-  
Дата: 23.12.10 11:50
Оценка:
Здравствуйте, idiMAN, Вы писали:

MAN>Каким образом можно вызвать функцию NtCreateThread, если её перехватил другой процесс путём подмены её адреса в SYSTEM_SERVICE_TABLE?


Если идти по принципу наименьшего сопротивления, то попробую изложу свои мысли...

Насколько мне известно, все оригинальные адреса функций в SDT статичны, но эти адреса разные в разных ОС и сервис паках.
Например, для WinXP SP2 x86 NtCreateThread имеет оригинальный адрес 0x805cf804.

nt!NtCreateThread:
805cf804 6a28 push 28h
805cf806 68b0a84d80 push offset nt!ObWatchHandles+0x674 (804da8b0)
...
...

Идея в том, чтобы на чистой машине с нужной ОС, где хуки отсутствуют, посмотреть оригинальные адреса SDT, например, с помощью WinGdb или Rootkit Unhooker'a,
потом либо восстановить оригинальный адрес на хукнутой ОС и вызвать нужную функцию, либо напрямую, зная оригинальный адрес, вызвать функцию, положив в стек нужные параметры.

В теории как-то так...
С уважением,
Евгений
Re[2]: Вызов функции, перехваченной на уровне SDT
От: idiMAN  
Дата: 23.12.10 12:16
Оценка:
Здравствуйте, -prus-, Вы писали:

P>Насколько мне известно, все оригинальные адреса функций в SDT статичны, но эти адреса разные в разных ОС и сервис паках.


P>потом либо восстановить оригинальный адрес на хукнутой ОС и вызвать нужную функцию, либо напрямую, зная оригинальный адрес, вызвать

функцию, положив в стек нужные параметры.

С адресом функции всё понятно — допустим он у меня есть, с восстановлением тоже понятно, а вот как произвести вызов нужной функции напрямую, зная её адрес — нет. Ведь вызов происходит через Sysenter/Syscall (int 2Eh) а для этого передаётся не адрес функции, а её номер.
Re[3]: Вызов функции, перехваченной на уровне SDT
От: ononim  
Дата: 23.12.10 12:21
Оценка:
MAN>С адресом функции всё понятно — допустим он у меня есть, с восстановлением тоже понятно, а вот как произвести вызов нужной функции напрямую, зная её адрес — нет. Ведь вызов происходит через Sysenter/Syscall (int 2Eh) а для этого передаётся не адрес функции, а её номер.

Sysenter из кернелмода делать не надо
Просто вызываете и все.
Мм. Возможно потребуется озаботиться Previous mode'ом, но поскольку вы не сказали толком надо вам это или нет пока этот вопрос опустим.
Как много веселых ребят, и все делают велосипед...
Re[4]: Вызов функции, перехваченной на уровне SDT
От: idiMAN  
Дата: 23.12.10 13:46
Оценка:
Здравствуйте, ononim, Вы писали:

O>Sysenter из кернелмода делать не надо

O>Просто вызываете и все.
O>Мм. Возможно потребуется озаботиться Previous mode'ом, но поскольку вы не сказали толком надо вам это или нет пока этот вопрос опустим.

Извиняюсь, что сразу не написал, но вообще то хотелось вызвать вместо перехваченного NtCreateThread оригинальный из UserMode. Такое возможно без написания драйвера?
Re[5]: Вызов функции, перехваченной на уровне SDT
От: -prus-  
Дата: 23.12.10 14:09
Оценка:
Здравствуйте, idiMAN, Вы писали:

MAN>Извиняюсь, что сразу не написал, но вообще то хотелось вызвать вместо перехваченного NtCreateThread оригинальный из UserMode. Такое возможно без написания драйвера?


Если только восстанавливать SDT через непосредственную работу с \device\physicalmemory.
Посмотрите Win2K/XP SDT Restore 0.2 (Proof-Of-Concept),
а также документик Defeating Native API Hookers.
С уважением,
Евгений
Re[5]: Вызов функции, перехваченной на уровне SDT
От: ononim  
Дата: 23.12.10 14:10
Оценка: +1
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, но это эквилибристика к тому же в принципе не работающая на последних осях. Так что без драйвера не то что тяжко, — а ваще никак.

Можно и без драйвера, если покопать в сторону уязвимостей. Неплохую статью по данному вопросу можно найти здесь http://www.esagelab.ru/files/DriverBugs.pdf
Re[6]: Вызов функции, перехваченной на уровне SDT
От: d_olex http://esagelab.ru
Дата: 29.03.11 01:59
Оценка:
P>Если только восстанавливать SDT через непосредственную работу с \device\physicalmemory.

Секция \Device\PhysicalMemory недоступна для user mode кода уже очень давно (кажется, начиная с Windows XP SP3 и Server 2003 SP1).
Так что, остаётся только драйвер.

Вообще, восстановление адресов в nt!KiServiceTable() не самый лучший вариант, т.к. некоторый софт (NOD32, например) проверяет в цикле целостность своих перехватов.
http://d-olex.blogspot.com/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.