Внешняя KeServiceDescriptorTable

Тема в разделе "WASM.NT.KERNEL", создана пользователем Vilco, 5 мар 2007.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Есть замечательный хелп по Native API - ntundoc.chm
    Можно при желании найти в гугле
     
  2. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Вот, возник очередной вопрос.. Как получить имя процесса? (как в taskmgr) (ZwQuerySystemInfo конешно рулит но чето слишком сложно получается...) И как перевести Unicode строку в простую или хотябы юникод вывести на экран? (Да, я знаю, что я нуб =) Желательно с описанием параметров... (нашел RtlUnicodeToMultiByteN, а чё толку там параметров куча)
    Спасибо
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    1) RtlUnicodeStringToAnsiString()
    2) DbgPrint( " String is '%ls' ", UnicodeString->Buffer );
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а на %ws?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    n0name
    %ls тоже самое, что и %ws.
     
  6. aintrust

    aintrust New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2005
    Сообщения:
    2
    А если точнее, то так:
    DbgPrint( " String is '%ls' ", UnicodeString.Buffer );

    Однако, в силу "специфики" типа UNICODE_STRING, надежнее писать следующим образом:
    DbgPrint( " String is '%wZ' ", &UnicodeString );

    -- добавлено позднее --
    PS. В приведенных выше примерах подразумевается, что переменная UnicodeString имеет тип UNICODE_STRING.
     
  7. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    aintrust
    смотря что понимается под UnicodeString - объект или буфер, не все соблюдают венгерскую нотацию ;)
    а что это за "специфика" _UNICODE_STRING?
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    знаете ли, это зависит от типа UnicodeString. если это UNICODE_STRING*, то я написал выше как надо. Если это сразу объект, то как ты.
    что еще за %wZ и специфика _UNICODE_STRING?
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    так вот что такое %wZ.. а я и не знал
     
  10. aintrust

    aintrust New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2005
    Сообщения:
    2
    Речь вроде шла о Unicode-строке (UNICODE_STRING, насколько я понимаю), а не об указателе на нее, т.е. я имел ввиду объект типа UNICODE_STRING. Это мелочь, конечно, но новичка может смутить.

    Специфика состоит в том, что
    1) "реальная" строка (то, на что указывает PWSTR Buffer в структуре UNICODE_STRING) необязательно должна терминироваться нулем ((WCHAR)0);
    2) структура UNICODE_STRING содержит реальную длину строки в байтах (USHORT Length), т.е. без учета терминирующего нуля, если он даже в строке присутствует.
    Шаблон "%wZ" это учитывает.
     
  11. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    <Вот, возник очередной вопрос.. Как получить имя процесса? (как в taskmgr) (ZwQuerySystemInfo конешно рулит но чето слишком сложно получается...) И как перевести Unicode строку в простую или хотябы юникод вывести на экран? (Да, я знаю, что я нуб =) Желательно с описанием параметров... (нашел RtlUnicodeToMultiByteN, а чё толку там параметров куча)>

    Находишь EPROCESS процесса к примеру функцией PsLookup...
    Затем лезешь в эту структуру и по определённому смещению(см. структуру в символах ntoskrnl) вытаскиваешь имя процесса.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Length = размер строки без нуля в байтах
    MaximumLength при инициализации ее через RtlInitUnicodeString равен размеру строки с завершающим нулем в байтах.
    Если инициализируется строка через RtlInitUnicodeString, то завершающий ноль там будет стопудов.
    А вообще, спасибо, про %wZ я не знал. Всегда записывал ноль вручную по смещению Length в строке.
     
  13. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Пока дописывал драйвер возникло ещё пару вопросов. Совсем уж оффтоп, ну да ладно создавать новую тему не буду...
    1) Из
    Код (Text):
    1. DriverUnload proc pDriverObject:PDRIVER_OBJECT
    2.  
    3. local CR0Reg1:dword
    4.   invoke DbgPrint, $CTA0("DriverUnloaded\n")
    5.   cli
    6.   mov eax, CR0
    7.   mov CR0Reg1, eax
    8.   and eax, 0FFFEFFFFh
    9.   mov cr0, eax
    10.   mov eax, KeServiceDescriptorTable
    11.   mov eax, [eax]
    12.   mov eax, [eax]
    13.   mov ecx,OpenProcId
    14.   mov edx,TrueNtOpenProcess
    15.   mov [eax+ecx*04h],edx
    16.   mov eax, CR0Reg1
    17.   mov CR0, eax
    18.   sti
    19.   ;invoke IoDeleteSymbolicLink, addr dSymbolicLinkName      
    20.   ;mov eax, pDriverObject
    21.   ;invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject
    22.   ret
    23.  
    24. DriverUnload endp
    пытаюсь вынести код в макрос:
    Код (Text):
    1. nt_unhk macro num, prestore  
    2.   cli
    3.   mov eax, CR0
    4.   mov ebx, eax
    5.   and eax, 0FFFEFFFFh
    6.   mov cr0, eax
    7.   push num
    8.   mov eax, KeServiceDescriptorTable
    9.   mov eax, [eax]
    10.   mov eax, [eax]
    11.   pop ecx
    12.   mov edx,prestore
    13.   mov [eax+ecx*04h],edx
    14.   mov eax, ebx
    15.   mov CR0, eax
    16.   sti
    17. endm
    18. DriverUnload proc pDriverObject:PDRIVER_OBJECT
    19. local pronum:dword
    20.   invoke DbgPrint, $CTA0("DriverUnloaded\n")
    21.   mov eax, OpenProcId
    22.   mov pronum, eax
    23.   nt_unhk pronum, TrueNtOpenProcess
    24.   ;invoke IoDeleteSymbolicLink, addr dSymbolicLinkName      
    25.   ;mov eax, pDriverObject
    26.   ;invoke IoDeleteDevice, (DRIVER_OBJECT PTR [eax]).DeviceObject
    27.   ret
    28.  
    29. DriverUnload endp
    На первый взгляд различий нет, но первый вариант работает, а второй.. со свистом вылетает в форточку яростно ругаясь неизвестными мне словами (белым по синему): WORKER_THREAD_RETURNED_AT_BAD_IRQL
    ЛОЛ кароче... Чем я его обидел?
    2) Как реализуется загрузка ос? Допустим, написал я ничего не делающий загрузчик, поместил куда надо. Как теперь из него загрузить ос?=) Гдето я чето мельком слышал про .bin но слишком уж... Не понятно кароче... И как вообще делаются загрузочные диски и дискеты? Заранее спасибо%)
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ты повысил IRQL и забыл его понизить где-то, возможно, неявно.
    Поскольку драйвера загружаются так называемыми Worker Threads (Рабочие потоки) из процесса System, им сильно не нравится, когда DriverEntry возвращается с повышенным IRQL.

    Ты нажимаешь кнопку Power на системнике. Процессор принимает сигнал #RESET и производит аппаратный сброс. Процессор выполняется в реальном режиме для совместимости. Регистры устанавливаются в специально заготовленные для этого значения, в том числе EIP устанавливается в (кажется) FFFFFFF0. Там содержится команда JMP на процедуру инициализации. Производится Power-On-Self-Test (POST), включающий в себя проверку памяти и устройств. Далее вызывается прерывание INT19h и вся ответственность ложится на него. Обработчик этого прерывания опрашивает все дисководы системы в соответствии с порядком, установленным в настройках BIOS, на наличие загрузочного диска. Если таковой находится, сразу же первый (по порядку) сектор этого диска загружается по линейному адресу 07C00 и передает ему бразды правления.
    Далее, если этим сектором оказался Boot-сектор загрузочной дискеты MS-DOS, загрузчик считывает файлики IO.SYS и MSDOS.SYS и передает управление им управление.
    Если это Boot-сектор загрузочной дискеты Linux, он загружает другую часть загрузчика, которая грузит ядро Linux.
    Если это MBR какого-то жесткого диска, то он загружает поверх своего тела (опять по адресу 07C00) boot-сектор активного раздела. Тот загрузчик находит файл NTLDR (если стоит NT-based система на разделе) и передает ему управление. NTLDR показывает менюшку с вариантами загрузки, предложениями нажать F8 и прочее, потом инициализирует защищенный режим процессора, производит кое-чего и грузит ядро винды.

    Так вот, к чему я все это рассказываю. Загрузчик можно спокойно записать на место 1 сектора дискеты (boot-сектор). Управление получит первая команда этого сектора.
    Я, кстати, пишу сейчас по приколу загрузчик. Посмотреть на результаты моих трудов можно тут (http://www.wasm.ru/forum/viewtopic.php?id=18880). У меня есть шальная мысль дописать все это дело до какой-нибудь мини-ОС. Но я ее всячески отталкиваю, потому что это трудно и нету смысла. Пишу я скорее всего эту фигню просто для себя :)

    Как тестировать твой загрузчик. Ты собираешь свой ASM (или не ASM =)) файл в чистый бинарный файл. Лучше это делать FASM'ом. Он присвоит файлу расширение BIN. Далее указывай этот файл как образ загрузочной дискеты в эмуляторе VMWare Workstation. Ей плевать, что он меньше 1.44 мб. После этого, когда ты в ней выставишь загрузку с дискеты, она загрузит первый сектор (первые 512 байт) твоего загрузчика по линейному адресу 07c00 и передаст управление.

    Задачи "нормального" загрузчика:
    - считать с диска все остальные сектора со своим телом (в памяти сейсас лежат только первые 512 байт!!)
    - инициализировать IDT, GDT
    - отключить прерывания, перейти в защищенный режим, включить прерывания

    Если что, спрашивай :) Отвечу.

    PS. Предлагаю переместить наши дискуссии на тему загрузчиков в отдельную тему, линк выше в моем посте лежит.
     
  15. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Ок, писать начну обязательно спрошу=)
    А можно про IRQL попродробнее, как сделать так чтоб его не было?=\ (избавиться короче от бсод'а)
    Код я вроде привел, или, может быть, не в нем дело? Скину весь, буду надеяться на добрых опытных людей, мб ткнут носом... (мб при копипасте чего-нить напутал, н\р с cr0 в nt_hk макросе?)