Я пытаюсь подменить обработчик irp KeyboardClass0. Код (Text): .386p option casemap:none .model flat, stdcall include \masm32\include\ntstatus.inc include \masm32\include\ntddk.inc include \masm32\include\ntoskrnl.inc include \masm32\include\ntddkbd.inc include \masm32\include\hal.inc includelib \masm32\lib\ntoskrnl.lib includelib \masm32\lib\hal.lib ............................................... invoke IoGetDeviceObjectPointer, addr g_usTargetDeviceName, FILE_READ_DATA, \ addr pTargetFileObject, addr pTargetDeviceObject mov eax, pDriverObject assume eax:PTR DRIVER_OBJECT mov ecx, IRP_MJ_MAXIMUM_FUNCTION + 1 .while ecx dec ecx mov [eax].MajorFunction[ecx*(sizeof PVOID)], offset DriverDispatch .endw mov [eax].DriverUnload, offset DriverUnload assume eax:nothing mov eax, pTargetDeviceObject assume eax:PTR DEVICE_OBJECT mov ecx, [eax].DriverObject assume ecx:PTR DRIVER_OBJECT mov oldcontr, [ecx].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)] invoke InterlockedExchange, oldcontr, addr DriverDispatch assume eax:nothing assume ecx:nothing но при компиляции ml выдаёт ошибку в районе InterlockedExchange. Что я написал не так?
ну команда такая, xchg. Принимает либо два регистра, либо регистр + косвенная адресация ячейки в памяти. Обменивает содержимое своих операндов. С префиксом lock блокирует шину. А еще подробнее - ну справочник по опкодам, гугл подскажет) Не, ну если очень приперло, конечно, вызвать апи другого модуля, чтобы в результате выполнить все тот же lock xchg, у тебя видать в инклудах прототип её непрописан - вот и не импортится. Но нафига ее использовать, если пишешь на асме всё равно?
Great Там lock cmpxchg Llirik Уже и дизасмить народ разучился InterlockedExchange Код (Text): 7C8097AD > 8B4C24 04 mov ecx, dword ptr ss:[esp+4] 7C8097B1 8B5424 08 mov edx, dword ptr ss:[esp+8] 7C8097B5 8B01 mov eax, dword ptr ds:[ecx] 7C8097B7 F0:0FB111 lock cmpxchg dword ptr ds:[ecx], edx ; LOCK prefix 7C8097BB ^ 75 FA jnz short kernel32.7C8097B7 7C8097BD C2 0800 retn 8
Я сделал так: Код (Text): ............ DriverDispatch proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP local status:NTSTATUS local dwMajorFunction:DWORD IoGetCurrentIrpStackLocation pIrp movzx eax, (IO_STACK_LOCATION PTR [eax]).MajorFunction mov dwMajorFunction, eax mov eax, pDeviceObject .if eax == KeyDeviceObject mov eax, dwMajorFunction .if eax == IRP_MJ_CREATE invoke DispatchCreateClose, pDeviceObject, pIrp mov status, eax .elseif eax == IRP_MJ_CLOSE invoke DispatchCreateClose, pDeviceObject, pIrp mov status, eax .elseif eax == IRP_MJ_DEVICE_CONTROL invoke CDO_DispatchDeviceControl, pDeviceObject, pIrp mov status, eax ;; .elseif eax == IRP_MJ_READ ;; invoke FiDO_DispatchRead, pDeviceObject, pIrp mov status, eax .elseif eax == IRP_MJ_POWER invoke FiDO_DispatchPower, pDeviceObject, pIrp mov status, eax ; .else ; invoke FiDO_DispatchPassThrough, pDeviceObject, pIrp ; mov status, eax .endif .else mov ecx, pIrp mov (_IRP PTR [ecx]).IoStatus.Status, STATUS_INVALID_DEVICE_REQUEST and (_IRP PTR [ecx]).IoStatus.Information, 0 fastcall IofCompleteRequest, ecx, IO_NO_INCREMENT mov status, STATUS_INVALID_DEVICE_REQUEST .endif mov eax, status ret DriverDispatch endp ..................... .code INIT DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING local status:NTSTATUS mov status, STATUS_DEVICE_CONFIGURATION_ERROR invoke IoCreateDevice, pDriverObject, sizeof FiDO_DEVICE_EXTENSION, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, \ 0, FALSE, addr KeyDeviceObject .if eax == STATUS_SUCCESS invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName .if eax == STATUS_SUCCESS invoke IoGetDeviceObjectPointer, addr g_usTargetDeviceName, FILE_READ_DATA, \ addr pTargetFileObject, addr pTargetDeviceObject mov eax, pDriverObject assume eax:PTR DRIVER_OBJECT mov ecx, IRP_MJ_MAXIMUM_FUNCTION + 1 .while ecx dec ecx mov [eax].MajorFunction[ecx*(sizeof PVOID)], offset DriverDispatch .endw mov [eax].DriverUnload, offset DriverUnload assume eax:nothing mov eax, pTargetDeviceObject assume eax:PTR DEVICE_OBJECT mov ecx, [eax].DriverObject assume eax:nothing assume ecx:PTR DRIVER_OBJECT ; mov oldcontr, [ecx].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)] mov eax, offset DriverDispatch XCHG [ecx].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)], eax assume ecx:nothing .......... Но подмены видимо не происходить, так как клавиатура продолжает работать в обычном режиме, а по идее она должна перестать реагировать на нажие клавиш, но этого не происходит. Почему??
Извиняюсь, я подменял не ту функцию, поэтому и не работало)) А как вернуть подмененую функцию обратно? Я пытаюсь сделать это вот так: Код (Text): DriverUnload proc pDriverObject:PDRIVER_OBJECT and gggfSpy, FALSE .if g_dwPendingRequests == 0 .if zlpRegScanCode !=0 invoke ExFreePool,zlpRegScanCode mov zlpRegScanCode, 0 .endif mov eax, pTargetDeviceObject assume eax:PTR DEVICE_OBJECT mov ecx, [eax].DriverObject assume eax:nothing assume ecx:PTR DRIVER_OBJECT mov eax, oldcontr XCHG [ecx].MajorFunction[IRP_MJ_READ*(sizeof PVOID)], eax assume ecx:nothing invoke IoDeleteSymbolicLink, addr g_usSymbolicLinkName mov eax, pDriverObject invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject ;.endif .endif mov eax, STATUS_SUCCESS ret DriverUnload endp но это приводит к синему экрану(