ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

28.09.2007, 00:21
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
переписал на 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;
}
}
|
|
|

28.09.2007, 00:33
|
|
Постоянный
Регистрация: 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..
|
|
|

28.09.2007, 08:58
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
Сообщение от Ky3bMu4
Если я не ошибаюсь, то для передачи информации драйвер<->программа драйвер должен создать устройство, через которое будет передаваться инфа. Вот тебе:
http://www.wasm.ru/article.php?article=apihook_3 (см.Взаимодействие драйвера с приложением)
И вот: http://wasm.ru/article.php?article=drvw2k04
Я тебя умоляю, если ты не шаришь в теме, не пиши
|
|
|

28.09.2007, 15:30
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
подскажите что я делаю не так. почему 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;
}
|
|
|

28.09.2007, 21:28
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
Кто тебе сказал что ты можешь какие угодно io control code задавать?
Юзай макрос IOCTL_CODE()
Самое главное - тип ввода-вывода (младшие 2 бита), у тебя видно тип не buffered во втором случае (да и в первом тоже)
|
|
|

28.09.2007, 22:56
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
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..
|
|
|

28.09.2007, 23:50
|
|
Постоянный
Регистрация: 27.08.2006
Сообщений: 367
Провел на форуме: 2009677
Репутация:
472
|
|
А самому лень посмотреть?
winioctl.h
Код:
#define CTL_CODE( DeviceType, Function, Method, Access ) (
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)
)
|
|
|

29.09.2007, 00:17
|
|
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме: 1941233
Репутация:
2726
|
|
Также заметил один интерестный факт. Вроде все програмы и DLL ки виндовые отображаются на память, а драйвера получается что нет? потому что при запущенном драйвере можно спакойно удалить файл драйвара.
А тебе драйвера то не рано ещё писать? ; )
И DLL и EXE любую можно удалить без проблем как и драйвер.
Просто после загрузки драйвера винда не лочит попытки удаления его файла на диске, а для user-mode модулей - лочит. Т.е. файл остается открытым для user-mode модулей и закрывается сразу после загрузки для драйверов (а нахер ему быть открытым).
Но, ИМХО, одно из двух писал НЕ ты. Либо "драйвер не отображается на память", либо сам драйвер ; )
Учитесь как надо кодить

всё хотел кому-нибудь показать чтоб оценили
гыгыг
Последний раз редактировалось KEZ; 29.09.2007 в 00:24..
|
|
|

29.09.2007, 07:53
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
Сообщение от slesh
2 _Great_ Ты имеешь ввиду что именно через CTL_CODE и истанавливаются прва на запись, чтение и мето ввода-вывод?
Некоторые биты ио контрол кода служебные. А ты рандомно задаешь все число. Поэтому и глюки
CreateFile('\\.\MyDRVS', GENERIC_ALL, 0, nil, OPEN_EXISTING, 0, 0);
возвращает INVALID_HANDLE_VALUE
GetLastError() ?
|
|
|

29.09.2007, 08:01
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
2 _Great_ спасибо за разъяснение. Переписал все через CTL_CODE.
Но всеже также осталась проблема с доступом к драйверу.
GetLastError дает код ошибки - 317
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|