#c #api #hook #detours
#c #API #перехват #обходные пути
Вопрос:
В c я хочу подключить к процессу более одной библиотеки dll. Прямо сейчас я использую CreateProcesswithdll()
который может подключать только один API одновременно. Что я могу сделать, чтобы внедрить несколько библиотек DLL?
Я столкнулся с этой проблемой, потому что MS detours требует, чтобы мы называли нашу пользовательскую dll так же, как исходную dll, чтобы правильно обходить вызовы api. Итак, хотя у меня могли бы обрабатываться разные вызовы api в одной и той же созданной мной библиотеке dll detour, мне нужно иметь разные имена для подключения вызовов из разных API, что означает, что мне нужны разные библиотеки Dll detour. Это также означает, что мне нужно внедрить разные библиотеки DLL. Я прав?
Если мне что-то неясно, я постараюсь представить это более четко: D
Спасибо!
P.S: Просто чтобы сделать мою проблему более понятной. Мне нужно внедрить более 1 библиотеки dll в один и тот же процесс. CreateProcesswithdll()
создает новый процесс с потоком в состоянии ожидания. Он запускается после того, как обходные пути завершили внедрение библиотеки dll и настройку перехватов. Если я хочу внедрить более одной библиотеки dll, я, очевидно, не смогу повторно вызывать CreateProcesswithdll()
итак, что мне делать?? или я неправильно понимаю какой-то аспект этого?
Ответ №1:
Вызов LoadLibrary() и FreeLibrary() НЕБЕЗОПАСЕН из DllMain(). Из TFA:
«Функция точки входа должна выполнять только простые задачи инициализации или завершения. Он не должен вызывать функцию LoadLibrary или LoadLibraryEx (или функцию, которая вызывает эти функции), поскольку это может создать циклы зависимостей в порядке загрузки DLL. Это может привести к использованию библиотеки DLL до того, как система выполнит свой код инициализации. Аналогично, функция точки входа не должна вызывать функцию FreeLibrary (или функцию, которая вызывает FreeLibrary) во время завершения процесса, поскольку это может привести к использованию библиотеки DLL после того, как система выполнит свой код завершения.»
РЕДАКТИРОВАТЬ: Извинения — это было задумано как комментарий к ответу Сержа выше.
Ответ №2:
Похоже, detourattach
и detourdetach
для меня это сработает. Спасибо всем!
Я нашел этот блог полезным!
Комментарии:
1. Приятно слышать, что вы нашли решение! Пожалуйста, не забудьте отметить свой собственный ответ как правильный, чтобы ваш вопрос не остался без ответа (возможно, вам придется немного подождать, прежде чем вы сможете это сделать)
Ответ №3:
Очевидно, что вы можете загрузить любое количество библиотек DLL из первой библиотеки DLL, которую вы вводите с помощью detours.
Редактировать.
При загрузке DLL система запускает DllMain вашей библиотеки DLL (с помощью fdwReason ==DLL_PROCESS_ATTACH), а затем внутри этой функции вы можете делать все, что вам нравится, например, вы можете вызвать LoadLibrary для загрузки других библиотек DLL.
ДОБАВИТЬ: Я полностью согласен с комментариями о том, что вызов LoadLibrary из DllMain небезопасен. Таким образом, вы можете вызвать LoadLibrary (и все другие сложные вещи) из потока, созданного в DllMain.
Комментарии:
1. @Serge Спасибо за ответ! Я новичок в программировании для Windows и прочем, и я не совсем уверен в своем понимании того, как работает detours. Итак, когда вы упоминаете первую DLL, введенную detours, вы имеете в виду dll, которую я ввожу первой, или Detours вводит что-то перед пользовательской dll, которую я ввожу? Если он ничего не вводит, то вы хотите сказать, что я могу загрузить больше библиотек DLL из моей пользовательской библиотеки dll? Если это так, будут ли обходные пути должным образом обходить вызовы этой библиотеки dll. Извините за многословие. Просто хочу убедиться, что я получаю то, что вы предлагаете.
2. @ash: Я имею в виду DLL, которую вы вводите Обходными путями. Когда DLL загружена, система запускает DllMain вашей DLL (с
fdwReason==DLL_PROCESS_ATTACH
), и вы можете делать все, что вам нравится, например, вы можете вызвать LoadLibrary для загрузки других DLL.3. @Serge Еще раз спасибо! Да, я понимаю основную механику DLL. Но вы предлагаете, чтобы я внедрил мою новую dll в dllmain уже внедренной DLL? Я хочу внедрить несколько разных библиотек DLL!
4. @Serge Если я просто загружу dll, я не думаю, что detours смогут подключить API, специфичные для этой dll .. верно?
5. Вы не должны делать «все, что вам нравится» в DllMain, чтобы в конечном итоге не столкнуться с блокировкой загрузчика.