Сейчас на форуме: asfa, Rio (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Вопрос по простому драйверу
Посл.ответ Сообщение

Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 06 сентября 2013 18:35 · Поправил: vden
· Личное сообщение · #1

Вот очень простой драйвер

По адресу 1031A обработчик mjDeviceControl.

в начале примерно такой код

Code:
  1.   v2 = Irp;
  2.   v3 = Irp->Tail.Overlay.CurrentStackLocation;
  3.   Size = *((_DWORD *)v3 + 2);
  4.   v4 = *((_DWORD *)v3 + 1);
  5.   Address = Irp->AssociatedIrp.MasterIrp;
  6.  
  7.   if ( *((_DWORD *)v3 + 3) == 0xABE13002 )
  8.   {
  9.     Irp->IoStatus.Information = 0;
  10.     v15 = 0;
  11.     v14 = 0;
  12.     v5 = Irp->MdlAddress;
  13.     if ( v5 )
  14.     {


на какую структуру должен указывать v3 ?

точнее, что это за обращения?
Size = *((_DWORD *)v3 + 2);
if ( *((_DWORD *)v3 + 3) == 0xABE13002 )

ида задетектила как

struct _IRP::$::$::$::$A02EC6A2CE86544F716F4825015773AC::_IO_STACK_LOCATION *v3




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 06 сентября 2013 18:42 · Поправил: reversecode
· Личное сообщение · #2

PIO_STACK_LOCATION
так а гугл как же? он же велик и могуч

ps
драйвер на бейсике http://habrahabr.ru/post/145926/

| Сообщение посчитали полезным: vden

Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 06 сентября 2013 18:49 · Поправил: vden
· Личное сообщение · #3

Я начал читать мануалы из msdn, но там же куча всего А так хочется просто подставить структуру для v3 побыстрее.

Такс, а ида в своем декомпиле не дает выбрать из union?




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 06 сентября 2013 18:53 · Поправил: reversecode
· Личное сообщение · #4

зачем из юнион? ида уже определила у тебя
struct _IRP::$::$::$::$A02EC6A2CE86544F716F4825015773AC::_IO_STACK_LOCATION *
лучше глянь переменная в хексрее действительно такой тип имеет или нет
и в структурах ида корректно разверунла _IO_STACK_LOCATION
или там пусто
--> Link <--



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 06 сентября 2013 19:01 · Поправил: vden
· Личное сообщение · #5

v3 имеет тип struct _IRP::$::$::$::$A02EC6A2CE86544F716F4825015773AC::_IO_STACK_LOCATION *

но это вроде не правильно выбранный член юнион

я так понимаю, юнион должен выбирать вот такое


Code:
  1. ...
  2.         struct {
  3.             ULONG  OutputBufferLength;
  4.             ULONG POINTER_ALIGNMENT  InputBufferLength;
  5.             ULONG POINTER_ALIGNMENT  IoControlCode;
  6.             PVOID  Type3InputBuffer;
  7.         } DeviceIoControl;
  8. ...


попробую-ка вручную




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 06 сентября 2013 19:06 · Поправил: reversecode
· Личное сообщение · #6

нет, она заканчивается указателем если верить
--> Link <--
и все она правильно выбрала

Size = *((_DWORD *)v3 + 2);
v4 = *((_DWORD *)v3 + 1);

это параметры
дальше в switch Control

union это дальше как тип параметра должно позволять выбирать



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 06 сентября 2013 19:10
· Личное сообщение · #7

структуру на нирсофт я видел. она то меня сначала и запутала

вот хорошая ссылка




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 06 сентября 2013 19:19 · Поправил: reversecode
· Личное сообщение · #8

добавь в иду тип _IO_STACK_LOCATION
он автоматически добавится стандартный
и определи указатель на него
там все дальше вроде понятно
это все параметры
а вот какого запроса хз )


Code:
  1.   v3 = (_IO_STACK_LOCATION *)Irp->Tail.Overlay.CurrentStackLocation;
  2.   Size = v3->Parameters.DeviceIoControl.InputBufferLength;
  3.   v4 = v3->Parameters.DeviceIoControl.OutputBufferLength;
  4.   Address = Irp->AssociatedIrp.SystemBuffer;
  5.  
  6.   if ( v3->Parameters.DeviceIoControl.IoControlCode == 0xABE13002 )
  7.   {




Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 06 сентября 2013 19:21 · Поправил: vden
· Личное сообщение · #9

вот что должно было быть выбрано

Code:
  1. 00000000 _IO_STACK_LOCATION::$B951A50585B70E56AF4C24F92E932697::$3EEFC530056981631A2136A7505B6E7C struc ; (sizeof=0x10, standard type)
  2. 00000000 OutputBufferLength dd ?
  3. 00000004 InputBufferLength dd ?
  4. 00000008 IoControlCode   dd ?
  5. 0000000C Type3InputBuffer dd ?                   ; offset
  6. 00000010 _IO_STACK_LOCATION::$B951A50585B70E56AF4C24F92E932697::$3EEFC530056981631A2136A7505B6E7C ends


просто в старом хексрее вроде нельзя выбирать юнион

да, вот вроде https://www.hex-rays.com/products/decompiler/news.shtml

сделали в 2011/10/05


в итоге выглядит так

Code:
  1.   v2 = Irp;
  2.   v3 = (IO_STACK_LOCATION_for_DeviceIoControl *)Irp->Tail.Overlay.CurrentStackLocation;
  3.   Size = v3->DeviceIoControl.InputBufferLength;
  4.   v4 = v3->DeviceIoControl.OutputBufferLength;
  5.   Address = Irp->AssociatedIrp.MasterIrp;
  6.  
  7.   if ( v3->DeviceIoControl.IoControlCode == 0xABE13002 )
  8.   {
  9.     Irp->IoStatus.Information = 0;
  10.     v15 = 0;
  11.     v14 = 0;
  12.     v5 = Irp->MdlAddress;
  13.     if ( v5 )




Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 06 сентября 2013 19:43 · Поправил: vden
· Личное сообщение · #10

Помнится с интерфейсами была похожая беда. Например, для IDirect3dDevice9 видит lpVtbl, а дальше никак, при том что типы в библиотеке были подгружены. Решалось установкой типов вручную (и без struct перед структурами). Вроде так


 eXeL@B —› Вопросы новичков —› Вопрос по простому драйверу
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати