Эмуляция нажатия кнопок из драйвера [WinXP]

Тема в разделе "WASM.BEGINNERS", создана пользователем punxer, 28 июл 2010.

  1. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Подскажите пожалуйста как осуществить. Псевдокод/код/исходники/теория.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    если потоку, то проще всего заюзать Shadow-функции, ну или если нужен геморрой, то работать с очередью ввода потока напрямую.
    если системе, то вообще не вижу сложностей, можно работать как с портами, так и с драйвером клавиатуры (почти с любым из стека).
     
  3. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Можно пожалуйсто поподробнее, лучше системе, хоть какой нить пседвдокод\код
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    out 0x64, 0xd2
    out 0x60, key

    конечно это может не работать, например, для usb-клавиш, однако часто бывает эмуляция ps/2.
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Еще вопрос такой, почему keybd_event отрабатыает через раз-два?
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    n0name
    Какие именно Shadow? Экспортируются? Если нет где адреса брать?

    Используйте поиск, либо размышляйте. Иначе перенесём топ в бегинерс.
     
  7. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    чем можно начетно из списка эмулировать кнопки. SendInput переходит в ntdll, потом в сервис...
    Итого для эмуляции ввода получаем драйвер фильтр и порты клавы. Что надежнее использовать, что проще? Сталкиваюсь с Kernel Mode не так часто, знаний мало, но задачу нужно выпонить, так подскажите куда копать и что реализовывать. После непредсказуемости юзермодных функций вообще в шоке. Не уверен что сервисы спасут.
     
  8. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. #define _X86_
    2. #define _DDK_DRIVER_
    3.  
    4. #include <ntddk.h>
    5.  
    6. VOID OnUnload (DRIVER_OBJECT theDrvObj)
    7. {
    8.     DbgPrint("I AM Unloading...");
    9. }
    10.  
    11. NTSTATUS DriverEntry(PDRIVER_OBJECT theDrvObj,PUNICODE_STRING theRegPath)
    12. {
    13.     DbgPrint ("I AM IN RING0");
    14.     theDrvObj->DriverUnload=(PDRIVER_UNLOAD)OnUnload;
    15.     return STATUS_SUCCESS;
    16.  
    17. }
    Компилю студией,проект могу приложить. При загрузке на вин 7 ок при выгрузке бсод. при загрузке на икспи сп3 не видно отладочного вывода, при выгрузке бсод/
    [студию на дров настраивал сам][xp sp3]
     
  9. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Код (Text):
    1. VOID OnUnload (PDRIVER_OBJECT theDrvObj)
     
  10. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    В висте и семерке надо в реестре править что-то чтобы видеть отладочный вывод.
     
  11. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    ntcdm в 7 как раз видно
     
  12. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    ntcdm
    и что

    ЗЫ Этот 'дров' раньше работал
     
  13. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    то что у тебя функция принимает структуру, а надо поинтер на структуру в итоге портится содержимое стека.

    а бсод в этом месте может 100 раз не возникнуть, а возникнуть на 101 раз.
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    stdcall еще.
     
  15. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Можно поставить фильтр на клавиатурный стек. При получении IRP_MJ_READ задерживать пакет, а вниз по стеку отсылать свой. Таким образом при реальном нажатии завершится свой IRP и надо будет скопировать в изначальный всё и завершить его. А если надо с эмулировать то, просто надо завершить изначальный IRP c нужными данными.
     
  16. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    поможите плиз исходником драйвера который по IOCTL запросу генерирует нажатие клавиши в системе. Можно в личку ,$
     
  17. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. #define _X86_
    2. #define _DDK_DRIVER_
    3.  
    4. #include <ntddk.h>
    5. typedef struct tagDEVICE_EXTENSION {
    6.     PDEVICE_OBJECT DeviceObject;       // device object this driver creates
    7.  
    8.     PDEVICE_OBJECT NextDeviceObject;   // next-layered device object in this
    9.  
    10.                                        // device stack
    11.  
    12.     DEVICE_CAPABILITIES pdc;           // device capability
    13.  
    14.     IO_REMOVE_LOCK RemoveLock;         // removal control locking structure
    15.  
    16.     LONG handles;                      // # open handles
    17.  
    18.     PVOID DataBuffer;                  // Internal Buffer for Read/Write I/O
    19.  
    20.     UNICODE_STRING Device_Description; // Device Description
    21.  
    22.     SYSTEM_POWER_STATE SysPwrState;    // Current System Power State
    23.  
    24.     DEVICE_POWER_STATE DevPwrState;    // Current Device Power State
    25.  
    26.     PIRP PowerIrp;                     // Current Handling Power-Related IRP
    27.  
    28. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
    29. NTSTATUS TestControl (IN PDEVICE_OBJECT fdo, IN PIRP irp)
    30.  
    31. {
    32.  
    33.  
    34.     return STATUS_SUCCESS;
    35. }
    36. VOID OnUnload (PDRIVER_OBJECT theDrvObj)
    37. {
    38.     DbgPrint("I AM Unloading...");
    39. }
    40.  
    41. NTSTATUS DriverEntry(PDRIVER_OBJECT theDrvObj,PUNICODE_STRING theRegPath)
    42. {
    43.     PDEVICE_OBJECT pdo;
    44.     PUNICODE_STRING pus;
    45.     DbgPrint ("I AM IN RING0");
    46.     theDrvObj->DriverUnload=(PDRIVER_UNLOAD)OnUnload;
    47.     theDrvObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = TestControl;
    48.     RtlInitUnicodeString(pus,L"12345");
    49.     IoCreateDevice(theDrvObj, sizeof(DEVICE_EXTENSION),pus, 0, 0, FALSE, &pdo);
    50.     return STATUS_SUCCESS;
    51.  
    52. }
    бсодит сразу

    Пусть бегиннерс, хоть коммерц.
     
  18. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    UNICODE_STRING pus;
    RtlInitUnicodeString не выделяет память, а просто заполняет структуру.
     
  19. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    или хоть ткнить в исходники дрова управляемого приложением минимального.
     
  20. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    izl3sa спасибо исправил
    но kmdmanager не может послать IOCTL, cant get drv handle