Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исполнение dll без указания явной функции 
V
    Опции темы
magn1t
Дата 17.5.2013, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.5.2013

Репутация: нет
Всего: нет



Добрый день уважаемы форумчане.
Перерыл литературу, интернет, но на вопрос к сожалению не нашёл ответ, надеюсь на Вашу помощь.


Каким образом запустить dll, через rundll32 без указания явной функции?

Корректная работа DLL при указании функции main:
user posted image

Без указания функции ничего не происходит:
user posted image

Код

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#define DLL_FUNC extern "C" __declspec(dllexport)

int main()
{
    MessageBox(HWND_DESKTOP, "Hi", "Message", MB_OK);
    return 0;
}


Большое спасибо.

PM MAIL   Вверх
Dem_max
Дата 17.5.2013, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39





--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
magn1t
Дата 17.5.2013, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.5.2013

Репутация: нет
Всего: нет



Спасибо за manual, но к сожалению ответа на мой вопрос там нет.
Переформулирую вопрос: Возможно ли запустить dll в rundll32 без указания entrypoint (т.е нужно чтобы функция выполнилась по умлочанию)
Подскажите пожалуйста, что в коде необходимо поправить.


PM MAIL   Вверх
Dem_max
Дата 17.5.2013, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Чем тебя не устроило с вызовом функции ???


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
magn1t
Дата 17.5.2013, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.5.2013

Репутация: нет
Всего: нет



Цитата(Dem_max @ 17.5.2013,  15:25)
Чем тебя не устроило с вызовом функции ???

Поставили такую задачу было заявлено, что это возможно, я ищу решение.
Всю голову сломал в поиске.
PM MAIL   Вверх
Dem_max
Дата 17.5.2013, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Цитата

Поставили такую задачу было заявлено, что это возможно, я ищу решение.

Если и имеется такая возможность то она не документирована.

Нормальные люди не ставят такие задачи по использованию недокументированных функций.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
feodorv
Дата 17.5.2013, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(magn1t @  17.5.2013,  16:05 Найти цитируемый пост)
Возможно ли запустить dll в rundll32 без указания entrypoint (т.е нужно чтобы функция выполнилась по умлочанию)

Нет, не возможно. Подсмотрел исходники rundll32 для w2000, такой возможности не обнаружено)))

Цитата(magn1t @  17.5.2013,  16:45 Найти цитируемый пост)
было заявлено, что это возможно

Доказательства предъявили?)))

Rundll должна уметь отличать EntryPoint от параметров вызова. Сравните:
Код
rundll32 runDll32.exe shell32.dll,Options_RunDLL 1
и
Код
rundll32 runDll32.exe shell32.dll 1
Если бы была default entrypoint, то rundll в последнем случае была бы просто не в состоянии отличить имя функции от параметра. Это хаос.

Другое дело, что в синтаксисе запуска rundll запятая, предшествующая имени функции, может быть заменена на пробел. Или на группу пробелов. Или на группу запятых. Или на группу и того, и другого:
Код

runDll32.exe shell32.dll Options_RunDLL 1
runDll32.exe shell32.dll,,,Options_RunDLL 1

И вот создаётся видимость того, что "Options_RunDLL 1" - это аргументы к дефолтной функции. А это совсем не так!


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
magn1t
Дата 17.5.2013, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.5.2013

Репутация: нет
Всего: нет



Цитата(feodorv @ 17.5.2013,  17:49)
Цитата(magn1t @  17.5.2013,  16:05 Найти цитируемый пост)
Возможно ли запустить dll в rundll32 без указания entrypoint (т.е нужно чтобы функция выполнилась по умлочанию)

Нет, не возможно. Подсмотрел исходники rundll32 для w2000, такой возможности не обнаружено)))

Цитата(magn1t @  17.5.2013,  16:45 Найти цитируемый пост)
было заявлено, что это возможно

Доказательства предъявили?)))

Rundll должна уметь отличать EntryPoint от параметров вызова. Сравните:
Код
rundll32 runDll32.exe shell32.dll,Options_RunDLL 1
и
Код
rundll32 runDll32.exe shell32.dll 1
Если бы была default entrypoint, то rundll в последнем случае была бы просто не в состоянии отличить имя функции от параметра. Это хаос.

Другое дело, что в синтаксисе запуска rundll запятая, предшествующая имени функции, может быть заменена на пробел. Или на группу пробелов. Или на группу запятых. Или на группу и того, и другого:
Код

