GdiSharedHandleTable

Тема в разделе "WASM.NT.KERNEL", создана пользователем assorted, 3 июн 2011.

  1. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Перехватил NtGdiExtTextOutW, но как выяснилось, она не вызывается напрямую. Смотрю реализацию ExtTextOutW, там вызова сервиса не происходит, вместо этого вызывается не экспортируемая _bBatchTextOut. Внутри используя указатель pGdiSharedHandleTable строки куда то там копируются. Дадее идет вызов NtGdiFlush(), и в ядре каким то образом эти строки извлекаются и отображаются. Собственно вопрос - как этот текст получить и где взять описание GdiSharedHandleTable.
     
  2. Charlief

    Charlief New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    129
    Из стека потока вызвавшего ExtTextOutW можно, это входной параметр LPCTSTR lpString.
     
  3. Honorary_BoT

    Honorary_BoT New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    87
    А описание можете взять из "Windows Graphics Programming: Win32 GDI and DirectDraw" (Feng Yuan), для NT 6 небольшие изменения есть, но думаю, быстро разберетесь.
     
  4. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    http://doxygen.reactos.org/df/ddf/ntgdihdl_8h_source.html
     
  5. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Так к сожалению не получится тк в NtGdiFlushUserBatch строка не через стек передается. Стек ExtTextOutW к тому времени не существует.

    klzlk
    Все верно, буду хукать NtGdiFlushUserBatch а не NtGdiFlush.
     
  6. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Упустил из виду очевидную вещь "после чего вызов любого теневого сервиса приведёт к вызову калбэка NtGdiFlushUserBatch()" SSDT хук тут не подходит. Таблица адресов колбэков заполняется при загрузке win32k с помощю функции PsEstablishWin32Callouts. Сама таблица адресов колбэков находится в ntoskrnl, я ее нашел добавлением смещения к KeServiceDescriptorTable. Может кому то пригоднится.
     
  7. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    assorted
    Вопрос за чем это надо? тем более таким способом ... Так как ядро будет легко ронять, скорее всего ...
     
  8. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    У вас есть конструктивные предложения про перехвату текста от ExtTextOutW?
    Не вижу по какой причение "ядро будет легко ронять"
     
  9. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Почему перехват происходит в ядре?
    Фузинг роняет такие вещи на раз, точнее механизм буферизации очень сложен в реализации для таких вещей ...
    Это какой форм грабер? тогда адекватный вопрос время жизни объекта(текста) в драйвере?
    А как на счет компабилити DC и DIB bitmpa ? где количество вывода текста может расти как минимум с алго прогрессией не используя дополнительную память ...

    П.С. возможен ли инжект в процесс ?
     
  10. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    assorted
    Feng Yuan "Windows Graphics Programming Win32 GDI and DirectDraw".
     
  11. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    shchetinin
    Хуки в юземоде не приемлимы.
    Количество вывода, думаю, не такое уж большое для конкретного PID.
    "На счет компабилити DC и DIB bitmpa" - имеете виду я не узнаю успешно ли текст вывелся или нет? Это не столь важно.

    Не понятно почему я не могу в хуке перед вызовом оригинальной NtGdiFlushUserBatch дергать текст, как вы говорите. Буду пробовать. Если это способ не оптимальный то какие еще есть идеи?
     
  12. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Еще такое навравление есть. Внутри ExtTextOutW

    cmp _GdiBatchLimit, 1
    jbe loc_77F1AB62

    Если GdiBatchLimit не более 1 то NtExtTextOutW все же вызывается.
     
  13. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    Очевидно мир на патче и сст не сошёлся. Есть куча приемлемых решений.