Можно ли ввести несколько Dll с обходами MS? - PullRequest
0 голосов
/ 26 мая 2011

В c ++ я хочу подключить более одного dll к процессу. Сейчас я использую CreateProcesswithdll(), который может подключать только один API за раз. Что я могу сделать, чтобы ввести несколько DLL?

Я столкнулся с этой проблемой, потому что обходы MS требуют, чтобы мы называли нашу собственную dll такой же, как и оригинальная dll, чтобы правильно обходить вызовы API. Таким образом, даже если бы я мог обрабатывать разные вызовы API в одной и той же обходной DLL, которую я создал, мне нужно иметь разные имена для перехвата вызовов из разных API, что означает, что мне нужны разные обходные Dll. Это также означает, что мне нужно вводить разные библиотеки DLL. Я прав?

Если мне что-то непонятно, я постараюсь представить это более четко: D

Спасибо!

П.С .: Просто чтобы сделать мою проблему более ясной. Мне нужно ввести более 1 DLL на тот же процесс. CreateProcesswithdll() создает новый процесс с его потоком в состоянии сна. Он просыпается после того, как обходные пути закончили вводить dll и устанавливать крючки. Если я хочу ввести более одной dll, я, очевидно, не могу повторно позвонить CreateProcesswithdll()

так что мне делать ?? или мое понимание некоторых аспектов этого неверно?

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

Похоже, detourattach и detourdetach помогут мне.Спасибо всем!

Я нашел этот блог полезным!

2 голосов
/ 28 мая 2011

Вызов LoadLibrary () и FreeLibrary () равен НЕ БЕЗОПАСНО из DLLMain ().From TFA:

"Функция точки входа должна выполнять только простые задачи инициализации или завершения. Она не должна вызывать функцию LoadLibrary или LoadLibraryEx (или функцию, которая вызывает эти функции), поскольку это может создатьциклы зависимости в порядке загрузки DLL. Это может привести к использованию DLL до того, как система выполнит свой код инициализации. Аналогично, функция точки входа не должна вызывать функцию FreeLibrary (или функцию, которая вызывает FreeLibrary) во время завершения процесса,потому что это может привести к использованию библиотеки DLL после того, как система выполнила свой код завершения. "

РЕДАКТИРОВАТЬ: Извинения - это означало комментарий для ответа Сержа выше.

1 голос
/ 26 мая 2011

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

EDIT.

Когда загружена DLL, система запускается DllMain вашей DLL (с ​​fdwReason == DLL_PROCESS_ATTACH), а затем внутри этой функции вы можете делать все что угодно, например, вы можете вызвать LoadLibrary для загрузки других DLL.

ДОБАВИТЬ: Я полностью согласен с комментариями о том, что вызов LoadLibrary из DllMain небезопасен.Таким образом, вы можете вызывать LoadLibrary (и все другие хитрые вещи) из потока, созданного в DllMain.

...