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

 eXeL@B —› Программирование —› Разбор драйвера
Посл.ответ Сообщение

Ранг: 16.5 (новичок)
Активность: 0.010
Статус: Участник

Создано: 25 января 2011 16:10
· Личное сообщение · #1

Исследумый драйвер перехватывает в системе ряд вызовов (сам перехват уже разобран), и делает это по команде получаемой из user-mode (по коду видно создание девайса и символической ссылки). Очевидно, что обработка этой команды идёт в обработчике IRP_MJ_DEVICE_CONTROL. Вот его установка (код выкладываю в виде псевдо-кода, чтобы был более понятным и ёмким):
Code:
  1.   result = IoCreateDevice(DriverObject, 0x18u, &DestinationString, 0x22u, 0x100u, 0, &DeviceObject);
  2.   if ( result >= 0 )
  3.   {
  4.     DriverObject->MajorFunction[0] = (PDRIVER_DISPATCH)sub_1A006;
  5.     DriverObject->MajorFunction[2] = (PDRIVER_DISPATCH)sub_1A006;
  6.     DriverObject->MajorFunction[14] = (PDRIVER_DISPATCH)sub_1A0F6; /// <---------------- IRP_MJ_DEVICE_CONTROL
  7.     DriverObject->MajorFunction[3] = (PDRIVER_DISPATCH)sub_1A02A;
  8.     DriverObject->MajorFunction[4] = (PDRIVER_DISPATCH)sub_1A02A;
  9.     DriverObject->DriverUnload = (PDRIVER_UNLOAD)sub_1A046;
  10.     RtlInitUnicodeString(&SymbolicLinkName, &word_1B116);
  11. .............

А вот сорс этой самой функции-обработчика:
Code:
  1. int __stdcall sub_1A0F6(int a1, int Irp)
  2. {
  3.   unsigned int v2; // eax@1
  4.   int v3; // edx@1
  5.   unsigned int v4; // ebx@1
  6.   int v5; // esi@1
  7.   int v6; // eax@1
  8.   signed int v7; // edi@8
  9.   int v25; // [sp+18h] [bp-8h]@30
  10.   int v26; // [sp+1Ch] [bp-4h]@1
  11.   int v27; // [sp+2Ch] [bp+Ch]@1
  12.  
  13.   v26 = 0;
  14.   v5 = Irp;
  15.   v6 = *(_DWORD *)(Irp + 96); // <----
  16.   v3 = *(_DWORD *)(v6 + 8); // <---- разбор
  17.   v4 = *(_DWORD *)(v6 + 4); // <---- структуры
  18.   v2 = *(_DWORD *)(v6 + 12); // <----
  19.   v27 = v3;
  20. .....................


Вопрос заключается вот в чём. Вся нужная информация (IoControlCode, буффер с командой из user-mode) находится в структуре Irp. Её разбор происходит на выделенных строчках. Описание PIRP структуры я не нашёл, поэтому не могу понять какие значения из этой структуры оказываются в переменных v6, v3, v4, v2. Сам я в низко-уровненом программирование не особо шарю.. просьба подсказать какие элементы структуры Irp оказываются в соответствующих регистрах в выше-описанном коде.




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

Создано: 25 января 2011 16:42
· Личное сообщение · #2

DDK обзаведитесь, там все структуры есть




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 25 января 2011 16:44
· Личное сообщение · #3

Работаешь видимо в IDAе по листингу.

View-->Open subviews-->Type libraries
Shift+F11
и добавляешь в базу NTDDK если еще не добавлена.

View-->Open subviews-->Structures
Shift+F9
и создаешь структуру с именем _IRP

и по ней уже смотришь смещения (только в листинге десятичные, а в ИДЕ шестнадцатиричные)

таким образом v6 = *(_DWORD *)(Irp + 96); скорее всего Irp->Tail.Apc.NormalContext и т.д.

-----
127.0.0.1, sweet 127.0.0.1


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

Ранг: 16.5 (новичок)
Активность: 0.010
Статус: Участник

Создано: 25 января 2011 17:08
· Личное сообщение · #4

OKOB пишет:
и по ней уже смотришь смещения (только в листинге десятичные, а в ИДЕ шестнадцатиричные)

таким образом v6 = *(_DWORD *)(Irp + 96); скорее всего Irp->Tail.Apc.NormalContext и т.д.

я чуть дальше пошёл, сконвертировал аргумент вызываемой функции-обработчика "int Irp" в "IRP *Irp". Но получилось вот что:
Code:
  1.  v5 = (int)Irp;
  2.   v6 = *(_DWORD *)&Irp[1].RequestorMode;
  3.   v3 = *(_DWORD *)(v6 + 8);
  4.   v4 = *(_DWORD *)(v6 + 4);
  5.   v2 = *(_DWORD *)(v6 + 12);

И чего-то у меня серьёзное подозрение, что ошибься по коду получается, что в функцию передаётся указатель на массив структур? этого ж не может быть?



Ранг: 47.1 (посетитель), 2thx
Активность: 0.030
Статус: Участник

Создано: 27 января 2011 01:26
· Личное сообщение · #5

для хп сп2
Code:
  1. kd> dt nt!_IRP -r
  2.    +0x000 Type             : Int2B
  3.    +0x002 Size             : Uint2B
  4.    +0x004 MdlAddress       : Ptr32 _MDL
  5.       +0x000 Next             : Ptr32 _MDL
  6.          +0x000 Next             : Ptr32 _MDL
  7.          +0x004 Size             : Int2B
  8.          +0x006 MdlFlags         : Int2B
  9.          +0x008 Process          : Ptr32 _EPROCESS
  10.          +0x00c MappedSystemVa   : Ptr32 Void
  11.          +0x010 StartVa          : Ptr32 Void
  12.          +0x014 ByteCount        : Uint4B
  13.          +0x018 ByteOffset       : Uint4B
  14.       +0x004 Size             : Int2B
  15.       +0x006 MdlFlags         : Int2B
  16.       +0x008 Process          : Ptr32 _EPROCESS
  17.          +0x000 Pcb              : _KPROCESS
  18.          +0x06c ProcessLock      : _EX_PUSH_LOCK
  19.          +0x070 CreateTime       : _LARGE_INTEGER
  20.          +0x078 ExitTime         : _LARGE_INTEGER
  21.          +0x080 RundownProtect   : _EX_RUNDOWN_REF
  22.          +0x084 UniqueProcessId  : Ptr32 Void
  23.          +0x088 ActiveProcessLinks : _LIST_ENTRY
  24.          +0x090 QuotaUsage       : [3] Uint4B
  25.          +0x09c QuotaPeak        : [3] Uint4B
  26.          +0x0a8 CommitCharge     : Uint4B
  27.          +0x0ac PeakVirtualSize  : Uint4B
  28.          +0x0b0 VirtualSize      : Uint4B
  29.          +0x0b4 SessionProcessLinks : _LIST_ENTRY
  30.          +0x0bc DebugPort        : Ptr32 Void
  31.          +0x0c0 ExceptionPort    : Ptr32 Void
  32.          +0x0c4 ObjectTable      : Ptr32 _HANDLE_TABLE
  33.          +0x0c8 Token            : _EX_FAST_REF
  34.          +0x0cc WorkingSetLock   : _FAST_MUTEX
  35.          +0x0ec WorkingSetPage   : Uint4B
  36.          +0x0f0 AddressCreationLock : _FAST_MUTEX
  37.          +0x110 HyperSpaceLock   : Uint4B
  38.          +0x114 ForkInProgress   : Ptr32 _ETHREAD
  39.          +0x118 HardwareTrigger  : Uint4B
  40.          +0x11c VadRoot          : Ptr32 Void
  41.          +0x120 VadHint          : Ptr32 Void
  42.          +0x124 CloneRoot        : Ptr32 Void
  43.          +0x128 NumberOfPrivatePages : Uint4B
  44.          +0x12c NumberOfLockedPages : Uint4B
  45.          +0x130 Win32Process     : Ptr32 Void
  46.          +0x134 Job              : Ptr32 _EJOB
  47.          +0x138 SectionObject    : Ptr32 Void
  48.          +0x13c SectionBaseAddress : Ptr32 Void
  49.          +0x140 QuotaBlock       : Ptr32 _EPROCESS_QUOTA_BLOCK
  50.          +0x144 WorkingSetWatch  : Ptr32 _PAGEFAULT_HISTORY
  51.          +0x148 Win32WindowStation : Ptr32 Void
  52.          +0x14c InheritedFromUniqueProcessId : Ptr32 Void
  53.          +0x150 LdtInformation   : Ptr32 Void
  54.          +0x154 VadFreeHint      : Ptr32 Void
  55.          +0x158 VdmObjects       : Ptr32 Void
  56.          +0x15c DeviceMap        : Ptr32 Void
  57.          +0x160 PhysicalVadList  : _LIST_ENTRY
  58.          +0x168 PageDirectoryPte : _HARDWARE_PTE
  59.          +0x168 Filler           : Uint8B
  60.          +0x170 Session          : Ptr32 Void
  61.          +0x174 ImageFileName    : [16] UChar
  62.          +0x184 JobLinks         : _LIST_ENTRY
  63.          +0x18c LockedPagesList  : Ptr32 Void
  64.          +0x190 ThreadListHead   : _LIST_ENTRY
  65.          +0x198 SecurityPort     : Ptr32 Void
  66.          +0x19c PaeTop           : Ptr32 Void
  67.          +0x1a0 ActiveThreads    : Uint4B
  68.          +0x1a4 GrantedAccess    : Uint4B
  69.          +0x1a8 DefaultHardErrorProcessing : Uint4B
  70.          +0x1ac LastThreadExitStatus : Int4B
  71.          +0x1b0 Peb              : Ptr32 _PEB
  72.          +0x1b4 PrefetchTrace    : _EX_FAST_REF
  73.          +0x1b8 ReadOperationCount : _LARGE_INTEGER
  74.          +0x1c0 WriteOperationCount : _LARGE_INTEGER
  75.          +0x1c8 OtherOperationCount : _LARGE_INTEGER
  76.          +0x1d0 ReadTransferCount : _LARGE_INTEGER
  77.          +0x1d8 WriteTransferCount : _LARGE_INTEGER
  78.          +0x1e0 OtherTransferCount : _LARGE_INTEGER
  79.          +0x1e8 CommitChargeLimit : Uint4B
  80.          +0x1ec CommitChargePeak : Uint4B
  81.          +0x1f0 AweInfo          : Ptr32 Void
  82.          +0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
  83.          +0x1f8 Vm               : _MMSUPPORT
  84.          +0x238 LastFaultCount   : Uint4B
  85.          +0x23c ModifiedPageCount : Uint4B
  86.          +0x240 NumberOfVads     : Uint4B
  87.          +0x244 JobStatus        : Uint4B
  88.          +0x248 Flags            : Uint4B
  89.          +0x248 CreateReported   : Pos 0, 1 Bit
  90.          +0x248 NoDebugInherit   : Pos 1, 1 Bit
  91.          +0x248 ProcessExiting   : Pos 2, 1 Bit
  92.          +0x248 ProcessDelete    : Pos 3, 1 Bit
  93.          +0x248 Wow64SplitPages  : Pos 4, 1 Bit
  94.          +0x248 VmDeleted        : Pos 5, 1 Bit
  95.          +0x248 OutswapEnabled   : Pos 6, 1 Bit
  96.          +0x248 Outswapped       : Pos 7, 1 Bit
  97.          +0x248 ForkFailed       : Pos 8, 1 Bit
  98.          +0x248 HasPhysicalVad   : Pos 9, 1 Bit
  99.          +0x248 AddressSpaceInitialized : Pos 10, 2 Bits
  100.          +0x248 SetTimerResolution : Pos 12, 1 Bit
  101.          +0x248 BreakOnTermination : Pos 13, 1 Bit
  102.          +0x248 SessionCreationUnderway : Pos 14, 1 Bit
  103.          +0x248 WriteWatch       : Pos 15, 1 Bit
  104.          +0x248 ProcessInSession : Pos 16, 1 Bit
  105.          +0x248 OverrideAddressSpace : Pos 17, 1 Bit
  106.          +0x248 HasAddressSpace  : Pos 18, 1 Bit
  107.          +0x248 LaunchPrefetched : Pos 19, 1 Bit
  108.          +0x248 InjectInpageErrors : Pos 20, 1 Bit
  109.          +0x248 VmTopDown        : Pos 21, 1 Bit
  110.          +0x248 Unused3          : Pos 22, 1 Bit
  111.          +0x248 Unused4          : Pos 23, 1 Bit
  112.          +0x248 VdmAllowed       : Pos 24, 1 Bit
  113.          +0x248 Unused           : Pos 25, 5 Bits
  114.          +0x248 Unused1          : Pos 30, 1 Bit
  115.          +0x248 Unused2          : Pos 31, 1 Bit
  116.          +0x24c ExitStatus       : Int4B
  117.          +0x250 NextPageColor    : Uint2B
  118.          +0x252 SubSystemMinorVersion : UChar
  119.          +0x253 SubSystemMajorVersion : UChar
  120.          +0x252 SubSystemVersion : Uint2B
  121.          +0x254 PriorityClass    : UChar
  122.          +0x255 WorkingSetAcquiredUnsafe : UChar
  123.          +0x258 Cookie           : Uint4B
  124.       +0x00c MappedSystemVa   : Ptr32 Void
  125.       +0x010 StartVa          : Ptr32 Void
  126.       +0x014 ByteCount        : Uint4B
  127.       +0x018 ByteOffset       : Uint4B
  128.    +0x008 Flags            : Uint4B
  129.    +0x00c AssociatedIrp    : __unnamed
  130.       +0x000 MasterIrp        : Ptr32 _IRP
  131.          +0x000 Type             : Int2B
  132.          +0x002 Size             : Uint2B
  133.          +0x004 MdlAddress       : Ptr32 _MDL
  134.          +0x008 Flags            : Uint4B
  135.          +0x00c AssociatedIrp    : __unnamed
  136.          +0x010 ThreadListEntry  : _LIST_ENTRY
  137.          +0x018 IoStatus         : _IO_STATUS_BLOCK
  138.          +0x020 RequestorMode    : Char
  139.          +0x021 PendingReturned  : UChar
  140.          +0x022 StackCount       : Char
  141.          +0x023 CurrentLocation  : Char
  142.          +0x024 Cancel           : UChar
  143.          +0x025 CancelIrql       : UChar
  144.          +0x026 ApcEnvironment   : Char
  145.          +0x027 AllocationFlags  : UChar
  146.          +0x028 UserIosb         : Ptr32 _IO_STATUS_BLOCK
  147.          +0x02c UserEvent        : Ptr32 _KEVENT
  148.          +0x030 Overlay          : __unnamed
  149.          +0x038 CancelRoutine    : Ptr32           void 
  150.          +0x03c UserBuffer       : Ptr32 Void
  151.          +0x040 Tail             : __unnamed
  152.       +0x000 IrpCount         : Int4B
  153.       +0x000 SystemBuffer     : Ptr32 Void
  154.    +0x010 ThreadListEntry  : _LIST_ENTRY
  155.       +0x000 Flink            : Ptr32 _LIST_ENTRY
  156.          +0x000 Flink            : Ptr32 _LIST_ENTRY
  157.          +0x004 Blink            : Ptr32 _LIST_ENTRY
  158.       +0x004 Blink            : Ptr32 _LIST_ENTRY
  159.          +0x000 Flink            : Ptr32 _LIST_ENTRY
  160.          +0x004 Blink            : Ptr32 _LIST_ENTRY
  161.    +0x018 IoStatus         : _IO_STATUS_BLOCK
  162.       +0x000 Status           : Int4B
  163.       +0x000 Pointer          : Ptr32 Void
  164.       +0x004 Information      : Uint4B
  165.    +0x020 RequestorMode    : Char
  166.    +0x021 PendingReturned  : UChar
  167.    +0x022 StackCount       : Char
  168.    +0x023 CurrentLocation  : Char
  169.    +0x024 Cancel           : UChar
  170.    +0x025 CancelIrql       : UChar
  171.    +0x026 ApcEnvironment   : Char
  172.    +0x027 AllocationFlags  : UChar
  173.    +0x028 UserIosb         : Ptr32 _IO_STATUS_BLOCK
  174.       +0x000 Status           : Int4B
  175.       +0x000 Pointer          : Ptr32 Void
  176.       +0x004 Information      : Uint4B
  177.    +0x02c UserEvent        : Ptr32 _KEVENT
  178.       +0x000 Header           : _DISPATCHER_HEADER
  179.          +0x000 Type             : UChar
  180.          +0x001 Absolute         : UChar
  181.          +0x002 Size             : UChar
  182.          +0x003 Inserted         : UChar
  183.          +0x004 SignalState      : Int4B
  184.          +0x008 WaitListHead     : _LIST_ENTRY
  185.    +0x030 Overlay          : __unnamed
  186.       +0x000 AsynchronousParameters : __unnamed
  187.          +0x000 UserApcRoutine   : Ptr32           void 
  188.          +0x004 UserApcContext   : Ptr32 Void
  189.       +0x000 AllocationSize   : _LARGE_INTEGER
  190.          +0x000 LowPart          : Uint4B
  191.          +0x004 HighPart         : Int4B
  192.          +0x000 u                : __unnamed
  193.          +0x000 QuadPart         : Int8B
  194.    +0x038 CancelRoutine    : Ptr32     void 
  195.    +0x03c UserBuffer       : Ptr32 Void
  196.    +0x040 Tail             : __unnamed
  197.       +0x000 Overlay          : __unnamed
  198.          +0x000 DeviceQueueEntry : _KDEVICE_QUEUE_ENTRY
  199.          +0x000 DriverContext    : [4] Ptr32 Void
  200.          +0x010 Thread           : Ptr32 _ETHREAD
  201.          +0x014 AuxiliaryBuffer  : Ptr32 Char
  202.          +0x018 ListEntry        : _LIST_ENTRY
  203.          +0x020 CurrentStackLocation : Ptr32 _IO_STACK_LOCATION
  204.          +0x020 PacketType       : Uint4B
  205.          +0x024 OriginalFileObject : Ptr32 _FILE_OBJECT
  206.       +0x000 Apc              : _KAPC
  207.          +0x000 Type             : Int2B
  208.          +0x002 Size             : Int2B
  209.          +0x004 Spare0           : Uint4B
  210.          +0x008 Thread           : Ptr32 _KTHREAD
  211.          +0x00c ApcListEntry     : _LIST_ENTRY
  212.          +0x014 KernelRoutine    : Ptr32           void 
  213.          +0x018 RundownRoutine   : Ptr32           void 
  214.          +0x01c NormalRoutine    : Ptr32           void 
  215.          +0x020 NormalContext    : Ptr32 Void
  216.          +0x024 SystemArgument1  : Ptr32 Void
  217.          +0x028 SystemArgument2  : Ptr32 Void
  218.          +0x02c ApcStateIndex    : Char
  219.          +0x02d ApcMode          : Char
  220.          +0x02e Inserted         : UChar
  221.       +0x000 CompletionKey    : Ptr32 Void


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


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