простой keymouse.sys

Тема в разделе "WASM.BEGINNERS", создана пользователем Llirik, 31 май 2010.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    как переделать этот код, чтобы он заработал?
    Код (ASM):
    1.         .386p
    2. option casemap:none
    3. .model flat, stdcall
    4.  
    5. include C:\masm32\include\ntstatus.inc
    6. include C:\masm32\include\ntddk.inc
    7.  
    8.  
    9. .code      
    10. DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    11.  
    12.      mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
    13.  
    14. main:
    15.  
    16.  
    17. push ebx
    18. push edx
    19. xor eax, eax
    20. xor bx, bx
    21. xor dx, dx
    22. xor cx, cx
    23.  
    24. ;---пpoвepкa cтaтуca клaвиши вcтaвки
    25.    MOV  AH,2           ;нoмep функции
    26.    INT  16H            ;пoлучaeм бaйт cтaтуca
    27.    TEST AL,00100000B   ;пpoвepяeм бит 6 (numlock выкл)
    28.    JZ  kon
    29. xor ax, ax
    30. mov ah,1
    31. int 16h
    32. cmp ah,48h
    33. jnz noup
    34. mov y,9
    35. noup:
    36. cmp ah,50h
    37. jnz nodw
    38. sub y,9
    39. nodw:
    40. cmp ah,4bh
    41. jnz nolf
    42. sub x,9
    43. nolf:
    44. cmp ah,4dh
    45. jnz kon
    46. mov x,9
    47.  
    48. mov ax, 3
    49. int 33h
    50. add cx,x
    51. add dx,y
    52. mov ax,4
    53. int 33h
    54. kon:
    55. mov x,0
    56. mov y,0
    57. pop edx
    58. pop ebx
    59. jmp main
    60. DriverEntry endp
    61.  
    62.  
    63. .data
    64. x dw ?
    65. y dw ?
    66. buttons dw ?
    67.  
    68.  end DriverEntry
     
  2. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    А кто тебе разрешал юзать 16 битный код под ядром?
    Прерывания эти доступны только в 16-битном реалмоде.
    В Windows юзай другие функции.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Можно вызвать эмулятор(последует переключение в V86 режим на время) посредством Ke386CallBios(), по сути содится к сервису NtVdmControl.
     
  4. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    спасибо, но на время мне не подходит( а сделать драйвер-фильтр для меня видимо еще сложновато. тут почитал одну статью и мало что понял(
     
  5. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Llirik

    Если неохота ковыряцца в манах (а это было бы правильно и достаточно быстро), но есть навыки реверсенга - возьми готовый sys, наверное типа русификатора - который выполняет подмену клавишь... Правда у тебя тама мышь еще - наверное это нужно найти сервис среди драйверков и позвать его. Если ты сам напейсал весь код выше у тебя есть шансы (в обоих вариантах).
     
  6. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    подскажите, пожалуйста, почему не хочет компилироваться такой код:
    Код (ASM):
    1.     .386p
    2. option casemap:none
    3. .model flat, stdcall
    4.  include c:\masm32\include\ntoskrnl.inc
    5.  
    6.  includelib C:\masm32\lib\\ntoskrnl.lib
    7.  
    8.  include c:\masm32\Macros\Strings.mac
    9.  
    10.  
    11. include C:\masm32\include\ntstatus.inc
    12. include C:\masm32\include\ntddk.inc
    13.  
    14. .data
    15. CCOUNTED_UNICODE_STRING "\\Device\\KeyboardClass0", g_usTargetDeviceName, 4
    16. x dw ?
    17. y dw ?
    18. buttons dw ?
    19.  
    20. .code    
    21. DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    22.  
    23. local pTargetDeviceObject:PDEVICE_OBJECT
    24.  local pTargetFileObject:PFILE_OBJECT
    25.  
    26.      invoke IoGetDeviceObjectPointer, addr g_usTargetDeviceName, FILE_READ_DATA, \
    27.                                       addr pTargetFileObject, addr pTargetDeviceObject
    28.      .if eax == STATUS_SUCCESS
    29.  
    30.     invoke AddDevice, addr pDriverObject, addr pTargetDeviceObject
    31.      
    32.      .endif
    33.      mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
    34. ret
    35.  
    36. DriverEntry endp
    37.  
    38.  
    39.  end DriverEntry
    ml выдаёт:
    Microsoft (R) Macro Assembler Version 7.00.9210
    Copyright (C) Microsoft Corporation. All rights reserved.

    Assembling: Keymouse.asm
    Keymouse.asm(30) : error A2006: undefined symbol : AddDevice
     
  7. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    пожалуйста, подскажите, что почитать, только не очень мудрёное) а ещё лучше покажите простого перехвата прерывания от какой-нибудь клавиши
     
  8. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Llirik

    Примеры из DDK, просмотр стотей Four-F, не компелиццо скорее всего потомушта не указан заголовочный файл (*.h) откудова эта функция.
     
  9. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Так я языка С не знаю!! а насчёт статей Four-F, больно там всё мудрёно. masm (*.h) не понимает
     
  10. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Llirik

    При чем тут язык C? У вас другие АПИ - например IoGetDeviceObjectPointer - где описаны? А AddDevice? Вам нужен примерчег - так ищите его в наиболее доступных местах (DDK, Four-F), а уж на чем и как там написано - дело десятое.
     
  11. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    так примеры в DDK написаны С) Да, кстати, я так и не могу скомпилировать AddDevice
     
  12. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Да какая разница на чем они написаны? Хоть на VB, это просто текстовые файлики в которых в-каком-то-там-виде есть нужная инфа. Если вам ближе ассемблер вы можете скомпеллировать исходняг из DDK и смотреть это в ассемблере.

    Поищите среди *.h файлов в DDK этот AddDevice - где он описан? Вам нужен заголовочный файл *.inc с таким же опейсанием. Смотрите какие Four-F заголовочные файлы юзает (FASM).

    Найдите поиском строки "AddDevice" любой *.sys файл в system32 и откройте его в IDA, далее посмотрите импорт - откуда эта АПИ вызываеццо и как?

    На уровне драйверов вроде бы тоже есть GetProcAddress, так что можно импортнуть динамически.

    Пользуйтесь статьями Four-F для поиска не для чтения.
     
  13. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    и всё же подскажите, пожалуйста, где находится функция Adddevice? По идее она должна быть в ntddk.inc, но ml почему-то там её не находит
     
  14. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Нет шансов. Никаких. Человек не умеет сам:
    а) думать,
    б) искать,
    в) компелировать.

    Учиться всему этому он тоже не хочет, он просит готовый код. Причем драйвера!

    Llirik Дружище, напиши хелло ворлд, и не вспоминай про драйвера в ближайшие пару лет, пока у тебя не появится желание почитать талмуды потолще.

    PSR1257 Забейте или пишите по русски.
     
  15. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Вот скажите, что в моих кодах не так? да и первый тоже я написал. я смотрел sys`ы в директории drivers, но adddevice нигде не встретил
     
  16. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    код:
    Код (Text):
    1. .386p
    2. option casemap:none
    3. .model flat, stdcall
    4. includelib C:\masm32\lib\ntoskrnl.lib
    5. include C:\masm32\include\ntstatus.inc
    6. include C:\masm32\include\ntddk.inc
    7. include C:\masm32\include\ntoskrnl.inc
    8.  include c:\masm32\Macros\Strings.mac
    9.  
    10.  
    11. .data
    12. CCOUNTED_UNICODE_STRING    "\\Device\\KeyMouse", g_usDeviceName, 4
    13.  CCOUNTED_UNICODE_STRING    "\\??\\KeyMouse", g_usSymbolicLinkName, 4
    14. CCOUNTED_UNICODE_STRING "\\Device\\KeyboardClass0", g_usTargetDeviceName, 4
    15. FALSE       equ 0
    16. TRUE        equ 1
    17. x dw ?
    18. y dw ?
    19. buttons dw ?
    20.  
    21. .code
    22.  DispatchCreateClose proc pDeviceObject:PDEVICE_OBJECT, pIrp:PIRP
    23.  
    24.      mov eax, pIrp
    25.      assume eax:ptr _IRP
    26.      mov [eax].IoStatus.Status, STATUS_SUCCESS
    27.      and [eax].IoStatus.Information, 0
    28.      assume eax:nothing
    29.  
    30.      fastcall IofCompleteRequest, pIrp, IO_NO_INCREMENT
    31.  
    32.      mov eax, STATUS_SUCCESS
    33.      ret
    34.  
    35.  DispatchCreateClose endp
    36.  
    37.  QueryPnpDeviceState proc uses esi edi ebx pDeviceObject:PDEVICE_OBJECT
    38.  
    39.  local status:NTSTATUS
    40.  local keEvent:KEVENT
    41.  local iosb:IO_STATUS_BLOCK
    42.  
    43.      mov status, STATUS_NOT_SUPPORTED
    44.  
    45.      mov esi, pDeviceObject
    46.      assume esi:ptr DEVICE_OBJECT
    47.  
    48.      .if ( esi != NULL  &&  [esi]._Type == IO_TYPE_DEVICE )
    49.  
    50.          movzx eax, [esi].StackSize
    51.          invoke IoAllocateIrp, eax, FALSE
    52.  
    53.          assume esi:nothing
    54.                
    55.          .if eax != NULL
    56.  
    57.              mov edi, eax
    58.              assume edi:ptr _IRP
    59.  
    60.              mov [edi].IoStatus.Status, STATUS_NOT_SUPPORTED
    61.              and [edi].IoStatus.Information, 0
    62.  
    63.              mov iosb.Status, STATUS_NOT_SUPPORTED
    64.              and iosb.Information, 0
    65.  
    66.              lea eax, iosb
    67.              mov [edi].UserIosb, eax
    68.  
    69.              assume edi:nothing
    70.  
    71.              IoGetNextIrpStackLocation edi
    72.              mov ebx, eax
    73.              assume ebx:ptr IO_STACK_LOCATION
    74.  
    75.              mov [ebx].MajorFunction, IRP_MJ_PNP
    76.              mov [ebx].MinorFunction, IRP_MN_QUERY_PNP_DEVICE_STATE
    77.  
    78.              assume ebx:nothing
    79.  
    80.              invoke KeInitializeEvent, addr keEvent, NotificationEvent, FALSE
    81.  
    82.              IoSetCompletionRoutine edi, IrpComplete, addr keEvent, TRUE, TRUE, TRUE
    83.  
    84.              invoke IoCallDriver, esi, edi
    85.              mov status, eax
    86.  
    87.              .if eax == STATUS_PENDING
    88.  
    89.                  invoke DbgPrint, $CTA0("QueryPnpDeviceState: Request pended. Waiting...\n")
    90.    
    91.                  invoke KeWaitForSingleObject, addr keEvent, Executive, KernelMode, FALSE, NULL
    92.  
    93.                  mov eax, iosb.Status
    94.                  mov status, eax
    95.  
    96.              .endif
    97.  
    98.              .if status == STATUS_SUCCESS
    99.  
    100.                  invoke DbgPrint, $CTA0("QueryPnpDeviceState: Device State: %08X\n"), iosb.Information
    101.  
    102.              .endif
    103.  
    104.          .else
    105.              mov status, STATUS_INSUFFICIENT_RESOURCES
    106.          .endif
    107.  
    108.      .endif
    109.  
    110.      mov eax, status
    111.      ret
    112.    
    113.  QueryPnpDeviceState endp
    114.  
    115. .code INIT
    116. DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    117.  local status:NTSTATUS
    118.  local pDeviceObject:PVOID
    119. local pTargetDeviceObject:PDEVICE_OBJECT
    120.  local pTargetFileObject:PFILE_OBJECT
    121.  
    122.      mov status, STATUS_DEVICE_CONFIGURATION_ERROR
    123.  
    124. invoke IoCreateDevice, pDriverObject, 0, addr g_usDeviceName, FILE_DEVICE_UNKNOWN, \
    125.                                               0, FALSE, addr pDeviceObject
    126. .if eax == STATUS_SUCCESS
    127.          invoke IoCreateSymbolicLink, addr g_usSymbolicLinkName, addr g_usDeviceName
    128.          .if eax == STATUS_SUCCESS
    129.  
    130.      invoke IoGetDeviceObjectPointer, addr g_usTargetDeviceName, FILE_READ_DATA, \
    131.                                       addr pTargetFileObject, addr pTargetDeviceObject
    132.         invoke IoAttachDeviceToDeviceStack, pDeviceObject, pTargetDeviceObject
    133.  
    134.  invoke QueryPnpDeviceState, pTargetDeviceObject
    135.  
    136. ;            mov eax, pDriverObject
    137. ;             assume eax:PTR DRIVER_OBJECT
    138. ;             mov [eax].MajorFunction[IRP_MJ_CREATE*(sizeof PVOID)],           offset DispatchCreateClose
    139. ;             mov [eax].MajorFunction[IRP_MJ_CLOSE*(sizeof PVOID)],            offset DispatchCreateClose
    140. ;             mov [eax].MajorFunction[IRP_MJ_DEVICE_CONTROL*(sizeof PVOID)],   offset DispatchControl
    141. ;             mov [eax].DriverUnload,                                          offset DriverUnload
    142. ;             assume eax:nothing
    143.    
    144.              mov status, STATUS_SUCCESS
    145.          .else
    146.              invoke IoDeleteDevice, pDeviceObject
    147.          .endif
    148.      .endif
    149.  
    150.      mov eax, status
    151.  
    152. ret
    153.  
    154. DriverEntry endp
    155.  
    156.  
    157.  end DriverEntry
    ошибка:
    Код (Text):
    1. Microsoft (R) Macro Assembler Version 7.00.9210
    2. Copyright (C) Microsoft Corporation.  All rights reserved.
    3.  
    4.  Assembling: Keymouse.asm
    5. Keymouse.asm(82) : ERROR! Pointer to CompletionRoutine improperly specified.
    6. Keymouse.asm(83) : error A2052: forced error
    7.  IoSetCompletionRoutine(13): Macro Called From
    8.   Keymouse.asm(83): Main Line Code
    пожалуйста подскажите как её устранить

    ________________________________________

    Не забываем пользоваться тегом [code][/code] — G13