Dynamics 365 Drag and Drop Attachment

Как я понимаю, он МОЖЕТ быть выполнен и MEANT, чтобы иногда выполняться (например, в случае инъекции dll с помощью CreateRemoteThread и других методов). Таким образом,

FreeLibraryAndExitThread(hModule, 0)

будет делать именно это.

С другой стороны, вызов

FreeLibrary(hModule)

здесь не будет выполнен - ​​из MSDN: «Если бы они вызывали FreeLibrary и ExitThread отдельно, условие гонки существовало бы. Библиотека могла бы быть выгружена до вызова ExitThread.» В качестве примечания ExitThread делает некоторую бухгалтерскую отчетность, а не только возвращает функцию потока.

Все это предполагает, что ваша Dll получила сам hModule, вызвав LoadLibrary из загруженной Dll, а точнее, вызвав изнутри загруженной Dll следующую функцию:

GetModuleHandleEx
(
    GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
    (LPCTSTR)DllMain,
    &hModule
)

увеличивает счетчик ссылок Dll, поэтому вы знаете, что если позже вы освободите библиотеку, используя этот дескриптор, и если библиотека действительно выгружена, то вы получили последнюю ссылку на нее. Если вы вместо этого пропустите инкремент счетчика ссылок Dll и получите hModule только от аргумента до DllMain во время DLL_PROCESS_ATTACH, тогда вы не должны вызывать FreeLibraryAndExitThread, так как код, который загрузил Dll, все еще использует его, и этот обработчик модуля действительно не для вас.

3
задан Arun Vinoth 8 March 2019 в 15:56
поделиться