Описание процесса Rundll32.exe

Rundll32.exe входит состав Microsoft Windows 98, Windows 95 и Windows Millennium Edition. Данная программа представляет собой средство командной строки, позволяющее вызывать процедуры, которые экспортируются из библиотек DLL (32-разрядных и16-разрядных). Однако Rundll32 позволяет вызывать не все функции и не из всех библиотек DLL. Так с помощью данной программы нельзя вызвать функции Win32 API, экспортируемые библиотеками DLL.
 
Эта программа дает возможность вызывать функции из тех DLL, при разработке которых была предусмотрена подобная возможность. Здесь описывается использование программы Rundll32 под управлением Windows.
 
Программа Rundll32 входит состав Windows XP, Windows 2000 и Windows NT 4.0. и была разработана для использования в пределах корпорации Майкрософт. Однако, т.к. данная программа предоставляет возможности общего характера, она в настоящее время доступна всем пользователям. Если при ее запуске указать DLL неподдерживаемого типа, Rundll32 завершит работу. При этом сообщение об ошибке не отображается.
 
Для запуска Rundll используется следующая командная строка:
 
 
RUNDLL.EXE <dllname>,<entrypoint> <optional arguments>
 
А вот пример команды, которая запускает средство Rundll:
 
RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
 
При формировании этой командной строки нужно учитывать следующее:
 
1. Программа Rundll32 ищет библиотеку DLL в стандартных местоположениях. Чтобы убедиться, в загрузке требуемой библиотеки DLL, рекомендуется указывать весь путь к файлу. Чтобы избежать неподдерживаемых символов в именах файлов нужно использовать короткие имена. В этом случае необходимо изменить пути к файлам DLL, которые содержат длинные имена. (например, пути к файлам, находящимся в C:\Program Files).
2.<dllname> не должен иметь запятых,пробелов и кавычек (это ограничение определяется анализатором командной строки Rundll).
3. В указанной выше командной строке важным является наличие («,») между <dllname> и именем <entrypont>. Если («,») пропущена, Rundll32 завершит работу, не отображая сообщений и не выполняя действий. Так же между <dllname>, («,») и названием <entrypoint> не может быть пробелов.
 
Описание работы Rundll
 
После запуска Rundll выполняет такие действия:
 
1. Анализируется командная строка.
2. Загружается указанная библиотека DLL с помощью LoadLibrary().
3. Программа получает адрес <entrypoint> с помощью GetProcAddress().
4. Rundll вызывает <entrypoint>, передавая ей параметры <optional arguments>.
5. После окончания работы <entrypoint> Rundll.exe выгружает указанную библиотеку DLL и заканчивает работу. 
 
Создание пользовательской библиотеки DLL
 
В библиотеку DLL требуется поместить <entrypoint> со следующим прототипом:
16-разрядные DLL:
void FAR PASCAL __loadds
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
 
32-разрядные DLL:
void CALLBACK
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
 
При создании <entrypoint> требуется учитывать следующее:
 
1. Вместо EntryPoint нужно указать фактическое имя функции, которая является точкой входа. Точка входа, используемая Rundll32, не зависит от DllEntryPoint, которая в библиотеках DLL осуществляет оповещение о подключении потоков и обработку процессов.
2. Функцию, которая является точкой входа для Rundll32, нужно определить, используя _stdcall (по умолчанию для _stdcall используется CALLBACK). Если данный атрибут _stdcall отсутствует, то будет использоваться _cdecl. Такая ситуация приведет к аварийному окончанию работы Rundll32 после вызова функции.
3. Также указывая в параметрах программы Rundll32 имя функции, нужно учитывать, что Visual C++ экспортирует функцию как _EntryPoint@16 в случае, если DLL написана на языке C или применяет искажение имен в случае, если DLL написана на C++. Это происходит потому-то, что функция, которая используется в качестве входа, создается с участием соглашения_stdcall. Чтобы избежать искаженные имена, необходимо использовать файл DEF и экспортировать функцию, которая является точкой входа, по имени. 
 
Функции, которые являются точкой входа для Rundll, передают следующие параметры:
 
hwnd — заголовок окна, который необходимо указывать в качестве родительского окна, когда создаются окна в функциях DLL;
hinst — заголовок экземпляра DLL;
lpszCmdLine — командная строка, передаваемая DLL. Эта строка - последовательность символов ASCII.
nCmdShow — режим отображения окон DLL.
 
Здесь приведен пример команды, который запускает программу Rundll:
 
RUNDLL.EXE SETUPX.DLL , InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF
 
При ее выполнении Rundll вызовет InstallHinfSection(), которая находится в библиотеке Setupx.dll, и даст ей такие параметры:
 
hwnd = (заголовок родительского окна)
hinst = параметр HINSTANCE библиотеки SETUPX.DLL
lpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"
nCmdShow = (данные, передаваемые функции CreateProcess)
 
Функция <entrypoint> (в примере — InstallHinfSection()) должна сама анализировать командную строку и обрабатывать аргументы. Rundll.exe не анализирует дополнительные аргументы, которые указываются в командной строке. Эти аргументы должны обрабатываться функцией <entrypoint>.
Mail.Ru
Valid XHTML 1.0 Strict