Знакомство с вызывающим абонентом, из каких DLL - PullRequest
3 голосов
/ 30 сентября 2010

В настоящее время у меня есть C ++ exe-проект, который динамически загружает N DLL.

Эти библиотеки DLL будут вызывать функции, которые находятся внутри exe-проекта.

Теперь, в рамках моего exe-проекта, я хотел бы знать, из каких DLL приходят звонящие.

Можно ли это сделать с помощью любого доступного API Windows?

Ответы [ 4 ]

4 голосов
/ 30 сентября 2010

Это зависит от того, какова ваша настоящая цель.Вы не можете сделать это, если вы ожидаете, что библиотеки DLL могут быть вредоносными (то есть, если вы ожидаете, что они попытаются обмануть вас ).Но если это просто для отладки или записи в журнал или чего-то относительно безвредного, вы можете посмотреть на стек и получить адрес, который инструкция ret будет использовать для возврата к вызывающей стороне, перечислить через загруженные библиотеки DLL и проверить, какая из нихадрес находится внутри.

Чтобы получить «обратный адрес», вы можете использовать _ReturnAddress встроенный в Visual C ++, а затем вы можете использовать функцию GetModuleHandleEx ,передав GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, чтобы получить указатель на DLL, внутри которой находится адрес.

Но я должен повторить: вы не можете основывать решения по безопасности на результатах этого теста .Вредоносному коду очень легко подделать и «обмануть» вашу программу, думая, что это «доверенная» или «безопасная» DLL.Как я уже сказал, если это просто для отладки или ведения журнала или чего-то еще, тогда продолжайте.

Кроме того, это, очевидно, только скажет вам DLL, внутри которой находится вызывающий немедленный вызывающий.Вы не можете сделать это, если у вас 5 уровней или что-то в этом роде ...

0 голосов
/ 30 сентября 2010

Если вы разрабатываете exe-файл и не предполагаете, что библиотеки DLL враждебны (см. Ответ Дина), вы можете достичь этого эффекта, предоставив каждой библиотеке DLL свой набор указателей для функций обратного вызова,который каждый в свою очередь переходит к фактическим функциям обратного вызова.Затем вы можете связать вызовы с вызывающей DLL, на основе которой фактически был вызван сквозной обратный вызов.

Конечно, это предполагает, что вы предоставляете адреса обратного вызова для DLL, но, вероятно, это будетнормальный дизайн для приложения, где DLL вызывается обратно в вызывающий exe.Конечно, это не сработает, если в вашей памяти процесса будет дурачиться DLL для внутренних функций, но тогда вы, вероятно, окажетесь во враждебной ситуации.

0 голосов
/ 30 сентября 2010

это полезно?Проверьте параметр 'GetModuleBaseRoutine'

0 голосов
/ 30 сентября 2010

Если вы дали один и тот же обратный вызов нескольким библиотекам DLL, то они должны предоставить вам информацию о том, кто есть кто.Большинство обратных вызовов API имеют параметр, который вы можете передать обратному вызову.Если это так для ваших обратных вызовов, вы можете использовать это для идентификации DLL.

Вероятно, это невозможно, учитывая, что стек вызовов все равно вернется к вашему exe.: Судя по вашему посту, это гипотетическая ситуация?

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