Как узнать информацию о звонящем? - PullRequest
2 голосов
/ 04 января 2011

Это потребует некоторого фона.Я использую Detours для перехвата системных вызовов.Для тех, кто не знает, что такое Detours, - это инструмент, который перенаправляет вызов системных функций в функцию обхода, которая позволяет нам делать все, что мы хотим, до и после фактического системного вызова.Что я хочу знать, так это то, что если можно как-нибудь узнать какую-либо информацию о dll / модуле, который сделал этот системный вызов?Помогает ли мне какая-либо функция API win32?

Допустим, что traceapi.dll выполняет системный вызов GetModuleFileNameW () внутри kernel32.dll.Detour будет перехватывать этот вызов и перенаправлять управление в функцию обхода (скажем, Mine_GetModuleFileNameW ()).Теперь внутри Mine_GetModuleFileNameW () можно ли узнать, что этот вызов произошел от traceapi?

Ответы [ 2 ]

1 голос
/ 04 января 2011

вызов ZwQuerySystemInformation с первым аргументом SystemProcessesAndThreadsInformation. как только вы получите возвращенный buf, введите его как PSYTSTEM+PROCESS_INFORMATION и используйте его поле для извлечения вашей информации.

status = ZwQuerySystemInformation (
        SystemProcessesAndThreadsInformation, buf, bufsize, NULL);

PSYSTEM_PROCESS_INFORMATION proc_info = (PSYSTEM_PROCESS_INFORMATION) buf;

proc_info->ProcessName, which is a UNICODE_STRING will give you the calling process name.

Обратите внимание, что структура и поле, о которых я говорю, не задокументированы и могут измениться в будущем выпуске окон. Тем не менее, я использую его, и он отлично работает на WIN XP и выше.

1 голос
/ 04 января 2011

Я не знаю, сколько стековых фреймов будет в стеке, которые принадлежат коду Detours.Легко найти в отладчике, шансы на то, что их нет.Это облегчает задачу, используя встроенную функцию _ReturnAddress, чтобы получить адрес звонящего.VirtualQuery (), чтобы получить базовый адрес, приведите его к HMODULE и используйте GetModuleFileName ().Что ж, неотключенный:)

Если есть кадры стека Detours, тогда становится намного сложнее.StackWalk64 (), чтобы пропустить их, опасно, если присутствуют кадры FPO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...