Показать сообщение отдельно

  #28  
Старый 16.04.2010, 11:30
sn0w
Статус пользователя:
Регистрация: 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..
 
Ответить с цитированием