HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #11  
Старый 28.09.2007, 00:21
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

переписал на DeviceIoControl
но чуть не допер как получить параметр.
сделал вот что. но тут чегото не хватает. А именно знаний в С:
Код:
if (irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL) 
 {
  switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
   {
	case 0x12345:
	    if (irpStack->Parameters.DeviceIoControl.InputBufferLength == sizeof(HANDLE)) 
		{
------> Вот тут я туплю. Как правильно сделать? ProtectedPid=Irp->AssociatedIrp.SystemBuffer;
				DPRINT("PID= %d",ProtectedPid);
		}
		break;
		
	default: status = STATUS_INVALID_DEVICE_REQUEST;
	}
 
 }
 
Ответить с цитированием

  #12  
Старый 28.09.2007, 00:33
Ni0x
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
Провел на форуме:
2009677

Репутация: 472
По умолчанию

Тут указаны примеры для разных методов:
Код:
stack = IoGetCurrentlrpStackLocation (Irp); 
switch (pIrpStack->MajorFunction) 
{
case IRP_MJ_CREATE: case IRP_MJ_CLOSE: break;
case IRP_MJ_DEVICE_CONTROL:
switch (stack->Parameters.DeviceloControl.loControlCode) 
{ 
case IOCTL_MY_BUFFERED:
InBuffer = Irp->AssociatedIrp.SystemBuffer; 
InLength =  stack->Parameters.DeviceloControl.InputBuffer.Length; 
OutBuffer = Irp->AssociatedIrp.SystemBuffer; 
OutLength = stack->Parameters.DeviceloControl.OutputBufferLength; 
case IOCTL_MY_IN_DIRECT:
//OutBuffer доступен только для чтения 
InBuffer = Irp->AssociatedIrp.SystemBuffer; 
InLength = stack->Parameters.DeviceloControl.InputBufferLength; 
OutBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress );
OutLength = stack->Parameters.DeviceloControl.OutputBufferLength; 
break; 
case IOCTL_MY_OUT_DIRECT:
//OutBuffer доступен для чтения/записи 
InBuffer = Irp->AssociatedIrp.SystemBuffer; 
InLength = stack->Parameters.DeviceloControl.InputBufferLength; 
OutBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress);
OutLength = stack->Parameters.DeviceloControl.OutputBufferLength; break;
case IOCTL_MY_NEITHER:
InBuffer = irpStack->Parameters.DeviceloControl.TypeInputBuffer;
InLength = irpStack->Parameters.DeviceIoControl.InputBufferLength; 
OutBuffer = Irp->UserBuffer;
OutLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength; 
break;
Также обязательно прочитай:
Цитата:
При использовании буферизованного метода, Диспетчер ввода/вывода выделяет в системной невыгружаемой памяти промежуточный буфер, размер которого равен максимальному из размеров буферов InBuffer и OutBuffer. Если при запросе был определен InBuffer и его длина не нулевая, содержание InBuffer копируется в промежуточный буфер. В любом случае, адрес промежуточного буфера помещается в IRP в поле Associatedlrp.SystemBuffer. Затем IRP, содержащий запрос, передается драйверу.
Данные, находящиеся в промежуточном буфере, могут читаться и перезаписываться драйвером. Затем драйвер размещает в промежуточном буфере данные, которые нужно вернуть в OutBuffer.
При завершении запроса ввода/вывода, если OutBuffer был определен при запросе ввода/вывода и его длина не нулевая, Диспетчер ввода/вывода копирует из промежуточного буфера в OutBuffer столько байтов, сколько было указано в поле 1гр->IoStatus.Information. После этого, как и при любом буферизированном запросе Ввода/вывода, Диспетчер ввода/вывода освобождает промежуточный буфер.
При использовании методов METHOD_IN_DIRECT и METHOD_OUT_ DIRECT, буфер InBuffer, если он определен в запросе ввода/вывода и его длина не нулевая, обрабатывается в точности так же, как и при буферизованном вводе/выводе. В этом случае выделяется промежуточный буфер, в него копируется InBuffer, указатель на промежуточный буфер помещается в IRP в поле Associatedlrp.SystemBuffer.
Буфер OutBuffer, если он определен в запросе ввода/вывода и его длина не нулевая, обрабатывается в соответствии с прямым вводом/выводом. В этом случае адрес проверяется на возможность доступа (запись или чтение), производится закрепление физических страниц в памяти, и создается таблица описания памяти MDL, описывающая OutBuffer. Указатель на MDL передается в поле Irp->MdlAddress.
При использовании метода METHOD_NEITHER, оба буфера передаются в соответствии с методом Neither. To есть, не производится проверка доступности памяти, не выделяются промежуточные буфера и не создаются MDL. В пакете IRP передаются виртуальные адреса буферов в пространстве памяти инициатора запроса ввода/вывода. Адрес буфера OutBuffer передается в фиксированной части IRP в поле Irp-
>UserBuffer, адрес буфера InBuffer передается в стеке размещения ввода/вывода в поле stack->Parameters.DeviceControl.TypeInputBuffer.