runDll32.exe shell32.dll Options_RunDLL 1
runDll32.exe shell32.dll,,,Options_RunDLL 1

И вот создаётся видимость того, что "Options_RunDLL 1" - это аргументы к дефолтной функции. А это совсем не так!

Спасибо за развёрнутое объяснение, с Вашими словами пришло понимание.

Увы без доказательств, явно не было озвучено, что default entrypoint.

Но опереровали доводом, что во множестве ПО, есть возможность подключения и исполнения сторонних dll (без вмешательства в код), без описания и без указания каких-либо имен функций либо параметров.

Если, есть информация каким образом это реализовано и каким образом ПО определяет entrypoint в dll без явного указания, примеры кода, я буду Вам благодарен.

PM MAIL   Вверх
feodorv
Дата 17.5.2013, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(magn1t @  17.5.2013,  19:56 Найти цитируемый пост)
есть возможность подключения и исполнения сторонних dll (без вмешательства в код)

Вмешательства в код dll??? Или куда?

Цитата(magn1t @  17.5.2013,  19:56 Найти цитируемый пост)
без описания и без указания каких-либо имен функций либо параметров

Это называется plugin. Вы кидаете соответствующую dll в нужную папку программы и... вуаля! в меню программы появился отсутствовавший ранее пункт меню, или проигрыватель теперь может проигрывать неподдерживаемые ранее типы файлов. Волшебство, да и только)))

Всё отнюдь не так волшебно. Существуют соглашения и правила взаимодействия конкретной программы с предназначенными для неё плагинами. И в этих соглашения и правилах прописываются в том числе и имена экспортируемых из dll функций и параметры их вызова. То есть программа, подключающая внешнюю dll, заранее знает список функций, которые её нужны от этой dll. Если нужные функции (или переменные) не найдены, то plugin не будет подключен (сами подумайте, как его тогда вообще можно использовать).

Тем не менее, при подключении dll есть одна функция, которая не обязана присутствовать в dll, и которую загрузчик dll автоматически исполняет (даже несколько раз). Это вызов DllMain. Обычно этот вызов используется для инициализации различных внутренних переменных и структур, используемых самой dll, но бывают и варианты. Тем не менее эта функция, автоматически вызываемая загрузчиком dll при подключении динамической библиотеки к процессу и отключении её от процесса, не должна включать в себя код, связанный с любыми блокировками. В том числе и MessageBox. Конечно, в познавательно-демонстрационных целях Вы можете вставить вызов MessageBox в DllMain в момент DLL_PROCESS_ATTACH (и это даже сработает), только учтите, это не будет Вашей победой над задачей, это будет Вашим поражением...

Для общего развития советую ознакомиться с:


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Dem_max
Дата 17.5.2013, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Цитата

Но опереровали доводом, что во множестве ПО, есть возможность подключения и исполнения сторонних dll (без вмешательства в код), без описания и без указания каких-либо имен функций либо параметров.

Если, есть информация каким образом это реализовано и каким образом ПО определяет entrypoint в dll без явного указания, примеры кода, я буду Вам благодарен.



Код

hinstLib = LoadLibrary("My.dll"); 




--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 17.5.2013, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(magn1t @  17.5.2013,  17:45 Найти цитируемый пост)
Поставили такую задачу было заявлено, что это возможно, я ищу решение.Всю голову сломал в поиске.

угу, возможно,
в эксклюзивном режиме, как правильно заметил feodorv про DllMain,

т.е. в DllMain все подключаемые dll исходного приложения и подключаемые dll подключаемых dll входят эксклюзивно, т.е. они в этой точке не могут пересекаться, это такое узкое горлышко, из которого можно выйти только создав в DllMain поток, в котором уже и может выполняться основной код.

Некрасивый метод, но в крайних случаях, когда никакой иной способ взаимодействия с приложением не подходит, он работает.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
magn1t
Дата 18.5.2013, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 16.5.2013

Репутация: нет
Всего: нет



Спасибо Вам большое за вектор, задачу решил, хотя методика решения и не является технологически правильной.

PM MAIL   Вверх
kuzulis
Дата 18.5.2013, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: 1
Всего: 1



Цитата(magn1t @ 18.5.2013,  16:06)
Спасибо Вам большое за вектор, задачу решил, хотя методика решения и не является технологически правильной.

Выложи свое решение.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1133 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.