Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Загрузка DLL из ресурса

292
13 мая 2008 года
Matush
726 / / 14.01.2004
В ресурсах есть ДЛЛка. Достаю ее из ресурсов так:

 
Код:
var
HM: Cardinal;
DLLFunc: TDLLGetClassObject = nil;
Resource: TResourceStream;
...
Resource := TResourceStream.Create(Hinstance, 'Lib', Pchar('DLLFILE'));
...


затем получаю хендл модуля:

 
Код:
GetModuleHandleExA($00000004, Resource.Memory, HM);
{эту функцию импортирую из kernel32}


Потом самое интересное. Хочу получить функцию 'DllGetClassObject' с помощю которой можно получить ClassFactory:

 
Код:
@DLLFunc := GetProcAddress(HM, 'DllGetClassObject');

Но ничего не получаю. Причем, если вместо GetModuleHandleExA, грузить из файла HM := LoadLibrary('SimpleDLL.dll'), то все работает.
261
13 мая 2008 года
ahilles
1.5K / / 03.11.2005
а чему равно HM? случайно не Resource.Memory?
это наверно потому что, когда ты грузишь через TResourceStream DLL размещается в памяти как файл, а не как PE образ, т.е. без учета выранивания секций, таблиц импорта, экспорта и релоков. А когда ты грузишь через LoadLibrary, то DLL грузится как PE образ.
292
13 мая 2008 года
Matush
726 / / 14.01.2004
Цитата: ahilles
а чему равно HM? случайно не Resource.Memory?



Непонял вопроса.
HM - Cardinal, и я так понимаю оно получает хендл модуля ДЛЛки

Цитата: ahilles

это наверно потому что, когда ты грузишь через TResourceStream DLL размещается в памяти как файл, а не как PE образ, т.е. без учета выранивания секций, таблиц импорта, экспорта и релоков. А когда ты грузишь через LoadLibrary, то DLL грузится как PE образ.



Оно точно размещается, как файл. Потому что если сделать SaveToFile, то получим нормальную ДДЛку. И я посмотрел исходники, оно пишет в файл бат в байт с того же участка памяти, на который указывает Resource.Memory.

P.S. Есть идеи как это реализовать?

303
13 мая 2008 года
makbeth
1.0K / / 25.11.2004
Цитата: Matush
затем получаю хендл модуля


Ну-ну... Если учесть вот это:

 
Код:
BOOL WINAPI GetModuleHandleEx(
__in DWORD dwFlags,
__in LPCTSTR lpModuleName,
__out HMODULE* phModule );

Причем здесь вообще указатель на кусок памяти с загруженным в него ресурсом, когда ясно указано, что вторым параметром идет имя модуля, т.е. имя и путь к файлу?
Описание и решение твоей задачи вроде видел на rsdn.ru в виде статьи. Причем, там использовался Delphi. Вот только сейчас найти не могу :(
261
13 мая 2008 года
ahilles
1.5K / / 03.11.2005
Цитата: Matush
Непонял вопроса.
HM - Cardinal, и я так понимаю оно получает хендл модуля ДЛЛки


я хотел спросить какое фактическое значение у тебя сохранилось в переменной HM? но если суть проблемы понятна, то это уже не имеет значения.

Цитата: Matush

Оно точно размещается, как файл. Потому что если сделать SaveToFile, то получим нормальную ДДЛку. И я посмотрел исходники, оно пишет в файл бат в байт с того же участка памяти, на который указывает Resource.Memory.
P.S. Есть идеи как это реализовать?


ну тогда всё просто
SaveToFile(куда-нибудь во временный файл)
потом LoadLibrary и всё.

292
13 мая 2008 года
Matush
726 / / 14.01.2004
Цитата: makbeth
Ну-ну... Если учесть вот это:
 
Код:
BOOL WINAPI GetModuleHandleEx(
__in DWORD dwFlags,
__in LPCTSTR lpModuleName,
__out HMODULE* phModule );

Причем здесь вообще указатель на кусок памяти с загруженным в него ресурсом, когда ясно указано, что вторым параметром идет имя модуля, т.е. имя и путь к файлу?



Неужели ты думаешь, что я вот так взял и решил вместо имени загнадь адресс в памяти, авось получится?
Почитай в MSDN про GetModuleHandleEx, тогда наверное обратиш внимание и на первый параметр.

292
13 мая 2008 года
Matush
726 / / 14.01.2004
Цитата: ahilles
ну тогда всё просто
SaveToFile(куда-нибудь во временный файл)
потом LoadLibrary и всё.


Идея именно в том, чтоб ничего никуда не сохранять.
Тем более, что GetModuleHandleEx возвращает true (проверял при неверном указателе - возращает false).
А в HM возарвщаются циферки :) этоже хендл, как его с чем-то сравнить? Или я все еще не понял в чем вопрос?

303
14 мая 2008 года
makbeth
1.0K / / 25.11.2004
Цитата: Matush
Неужели ты думаешь, что я вот так взял и решил вместо имени загнадь адресс в памяти, авось получится?
Почитай в MSDN про GetModuleHandleEx, тогда наверное обратиш внимание и на первый параметр.


Ну дык читаем MSDN чуть выше:

 
Код:
Retrieves a module handle for the specified module. The module [COLOR=Red]must have been loaded[/COLOR] by the calling process.

т.е. DLL-ка должна быть загружена в адресное пространство процесса. И тогда логично получается, что флаг GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS позволяет по любому адресу из адресного пространства текущего процесса получить модуль, который замапен в этот адрес.
Так что, подозреваю, что у тебя функция возвращает хэндл экзешника программы. ;)
Сравни ради интереса вызовы функции с передачей адреса ресурса и просто nil.
303
14 мая 2008 года
makbeth
1.0K / / 25.11.2004
Хм... таки нашел статью: http://www.rsdn.ru/article/baseserv/peloader.xml
292
14 мая 2008 года
Matush
726 / / 14.01.2004
 
Код:
Retrieves a module handle for the specified module. The module [COLOR=red]must have been loaded[/COLOR] by the calling process.

Мда, я это проигнорировал :)
На счет nil - ничего не возвращает, результат false, ErrorCode-87 (The parameter is incorrect. );

Спасибо за ссылку, но судя по функциональным ограничениям данного метода ("Не работают также некоторые функции, работающие с HInstance DLL (например, GetProcAddress)."), он мне не подходит, так-как именно GetProcAddress мне и нужен. Но это так, при беглом просмотре. Потом внимательно разберусь, может чего придумаю
261
14 мая 2008 года
ahilles
1.5K / / 03.11.2005
Цитата: Matush
Идея именно в том, чтоб ничего никуда не сохранять.


в статьях Ms-Rem'a про перехват API функций (во второй статье) есть код который грузит DLL настраивает релоки, экспорты и импорты. (DLL у тебя уже в памяти осталось только всё настроить)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог