
15.04.2010, 21:15
|
|
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами:
10097606
Репутация:
3349
|
|
Мдауж. За сброс WP бита Great бы
Я буду долго бить ногами за аппаратное отключение CR0. WP и уж тем более за запрет прерываний.
Когда нужно хукнуть 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. Оставшийся байт ты можеш не успеть записать если второе ядро успеет попасть на эту функцию. Маловероятное событие, но всё же.
Последний раз редактировалось slesh; 15.04.2010 в 21:17..
|
|
|