Последний раз редактировалось Ni0x; 28.09.2007 в 15:49..
 
Ответить с цитированием

  #13  
Старый 28.09.2007, 08:58
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Цитата:
Сообщение от Ky3bMu4  
Если я не ошибаюсь, то для передачи информации драйвер<->программа драйвер должен создать устройство, через которое будет передаваться инфа. Вот тебе:
http://www.wasm.ru/article.php?article=apihook_3 (см.Взаимодействие драйвера с приложением)
И вот: http://wasm.ru/article.php?article=drvw2k04
Я тебя умоляю, если ты не шаришь в теме, не пиши
 
Ответить с цитированием

  #14  
Старый 28.09.2007, 15:30
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

подскажите что я делаю не так. почему BSOD?
При установке ProtectedPid - ставится всё нормально и пашет отлично.
А при чтении его - BSOD. читаю через

PID,TrId:dword;
DeviceIoControl(hDriver, $23456, nil, 0, @PID, 4, TrId, nil);

Вот код обработчика
Код:
HANDLE ProtectedPid;

NTSTATUS DriverDispatcher(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
 NTSTATUS status;
 PIO_STACK_LOCATION irpStack;
 irpStack = IoGetCurrentIrpStackLocation (Irp);
 
if (irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL) 
 {
  switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
   {
	case 0x12345:
	    if (irpStack->Parameters.DeviceIoControl.InputBufferLength == sizeof(HANDLE)) 
		{
		       
				ProtectedPid=*(HANDLE *)Irp->AssociatedIrp.SystemBuffer;
				DPRINT("PID= %d",ProtectedPid);
	 	}
		break;
	case 0x23456:
	if (irpStack->Parameters.Read.Length < 4)
    {
	    DPRINT("LENGTH < 4");
        Irp->IoStatus.Status = status = STATUS_BUFFER_TOO_SMALL;
        Irp->IoStatus.Information  = 0;
        IoCompleteRequest (Irp, IO_NO_INCREMENT);
        return status;
    } 
	 else
	{
     DPRINT("LENGTH OK");	
     Irp->IoStatus.Information  = 4;
// чтото тут я не мойму как реализовать.
	 *(HANDLE *)Irp->AssociatedIrp.SystemBuffer=ProtectedPid;
	 Irp->IoStatus.Status = status = STATUS_SUCCESS;
  	 IoCompleteRequest (Irp, IO_NO_INCREMENT);
     return status;
	}
	break;
	
	default: status = STATUS_INVALID_DEVICE_REQUEST;
	}
 
 }

Irp->IoStatus.Status = status;
IoCompleteRequest (Irp, IO_NO_INCREMENT);

 return status;
 }
 
Ответить с цитированием

  #15  
