Системный поток. одна проблемка

Тема в разделе "WASM.NT.KERNEL", создана пользователем rpy3uH, 20 авг 2010.

  1. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    Несколько дней назад пришла в голову идея, о том как скрытно выполнять код в ядре - создать системный поток. Вычислить его сложно, он не привязан к конкретному драйверу. Решил проверить такую идею в целях "повышения образованности".
    Написал небольшой драйвер, в нём создаёт системный поток, который в бесконечном цикле ждёт событие и как только оно переходит в сигнальное состояние издаёт звук, потом переводит событие в несигнальное состояние и снова ждёт.
    Написал user mode прогу для управления событием (в том числе и создание), всё чётко работает. Следующий шаг - сделать код потока базонезависимым, сказано сделано. Чтобы проверить как он будет работать находясь по другому адресу, зарезервировал в драйвере место для копии "тела" потока и перед созданием потока переместил код потока туда, а функции PsCreateSystemThread передал новый адрес. Поток создаётся, начинает выполняться, но ошибки возникают в совершенно неожиданных местах, например после вызова функции KeWaitForSingleObject (адрес передаваемого события правильный, проверил сам лично), притом что с функций IoCreateNotificationEvent проблем нет.
    Может кто-нибудь знает в чём проблема? или у меня в коде есть глупая ошибка, которую я не замечаю...

    FASM
    Код (Text):
    1. SystemThreadDataStart:
    2. Sound:
    3.     ; функция издаёт звук с помощью системного динамика через порты ввода/вывода
    4.     cli
    5.  
    6.     mov al, 10110110b
    7.     out 43h, al
    8.  
    9.     mov eax, ecx
    10.     out 42h, al
    11.  
    12.     mov al, ah
    13.     out 42h, al
    14.  
    15.     ; включить динамик
    16.  
    17.     in al, 61h
    18.     or  al, 11b
    19.     out 61h, al
    20.  
    21.     sti
    22.  
    23.     mov ecx, 2800000h
    24.     loop $  
    25.  
    26.     cli
    27.  
    28.     ; выключить динамик
    29.  
    30.     in al, 61h
    31.     and al, 11111100b
    32.     out 61h, al
    33.  
    34.     sti
    35.     ret
    36.  
    37. proc SystemThread PARAM1
    38.      int3
    39.      call .delta
    40.     .delta:
    41.      pop ebx
    42.      sub ebx, .delta  ; EBX = дельта смещение
    43.  
    44.      lea eax, [ebx+SyncEventHandle]
    45.      push eax
    46.      lea eax, [ebx+SyncEventName ]
    47.      push eax
    48.      call [ebx+mitIoCreateNotificationEvent]
    49.      mov [ebx+SyncEvent], eax
    50.  
    51.     .repeat:
    52.      stdcall [ebx+mitKeWaitForSingleObject], [ebx+SyncEvent], Executive, KernelMode, FALSE, 0
    53.  
    54.      mov ecx, TONE1
    55.      call Sound
    56.      mov ecx, TONE2
    57.      call Sound
    58.      mov ecx, TONE3
    59.      call Sound
    60.  
    61.      stdcall [ebx+mitKeResetEvent], [ebx+SyncEvent]
    62.  
    63.      jmp .repeat
    64.      ret
    65. endp
    66.  
    67. UNICODE_STRING_define SyncEventName, "\BaseNamedObjects\MySyncEventName"
    68. SyncEventHandle dd 0
    69. SyncEvent dd 0
    70.  
    71. mitIoCreateNotificationEvent dd 0
    72. mitKeWaitForSingleObject dd 0
    73. mitKeResetEvent dd 0
    74. SystemThreadDataEnd:
    75. SystemThreadDataSize = SystemThreadDataEnd - SystemThreadDataStart
    76.  
    77. SystemThreadHandle dd 0
    78.  
    79. align 4
    80. NewSysThreadAddress:
    81.      rb SystemThreadDataSize
    82.  
    83. proc DriverUnloadHandler pDriverObject
    84.  
    85.     ret
    86.  
    87. endp
    88.  
    89. proc DriverEntry pDriverObject, pRegistryPath
    90.  
    91. ;пересохраняем адреса необходимых функций
    92.     mov eax, [IoCreateNotificationEvent]
    93.     mov [mitIoCreateNotificationEvent], eax
    94.  
    95.     mov eax, [KeWaitForSingleObject]
    96.     mov [mitKeWaitForSingleObject], eax
    97.  
    98.     mov eax, [KeResetEvent]
    99.     mov [mitKeResetEvent], eax
    100.  
    101.     mov eax, NewSysThreadAddress
    102.     mov esi, SystemThreadDataStart
    103.     mov edi, eax
    104.     mov ecx, SystemThreadDataSize
    105.     rep movsb
    106.  
    107.     add eax, SystemThread - SystemThreadDataStart
    108.     ;mov eax, SystemThread
    109.  
    110.     invoke PsCreateSystemThread, SystemThreadHandle, THREAD_ALL_ACCESS, 0, 0, 0, eax, 0
    111.     ;mov eax, STATUS_DEVICE_CONFIGURATION_ERROR
    112.  
    113.     mov eax, [pDriverObject]
    114.     virtual at eax
    115.      .eax DRIVER_OBJECT
    116.     end virtual
    117.     mov [.eax.DriverUnload], DriverUnloadHandler
    118.  
    119.     mov eax, STATUS_SUCCESS
    120.     ret
    121.  
    122. endp
    с макросом UNICODE_STRING_define проблем нет так как IoCreateNotificationEvent успешно выполняется

    Код (Text):
    1. macro UNICODE_STRING_define name,string
    2. {
    3.     _us_#name du #string
    4.     _us_#name_len = ($ - _us_#name)
    5.     dw 0
    6.     #name _UNICODE_STRING _us_#name_len,(_us_#name_len+2),_us_#name
    7. }
    после перемещения структуры ссылка (поле Buffer) на саму строку осталась правильной
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Для идентификации ошибки нужна информация про неё. Обычно это крэшдамп.