
16.04.2010, 11:30
|
|
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме: 1290766
Репутация:
1236
|
|
Сообщение от slesh
Мдауж. За сброс WP бита Great бы
Когда нужно хукнуть SDT то делаю так:
Код:
// функция установки и снятия перехвата
BOOL SetHook(USHORT id, ULONG NewAddr, PULONG OldAddr)
{
BOOL ret = false;
ULONG Addr;
PHYSICAL_ADDRESS PhysicalAddr;
ULONG VirtualAddr;
Addr = (ULONG)KeServiceDescriptorTable->ServiceTable; // получаем адрес таблицы сервисов
if (Addr) // если нет ошибки
{
Addr += 4 * id; // вычислим адрес функции которую необходимо перехватить
if (OldAddr) // если указана память для сохранения старого значения
{
*(ULONG*)OldAddr = *(ULONG*)Addr; // сохраним старый адрес
}
// получим физический адрес, зная виртуальный
PhysicalAddr = MmGetPhysicalAddress((void*)Addr);
if (PhysicalAddr.QuadPart)
{
// выделим себе виртуальную память по физ. адресу
VirtualAddr = (ULONG)MmMapIoSpace(PhysicalAddr, 4, 0);
if (VirtualAddr)
{
*(ULONG*)VirtualAddr = NewAddr; // установим перехват
ret = true;
MmUnmapIoSpace((void*)VirtualAddr, 4); // освободим вирт. страницу памяти
}
}
}
return ret;
}
Если не хукать SDT а просто писать куда-либо то достаточно будет просто сделать копию страници и записать туда данные
А вообще тут даже запрет прерываний не поможет.
Если ты вписываешь JMP XX XX XX XX то как не крути, нужно записать 5 байт. При атомарном доступе максимум 4. Оставшийся байт ты можеш не успеть записать если второе ядро успеет попасть на эту функцию. Маловероятное событие, но всё же.
найс, но поэтому прерывания и снимаются (раньше все одноядерные были). кстати неплохо, правда мне больше нравится перехватывать сами Nt а не таблицу.
ща на 7 попробую с кисом.
__________________
 
snow white world wide
Последний раз редактировалось sn0w; 16.04.2010 в 11:36..
|
|
|