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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с установкой перехвата API в ядре на ассемблере  (Прочитано 7004 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
AB_Celitel
Гость
« : 13-07-2005 10:42 » 

Приветствую всех!
Я меня прблема, написал драйвер перехватчик  на асме.
Работает нормально, но не передаётся управление на мою перехватчик-функцию.
Ниже привожу кусок кода из моего драйвера, где я думаю возможно ошибка.

.data
true_addr dd 0
dbg_mes_sethk db "set hook",0
dbg_mes_fromhook db "from hookproc",0
dbg_mes_delhk db "del hook",0

DriverEntry proc

local CR0Reg:dword

...
...
...

; Set Hook
mov eax,CR0
mov CR0Reg,eax
and eax,0FFFEFFFFh
mov CR0,eax

mov edx,KeServiceDescriptorTable
mov eax,dword ptr [edx] ; ntoskrnl.ServiceTable

mov ecx,dword ptr [eax+(7ah*4h)] ; true_addr =  = KeServiceDescriptorTable->ntoskrnl.ServiceTable[7Ah]  7ah - индекс OpenProcess в SDT

mov true_addr,ecx ;
 mov ecx,offset hookprocapi ; KeServiceDescriptorTable-> ->ntoskrnl.ServiceTable[7Ah] = = hookprocapi
mov dword ptr [eax+(7ah*4h)],ecx ; 


mov eax,CR0Reg
mov CR0,eax

invoke DbgPrint, addr dbg_mes_sethk
...
...
DriverEntry endp

;****** Функция-перехватчик******
hookprocapi proc
invoke DbgPrint, addr dbg_mes_fromhook

jmp dword ptr [true_addr]

ret
hookprocapi endp
;**********************


DriverUnload proc

local CR0Reg:dword

; del Hook
mov eax,CR0
mov CR0Reg,eax
and eax,0FFFEFFFFh
mov CR0,eax

mov edx,KeServiceDescriptorTable
mov edx,dword ptr [edx]
mov ecx,true_addr
mov dword ptr [edx+(7ah*4h)],ecx



mov eax,CR0Reg
mov CR0,eax

invoke DbgPrint, addr dbg_mes_delhk

...
...
...


ret

DriverUnload endp

Так вот, проблема в том, что на hookprocapi вызов не приходит.
Если кто-нибудь знает причину (или хотя бы догадывается) прошу написать.
Заранее спасибо.
P.S.
Если нужно могу выслать драйвер целиком
Записан
AB_Celitel
Гость
« Ответ #1 : 14-07-2005 05:54 » 

Хочу сделать небольшое пояснение.
Если перехват писать на C, то получаться
следующие структуры:

typedef struct _SYSTEM_SERVICE_TABLE
{
    PNTPROC ServiceTable;
    PDWORD  CounterTable;
    ULONG   ServiceLimit;
    PBYTE   ArgumentTable;
}

typedef struct _SERVICE_DESCRIPTOR_TABLE {
   SYSTEM_SERVICE_TABLE ntoskrnl;  //SST для ntoskrnl.exe
   SYSTEM_SERVICE_TABLE win32k;    //SST для win32k.sys
   SYSTEM_SERVICE_TABLE unused1;   //не используется
   SYSTEM_SERVICE_TABLE unused2;   //не используется
}


На SERVICE_DESCRIPTOR_TABLE указывает экспортируемая
переменная KeServiceDescriptorTable.
Но по строению этих структур можно увидеть, что
KeServiceDescriptorTable вроде как указывает прямо на
SERVICE_DESCRIPTOR_TABLE.ntoskrnl.ServiceTable
в котором находится указатель на массив указателей
ф-ций ядра.
Т.е. если писать на асме :

 получаем в eax указатель на массив указатель ф-ций
 mov edx,KeServiceDescriptorTable
 mov eax,dword ptr [edx]

 Затем ,к примеру, берём адрес NtOpenProcess из этого массива
 (NtOpenProcess в WinXp - 7Ah)
 mov ecx,dword ptr [eax+(7ah*4h)]
 mov true_addr,ecx ; сохраняем его

 Затем заменяем адрес NtOpenProcess на адрес своей ф-ции
 mov ecx,offset hookprocapi
 mov dword ptr [eax+(7ah*4h)],ecx

Вроде как всё сделано правильно, а на свою ф-цию hookprocapi
вызов не приходит, и NtOpenProcess нормально исполняется.
Но самое интересное, что даже BSOD не вылетает.
Поэтому, если кто знает в чем ошибочка большая просьба написать.
Заранее спасибо.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 20-07-2005 14:51 » new

А дебагером проверить никак? Действительно хукнул там где надо?
Как объявлено KeServiceDescriptorTable? Есть подозрение что тебе еще разок надо разименовать KeServiceDescriptorTable, так как у тебя возможно указатель на переменную с адресом массива KeServiceDescriptorTable.
« Последнее редактирование: 20-07-2005 14:54 от SlavaI » Записан
AB_Celitel
Гость
« Ответ #3 : 21-07-2005 11:40 » 

Огромное спасибо SlavaI !!!
Я попробовал сделать как ты сказал и всё работает.Даже самому обидно, что до такого пустяка сам не смог догадаться.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines