Подмена обработчика irp - функция InterlockedExchange

Тема в разделе "WASM.NT.KERNEL", создана пользователем Llirik, 28 дек 2010.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я пытаюсь подменить обработчик irp KeyboardClass0.
    Код (Text):
    1.     .386p
    2. option casemap:none
    3. .model flat, stdcall
    4.  
    5. include \masm32\include\ntstatus.inc
    6. include \masm32\include\ntddk.inc
    7. include \masm32\include\ntoskrnl.inc
    8. include \masm32\include\ntddkbd.inc
    9. include \masm32\include\hal.inc
    10.  
    11. includelib \masm32\lib\ntoskrnl.lib
    12. includelib \masm32\lib\hal.lib
    13. ...............................................
    14.      invoke IoGetDeviceObjectPointer, addr g_usTargetDeviceName, FILE_READ_DATA, \
    15.                                       addr pTargetFileObject, addr pTargetDeviceObject
    16.             mov eax, pDriverObject
    17.              assume eax:PTR DRIVER_OBJECT
    18.     mov ecx, IRP_MJ_MAXIMUM_FUNCTION + 1
    19.     .while ecx
    20.     dec ecx
    21.     mov [eax].MajorFunction[ecx*(sizeof PVOID)], offset DriverDispatch
    22.     .endw
    23.              mov [eax].DriverUnload, offset DriverUnload
    24.              assume eax:nothing
    25.             mov eax, pTargetDeviceObject
    26.              assume eax:PTR DEVICE_OBJECT
    27.     mov ecx, [eax].DriverObject
    28.              assume ecx:PTR DRIVER_OBJECT
    29.     mov  oldcontr, [ecx].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)]
    30.     invoke  InterlockedExchange, oldcontr, addr DriverDispatch
    31.              assume eax:nothing
    32.              assume ecx:nothing
    но при компиляции ml выдаёт ошибку в районе InterlockedExchange. Что я написал не так?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ты же на асме пишешь.
    lock xchg
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    не понял) можно по подробнее
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну команда такая, xchg. Принимает либо два регистра, либо регистр + косвенная адресация ячейки в памяти. Обменивает содержимое своих операндов.
    С префиксом lock блокирует шину.

    А еще подробнее - ну справочник по опкодам, гугл подскажет)
    Не, ну если очень приперло, конечно, вызвать апи другого модуля, чтобы в результате выполнить все тот же lock xchg, у тебя видать в инклудах прототип её непрописан - вот и не импортится. Но нафига ее использовать, если пишешь на асме всё равно?
     
  5. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Great
    Там lock cmpxchg


    Llirik
    Уже и дизасмить народ разучился

    InterlockedExchange
    Код (Text):
    1. 7C8097AD >  8B4C24 04       mov     ecx, dword ptr ss:[esp+4]
    2. 7C8097B1    8B5424 08       mov     edx, dword ptr ss:[esp+8]
    3. 7C8097B5    8B01            mov     eax, dword ptr ds:[ecx]
    4. 7C8097B7    F0:0FB111       lock cmpxchg dword ptr ds:[ecx], edx     ; LOCK prefix
    5. 7C8097BB  ^ 75 FA           jnz     short kernel32.7C8097B7
    6. 7C8097BD    C2 0800         retn    8
     
  6. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Вообще для команды xchg ненужен префикс lock. Т.к. xchg всегда выполняется с сигналом блокировки.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Угу, оговорилсо
     
  8. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я сделал так:
    Код (Text):
    1. ............
    2.  
    3. DriverDispatch proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    4.  
    5. local status:NTSTATUS
    6. local dwMajorFunction:DWORD
    7.  
    8.     IoGetCurrentIrpStackLocation pIrp
    9.  
    10.     movzx eax, (IO_STACK_LOCATION PTR [eax]).MajorFunction
    11.     mov dwMajorFunction, eax
    12.  
    13.     mov eax, pDeviceObject
    14.     .if eax == KeyDeviceObject
    15.         mov eax, dwMajorFunction
    16.         .if eax == IRP_MJ_CREATE
    17.             invoke DispatchCreateClose, pDeviceObject, pIrp
    18.             mov status, eax
    19.         .elseif eax == IRP_MJ_CLOSE
    20.             invoke DispatchCreateClose, pDeviceObject, pIrp
    21.             mov status, eax
    22.     .elseif eax == IRP_MJ_DEVICE_CONTROL
    23.         invoke CDO_DispatchDeviceControl, pDeviceObject, pIrp
    24.     mov status, eax
    25. ;;      .elseif eax == IRP_MJ_READ
    26. ;;          invoke FiDO_DispatchRead, pDeviceObject, pIrp
    27.             mov status, eax
    28.         .elseif eax == IRP_MJ_POWER
    29.             invoke FiDO_DispatchPower, pDeviceObject, pIrp
    30.             mov status, eax
    31. ;       .else
    32. ;           invoke FiDO_DispatchPassThrough, pDeviceObject, pIrp
    33. ;           mov status, eax
    34.  
    35.             .endif
    36.  
    37.     .else
    38.  
    39.         mov ecx, pIrp
    40.         mov (_IRP PTR [ecx]).IoStatus.Status, STATUS_INVALID_DEVICE_REQUEST
    41.         and (_IRP PTR [ecx]).IoStatus.Information, 0
    42.  
    43.         fastcall IofCompleteRequest, ecx, IO_NO_INCREMENT
    44.  
    45.         mov status, STATUS_INVALID_DEVICE_REQUEST
    46.  
    47.     .endif
    48.  
    49.     mov eax, status
    50.     ret
    51.  
    52. DriverDispatch endp
    53. .....................
    54.  
    55. .code INIT
    56.  
    57.  
    58. DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    59.  local status:NTSTATUS
    60.  
    61.      mov status, STATUS_DEVICE_CONFIGURATION_ERROR
    62.  
    63. invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, \
    64.                                               0, FALSE, addr KeyDeviceObject
    65. .if eax == STATUS_SUCCESS
    66.          invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName
    67.  
    68.          .if eax == STATUS_SUCCESS
    69.  
    70.      invoke IoGetDeviceObjectPointer, addr g_usTargetDeviceName, FILE_READ_DATA, \
    71.                                       addr pTargetFileObject, addr pTargetDeviceObject
    72.             mov eax, pDriverObject
    73.              assume eax:PTR DRIVER_OBJECT
    74.     mov ecx, IRP_MJ_MAXIMUM_FUNCTION + 1
    75.     .while ecx
    76.     dec ecx
    77.     mov [eax].MajorFunction[ecx*(sizeof PVOID)], offset DriverDispatch
    78.     .endw
    79.              mov [eax].DriverUnload, offset DriverUnload
    80.              assume eax:nothing
    81.             mov eax, pTargetDeviceObject
    82.              assume eax:PTR DEVICE_OBJECT
    83.     mov ecx, [eax].DriverObject
    84.              assume eax:nothing
    85.              assume ecx:PTR DRIVER_OBJECT
    86. ;   mov  oldcontr, [ecx].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)]
    87.     mov eax, offset DriverDispatch
    88.     XCHG [ecx].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], eax
    89.              assume ecx:nothing
    90. ..........
    Но подмены видимо не происходить, так как клавиатура продолжает работать в обычном режиме, а по идее она должна перестать реагировать на нажие клавиш, но этого не происходит. Почему??
     
  9. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Извиняюсь, я подменял не ту функцию, поэтому и не работало)) А как вернуть подмененую функцию обратно? Я пытаюсь сделать это вот так:
    Код (Text):
    1. DriverUnload proc pDriverObject:PDRIVER_OBJECT
    2.  
    3.   and gggfSpy, FALSE
    4.   .if g_dwPendingRequests == 0
    5.     .if zlpRegScanCode !=0
    6.             invoke ExFreePool,zlpRegScanCode
    7.             mov zlpRegScanCode, 0
    8.     .endif
    9.  
    10.             mov eax, pTargetDeviceObject
    11.              assume eax:PTR DEVICE_OBJECT
    12.     mov ecx, [eax].DriverObject
    13.              assume eax:nothing
    14.              assume ecx:PTR DRIVER_OBJECT
    15.     mov eax, oldcontr
    16.     XCHG [ecx].MajorFunction[IRP_MJ_READ*(sizeof PVOID)], eax
    17.              assume ecx:nothing
    18.  
    19.     invoke IoDeleteSymbolicLink, addr g_usSymbolicLinkName
    20.  
    21.     mov eax, pDriverObject
    22.     invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject
    23. ;.endif
    24. .endif
    25.     mov eax, STATUS_SUCCESS
    26.     ret
    27.  
    28. DriverUnload endp
    но это приводит к синему экрану(