Старый 28.09.2007, 21:28
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Кто тебе сказал что ты можешь какие угодно io control code задавать?
Юзай макрос IOCTL_CODE()
Самое главное - тип ввода-вывода (младшие 2 бита), у тебя видно тип не buffered во втором случае (да и в первом тоже)
 
Ответить с цитированием

  #16  
Старый 28.09.2007, 22:56
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

2 _Great_ Ты имеешь ввиду что именно через CTL_CODE и истанавливаются прва на запись, чтение и мето ввода-вывод?

Вот еще сталкнулся с такой проблемой. Иногда почемуто програма не может связаться с драйвером. Драйвер у меня как сервис. Поэтому я делаю:
net stop MyDRV
потом перекомпиливаю драйвер
затем: net start MyDRV
Все пахало нормально. но потом через несколько перезагрузок почемуто из програмы не возможно связаться с драйвером. т.е.
CreateFile('\\.\MyDRVS', GENERIC_ALL, 0, nil, OPEN_EXISTING, 0, 0);
возвращает INVALID_HANDLE_VALUE
Хотя драйвер пашет нормально - по дебаговым сообщением видно что создания процессов перехватываются. НО связи по сей час нет. уже перезагружался пару раз - дохлое дело.

Также заметил один интерестный факт. Вроде все програмы и DLL ки виндовые отображаются на память, а драйвера получается что нет? потому что при запущенном драйвере можно спакойно удалить файл драйвара.

Последний раз редактировалось slesh; 28.09.2007 в 23:14..
 
Ответить с цитированием

  #17  
Старый 28.09.2007, 23:50
Ni0x
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
Провел на форуме:
2009677

Репутация: 472
По умолчанию

А самому лень посмотреть?
winioctl.h
Код:
#define CTL_CODE( DeviceType, Function, Method, Access ) (                 
    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) 
)
 
Ответить с цитированием

  #18  
Старый 29.09.2007, 00:17
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


Question

Цитата:
Также заметил один интерестный факт. Вроде все програмы и DLL ки виндовые отображаются на память, а драйвера получается что нет? потому что при запущенном драйвере можно спакойно удалить файл драйвара.
А тебе драйвера то не рано ещё писать? ; )
И DLL и EXE любую можно удалить без проблем как и драйвер.
Просто после загрузки драйвера винда не лочит попытки удаления его файла на диске, а для user-mode модулей - лочит. Т.е. файл остается открытым для user-mode модулей и закрывается сразу после загрузки для драйверов (а нахер ему быть открытым).
Но, ИМХО, одно из двух писал НЕ ты. Либо "драйвер не отображается на память", либо сам драйвер ; )

Учитесь как надо кодить

всё хотел кому-нибудь показать чтоб оценили
гыгыг

Последний раз редактировалось KEZ; 29.09.2007 в 00:24..
 
Ответить с цитированием

  #19  
Старый 29.09.2007, 07:53
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Цитата:
Сообщение от slesh  
2 _Great_ Ты имеешь ввиду что именно через CTL_CODE и истанавливаются прва на запись, чтение и мето ввода-вывод?
Некоторые биты ио контрол кода служебные. А ты рандомно задаешь все число. Поэтому и глюки

Цитата:
CreateFile('\\.\MyDRVS', GENERIC_ALL, 0, nil, OPEN_EXISTING, 0, 0);
возвращает INVALID_HANDLE_VALUE
GetLastError() ?
 
Ответить с цитированием

  #20  
Старый 29.09.2007, 08:01
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

2 _Great_ спасибо за разъяснение. Переписал все через CTL_CODE.
Но всеже также осталась проблема с доступом к драйверу.
GetLastError дает код ошибки - 317
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с Аничатовскими штучками. temon Болталка 4 27.09.2005 12:52
ПРОБЛЕМЫ С ВИНДОЙ!!! ГЛЮК ИЛИ ЖУК??? Demerus С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby 18 16.01.2005 12:53



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