Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2012, 01:14   #1
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию Перехват обращения к COM-порту из драйвера

Доброго времени суток. Из драйвера режима ядра перехватываю ZwCreateFile. Если происходит обращение к COM-порту с определенным номером, то заменяю номер порта. Например, пользовательская прога обращается к COM3, в перехватчике заменяю на COM1. При этом ZwCreateFile возвращает STATUS_ACCESS_VIOLATION (0xC0000005). Не понимаю, в чем проблема.
Код перехватчика ZwCreateFile
Код:
NTSTATUS HookZwCreateFile(PHANDLE FileHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes,
PIO_STATUS_BLOCK IoStatusBlock, PLARGE_INTEGER AllocationSize, ULONG FileAttributes, ULONG ShareAccess,
ULONG CreateDisposition, ULONG CreateOptions, PVOID EaBuffer, ULONG EaLength)
{
        if(RtlCompareUnicodeString(&ComName, ObjectAttributes->ObjectName, FALSE) == 0)
	{
		RtlInitUnicodeString(ObjectAttributes->ObjectName, L"\\Device\\serial0");
		DbgPrint("User programm called virtual COM-port");
		DbgPrint("ObjectAttributes->ObjectName in hooked loop = %ws", ObjectAttributes->ObjectName->Buffer);
		status = ((ZWCREATEFILE)(OrigZwCreateFile))(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize, FileAttributes, ShareAccess,
					CreateDisposition, CreateOptions, EaBuffer, EaLength);
		DbgPrint("Parameters send to original ZwCreateFile");
		DbgPrint("Status = 0x%p", status);
	}
//not virtual COM-port
	else
	{
		status = ((ZWCREATEFILE)(OrigZwCreateFile))(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize, FileAttributes, ShareAccess,
					CreateDisposition, CreateOptions, EaBuffer, EaLength);
	}

	return status;
}
Пробовал \\Device\\serial0, \\DosDevices\\COM1, \\??\\COM1 - результат тот же. Кто-нибудь знает, как это исправить
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 24.09.2012, 09:50   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

A теперь представте себе, что тот, кто вызвал ZwCreateFile выделил память под ObjectName и после вызова ее освобождает - я бы на вашем месте делал копии того, что надо изменить. В принципе, закомментируйте весь код (кроме вызова оригинальной функции) и начинайте шаг за шагом возвращать код строчку за строчкой - так сразу поймете где проблема. Ну и кроме того когда возникает такая ошибка с ней обычно прописан и адрес - загружаем kernel debugger и идем смотреть что там и т.д.
waleri вне форума Ответить с цитированием
Старый 24.09.2012, 22:52   #3
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Решил проблему. В ObjectAttributes->ObjectName надо было копировать строку с адресом в user-mode.
Код:
if((RtlCompareUnicodeString(&ComName, ObjectAttributes->ObjectName, FALSE) == 0))
		{	
			PWSTR PortName = L"\\DosDevices\\COM4\0";
			PWSTR PortNameToMap = ExAllocatePoolWithTag(NonPagedPool, 0x1000, '1gaT');
			PMDL pMdl;

			RtlCopyMemory(PortNameToMap, PortName, wcslen(PortName)*sizeof(WCHAR));

			pMdl = IoAllocateMdl(PortNameToMap, 0x1000, FALSE, TRUE, NULL);
			MmBuildMdlForNonPagedPool(pMdl);
			__try
			{
				PVOID UserModePointer = MmMapLockedPagesSpecifyCache(pMdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority);

				if(UserModePointer)
				{
					RtlInitUnicodeString(ObjectAttributes->ObjectName, (PWSTR)UserModePointer);
				
					DbgPrint("User programm called virtual COM-port");
					DbgPrint("ObjectAttributes->ObjectName in hooked loop = %ws", ObjectAttributes->ObjectName->Buffer);

					status = ((ZWCREATEFILE)(OrigZwCreateFile))(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize, FileAttributes, ShareAccess,
						CreateDisposition, CreateOptions, EaBuffer, EaLength);
					DbgPrint("Parameters send to original ZwCreateFile");
					DbgPrint("Status = 0x%p", status);
					MmUnmapLockedPages(UserModePointer, pMdl);
					DbgPrint("User mode pointer unmapped");
				}
			}

			__except(EXCEPTION_EXECUTE_HANDLER)
			{
				DbgPrint("Mapping failed");
			}

			IoFreeMdl(pMdl);
			ExFreePool(PortNameToMap);
		}
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача по СОМ-порту Faton 11 C# (си шарп) 7 18.06.2012 10:19
Частые обращения к БД Newpitbull SQL, базы данных 5 14.02.2012 20:00
Подключиться к COM порту doober Общие вопросы .NET 3 23.07.2009 13:34
Перехват движения мыши, подключенной к заданному порту. Mixasik Общие вопросы Delphi 5 28.12.2008 18:47
Доступ к ИК порту ЧИЖ Win Api 4 09.05.2007 20:41