Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Исполнение dll без указания явной функции


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


Каким образом запустить 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;
}


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

Автор: Dem_max 17.5.2013, 03:39
http://support.microsoft.com/kb/164787/ru

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


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

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

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

Автор: Dem_max 17.5.2013, 16:53
Цитата

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

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

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

Автор: 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" - это аргументы к дефолтной функции. А это совсем не так!

Автор: magn1t 17.5.2013, 18:56
Цитата(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 без явного указания, примеры кода, я буду Вам благодарен.

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

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

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

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

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

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

Для общего развития советую ознакомиться с:
  • http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx
  • http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx
  • http://msdn.microsoft.com/en-us/library/windows/desktop/ms683212%28v=vs.85%29.aspx
  • http://msdn.microsoft.com/en-us/library/windows/desktop/ms683152%28v=vs.85%29.aspx

Автор: Dem_max 17.5.2013, 20:06
Цитата

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

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



Код

hinstLib = LoadLibrary("My.dll"); 


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

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

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

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

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

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

Выложи свое решение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)