Ядро Windows: получение адресов функций внутри модулей

Я пытаюсь вызвать функцию ядра, расположенную в модуле win32kfull.sys. Я получил базовый адрес модуля с помощью ZwQuerySystemInformation. Теперь я хочу узнать смещение функции NtUserSendInput, расположенной в модуле win32kfull.sys. Когда я открываю win32kfull.sys в IDA Pro и открываю функцию, я получаю два адреса: IDA Pro расположение NtUserSendInput

К сожалению, я не знаю, как добавить смещения к базовому адресу win32kfull.sys, чтобы получить адрес функции.

Я был бы признателен, если бы кто-нибудь мог объяснить мне, как я могу действовать сейчас.


person moccajoghurt    schedule 20.10.2018    source источник
comment
Я не понимаю вопроса. На скриншоте показан только один адрес.   -  person IInspectable    schedule 20.10.2018
comment
Под двумя адресами я подразумеваю необработанное смещение и виртуальное местоположение. В принципе, я просто хочу знать: как мне получить адрес NtUserSendInput? (Ни необработанное смещение, ни виртуальное местоположение не указывают мне на NtUserSendInput, когда я добавляю их к базовому адресу модуля win32kfull.sys.   -  person moccajoghurt    schedule 20.10.2018
comment
Я думаю, вы даже не знаете, как получить offset символа pdb. так для чего вам это вообще надо?   -  person RbMm    schedule 20.10.2018
comment
Мне нужен адрес NtUserSendInput, потому что я хочу вызвать функцию в ядре. Я ошибаюсь, если пытаюсь таким образом узнать адрес в IDA?   -  person moccajoghurt    schedule 20.10.2018
comment
@moccajoghurt - NtUserSendInput является экспортируемым символом, так что без проблем возьмите его адрес   -  person RbMm    schedule 20.10.2018
comment
Также адреса win32k для подпрограмм Nt* можно найти через KeServiceDescriptorTableShadow.   -  person ImmortaleVBR    schedule 20.10.2018


Ответы (1)


Поскольку NtUserSendInput является экспортируемой функцией, это означает, что PE-формат изображения (в частности, каталог экспорта) позволит вам узнать адрес функции, если вы правильно разберете его.

Это лучшее решение, получение смещения из IDA Pro даст вам специфический для версии адрес, а это значит, что мне придется получать смещение для каждой сборки win32kfull.sys и каждый раз, когда появляется новый версия, вам придется обновить драйвер.

Итак, если у вас есть базовый адрес win32kfull.sys, вы можете рассматривать его как начальный адрес для структуры PE и анализировать его, в Интернете есть множество руководств о том, как это сделать.

person Herzel Bioring    schedule 16.12.2018