Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перехват ZwWriteFile в ядре...  (Прочитано 12165 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sasha_s7
Гость
« : 05-06-2006 07:45 » 

Написал простой драйверок. Перехватил  ZwWriteFile через SDT. Запустил аппликуху в юзерспайсе которая открывает, пишет, закрывает файл и все в цикле. Результат -- НОЛЬ! Перехватываются только вызовы из ядра -- т.е. когда я загружаю какой-нидь другой драйвер, в котором лог пишу, то тогда вызывается моя перехваченная ZwWriteFile, а из юзерспайса -- НОЛЬ!
В чем грабли? Чего я не учел?
Записан
sss
Специалист

ru
Offline Offline

« Ответ #1 : 05-06-2006 08:09 » 

Номер затычки Int 2E = 0x00ED ?
Записан

while (8==8)
sasha_s7
Гость
« Ответ #2 : 05-06-2006 08:41 » 

Извиняй, но я не совсем понял твой жаргон Улыбаюсь).

Я это все юзаю под XP, а под ней для вызова сервиса в ядре используется команда "sysenter", а не int 2E как в win2000...
Записан
ILIS
Гость
« Ответ #3 : 05-06-2006 09:32 » 

нужно перехватывать NtWriteFile, экспортируемую ntoskrnl.exe
Записан
sasha_s7
Гость
« Ответ #4 : 05-06-2006 09:36 » 

Какой номер в SDT у NtWriteFile? Насколько я знаю -- тот же самый что и у ZwWriteFile...
Записан
sasha_s7
Гость
« Ответ #5 : 05-06-2006 10:28 » 

Сформирую вопросс иначе:
Что надо перехватить (желательно индекся функций в SDT) что бы перехватить все операции записи в файлы (открытые, созданные неважно какими функциями) как в кернеле, так и в юзерспайсе???
Записан
ILIS
Гость
« Ответ #6 : 05-06-2006 11:18 » 

Чтобы узнать индекс какой-то нейтив апи загрузи ntdll.dll в IDA и посмотри тело функции, там обычно в eax загружается ее индекс напр.
 public ZwWriteFile
.text:7C90E9F3 ZwWriteFile:                            ; CODE XREF: .text:7C9311E6p
.text:7C90E9F3                 mov     eax, 112h        ; NtWriteFile
.text:7C90E9F8                 mov     edx, 7FFE0300h
.text:7C90E9FD                 call    dword ptr [edx]
.text:7C90E9FF                 retn    24h
Записан
XKey
Гость
« Ответ #7 : 05-06-2006 20:57 » 

а может подскажите где накопать индексы SDTдля XP?2003?
Записан
sasha_s7
Гость
« Ответ #8 : 06-06-2006 08:42 » 

Есть такая тулза SDTRestore, в ней есть код по определению индекса ф-ции...
Поищи гуглом, она с исходниками идет...

вот пробежка по таблице экспортов и выцепление номера для каждой ф-ции:
Код:
for(DWORD i = 0; i < numEntries; i++)
{
// i now contains the index of the API in the Ordinal Table
// ptr points to Export directory table
WORD ordinalValue = ExportOrdinalTable[i];
DWORD apiAddr = (DWORD)ExportAddrTable[ordinalValue] + hModule;
char *exportName = (char *)(ExportNamePointerTable[i] + hModule);

// Win2K
if(ov.dwMinorVersion == 0 &&
   *((unsigned char *)apiAddr) == 0xB8 &&
   *((unsigned char *)apiAddr + 9) == 0xCD &&
   *((unsigned char *)apiAddr + 10) == 0x2E)
{
DWORD serviceNum = *(DWORD *)((char *)apiAddr + 1);
if (strcmp(exportName, func_name) == 0)
func_num = serviceNum;
if (serviceNum < count_funcs)
strcpy(out_buf + serviceNum*len_one_element, exportName);
}
// WinXP
else if(ov.dwMinorVersion == 1 &&
*((unsigned char *)apiAddr) == 0xB8 &&
*((unsigned char *)apiAddr + 5) == 0xBA &&
*((unsigned char *)apiAddr + 6) == 0x00 &&
*((unsigned char *)apiAddr + 7) == 0x03 &&
*((unsigned char *)apiAddr + 8) == 0xFE &&
*((unsigned char *)apiAddr + 9) == 0x7F)
{
DWORD serviceNum = *(DWORD *)((char *)apiAddr + 1);
if (strcmp(exportName, func_name) == 0)
func_num = serviceNum;
if (serviceNum < count_funcs)
strcpy(out_buf + serviceNum*len_one_element, exportName);
}
}
« Последнее редактирование: 12-06-2006 10:03 от Алексей1153 » Записан
sss
Специалист

ru
Offline Offline

« Ответ #9 : 07-06-2006 00:35 » new

Извиняй, но я не совсем понял твой жаргон Улыбаюсь).

Я это все юзаю под XP, а под ней для вызова сервиса в ядре используется команда "sysenter", а не int 2E как в win2000...

Как и в случае W2K вызовы ядра из пространства пользователя проходят через "угольное ушко" прерывания int 2E... Если хочешь реально разобраться, применяй отладчики ядра. Они тебе помогут все номера узнать.
Записан

while (8==8)
Krutoy
Гость
« Ответ #10 : 11-06-2006 06:06 » 

Не всегда функции Zw_XXX и Nt_XXX совпадают, т.е. функции Zw_XXX не всегда вызываются функциями Nt_XXX. Вот еще пример, пытался прехватить API CreateFile, путем замены через SDT и методом сплайсинга функций NtCreateFile и ZwCreateFile. В проводнике все нормально... а вот FAR использует IoCreateFile...
Записан
sasha_s7
Гость
« Ответ #11 : 12-06-2006 07:21 » 

Так я это и имел ввиду. На примере ZwWriteFile и  NtWriteFile:
В юзерспайсе это одно и тоже! Но в ядре разные вещи... ZwWriteFile вызывается драйверами, а NtWriteFile вызывается для программ юзерспайса! Я уже решил проблему перехвата. Юзаю дизассемблер и вставляю JMP в начало ф-ции. Факт в том что NtWriteFile через SDT не хукнеш
Записан
Krutoy
Гость
« Ответ #12 : 12-06-2006 08:31 » 

Я вообще когда можно перехватываю функции через SDT и вставкой JMP одновременно (на всякий случай). Но и тут есть один прикол... По идее в ядре Nt и Zw функции это одно и тоже. Т.е. юзер вызывает Nt функцию через ntdll.dll, затем она направляется в ядро и вызывает соответствующую Zw функцию. Только это не всегда так. Некоторые функции дальше ntdll почему-то не идут (непомню какие, но были)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines