У меня есть код, который я использовал годами для загрузки DLL, встроенной в приложение Windows, в память, возвращая адрес памяти в виде указателя. (Это также указатель на структуру IMAGE_DOS_HEADER, используемую для поиска адреса функций-членов) *
Как только DLL находится в памяти, я DLL_PROCESS_ATTACH. Чтобы найти адрес функций в Dll, я нахожу каталог экспорта:
lpImageExportDirectory = @lpImageNtHeaders.OptionalHeader.D`ataDirectory(%IMAGE_DIRECTORY_ENTRY_EXPORT).VirtualAddress
Добавьте заголовок:
lpImageExportDirectory = lpImageExportDirectory + lpImageDosHeader
Затем с помощью:
lpImageExportDirectory.AddressOfNameOrdinals
lpImageExportDirectory.AddressOfNames
lpImageExportDirectory.AddressOfFunctions
перебирайте функции, сравнивая имена, пока не найдете нужную.
(не могу опубликовать точный код, его ограничено)
Все это прекрасно работает на XP Win7, NT, Windows Server 2003R2, но НЕ на Windows Server 2008R2 64 бит. (не проверял на 32 бит)
Независимо от того, какую DLL я пытаюсь загрузить, приложение прикрепляет файлы, когда я присоединяю Dll.
псевдокод:
прототип функции:
int EntryPoint( BYVAL hInstance AS DWORD, BYVAL Reason AS DWORD, BYVAL Reserved AS DWORD)
....
pEntry = @lpImageNtHeaders.OptionalHeader.AddressOfEntryPoint + lpImageDosHeader
CALL DWORD pEntry USING EntryPoint(lpImageDosHeader, %DLL_PROCESS_ATTACH, 0)
Возможно, WS2008R2 «виртуализирует» Dll в памяти? Если да, то как мне рассчитать новый адрес?
Добавлено:
Пример встраивания - 131k
https://www.transferbigfiles.com/57e6932e-d7ae-1381-40d0-ed953716d44d?rid=gInPZcZ6%2bqHswyTnCElLdg%3d%3d
истекает 22 августа