Программирование на Visual Basic

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


Сегодня я расскажу вам об одном приёме, который, несомненно, вам пригодится. Этот приём называется "Замена Исполняемых Файлов". Не могу (и не хочу) говорить, что его придумал я, но то, что додумался до него сам - это 100%!

Зачем это вообще нужно?
Замена исполняемых файлов - это способ перехвата параметров командной строки передаваемых приложению (тобиш исполняемому файлу). Вот!

В чём заключается этот способ перехвата?
В том, что вместо "жертвы" (приложении, параметры которой надо узнать) мы помещаем свою прогу, которая сообщит вам обо всех параметрах.

Практика.
Этим приёмом я пользовался давно. Тогда я писал одну Интернетовскую программу, и мне срочно надо было узнать, как же можно из VB запустить окно "Установка Связи с Интернетом". Если бы дома была Сеть, то я мог бы найти ответ на каком-нибудь сайте, но в то время Интернет не работал, а я очень торопился. Тогда-то мне и пришла в голову мысль попробовать заменить файл.

Значит так. Нажал я на иконку "Установка связи с Интернетом" и запустил отлавливатель процессов. Кто не знает, это прога, которая показывает все текущие процессы в компьютере, а также сообщает, где находится запущенное приложение, (то есть путь к проге).

Итак, смотрим. Последний запущенный процесс - это программа RUNDLL32.EXE, находящаяся в папке C:/Windows/. Пробуем уничтожить процесс RUNDLL32.EXE и окно "Установка связи" исчезает. Путь мы узнали и даже проверили (закрыв процесс). Но вот проблема: приложение RUNDLL32.EXE используется не только для установки связи. RUNDLL32 - это общая программа. Она используется во многих системных процессах.

Попробуем запустить RUNDLL32 из её папки, и видим, что ничего не происходит. Первая мысль, что пришла в голову это конечно параметры командной строки. Видимо система сообщает RUNDLL32 о том, что именно ей надо, в данном случае надо показать окно установки связи. Но как узнать параметры, которые ей передаются?

Оказывается просто. Я уже говорил об этом выше - заменим файл на свой. Всё ОЧЕНЬ просто. Но во избежание лишних вопросов и недоумений вот вам код проги:

Private Sub Form_Load ()
If Len (Command) Then MsgBox Command, , "Command line parameters" _
Else MsgBox "Не передано никаких параметров командной строки!", , "Error"
End
End Sub

То есть прога запустится, сообщит о переданных ей параметрах (или об их отсутствии) и закроется.

Программу написали. Осталось заменить файл. Сначала проверьте, не запущен ли уже RUNDLL32.EXE и если запущен, то закройте все его процессы, иначе ничего не получится.

Если всё готово, то открываем папку C:/Windows/ и ищем файл RUNDLL32.EXE. Переименовываем его, например в 1RUNDLL32.EXE. Не бойтесь, если чего-то не получится, то мы спокойно вернём его обратно. Теперь компилируем нашу программу в VB в папку C:/Windows/ под именем RUNDLL32.EXE. Всё готово.

Осталось запустить "Установку связи". Запускаем и смотрим.

То есть для запуска окна "Установка связи" система сообщает проге RUNDLL32.EXE следующие параметры:
RUNDLL32.EXE RNAUI.DLL, RnaDial <название соединения>

Вот и всё! Всё что надо было, мы узнали. Теперь проверяем, может, мы получили неверный результат. Нажимаем Пуск/Выполнить, и вводим:
RUNDLL32.EXE RNAUI.DLL, RnaDial <название соединения>
Всё верно! Окно соединения запускается. Пробуем ввести другое название соединения - получается. А если не сообщить название?
RUNDLL32.EXE RNAUI.DLL, RnaDial
Тогда запускается одно из нескольких (обычно самое первое) соединений.

Теперь если в VB набрать RUNDLL32.EXE RNAUI.DLL, RnaDial, то запустится то, что нам надо.

Случай из личного опыта.
Прислал мне как-то на Бета-тестинг один "умный" программер свой, как он выразился, "оригинальный" проект. Он написал прогу, которая состояла из двух приложений. Первое приложение - это ввод пароля. Если вы ввели верный пароль, то первая прога запускала вторую, а если неверный, то об этом сообщалось. Я сообщил тому программеру, что это не лучший способ, но он мне ласково объяснил, что я ничего не смыслю в программировании. Я поблагодарил его за комплимент и сказал, что завтра отправлю ему крак к его программе.

Надо подумать, как вообще работает этот механизм. Скорее всего, здесь тоже параметры командной строки. Врядли передаются пароль и логин. Как же первая прога узнаёт от второй, что пароль неверный? А как узнаёт, что он верный и завершает свою работу? Наверное, просто передаются параметры о том, что пароль верный и вторая прога запускается, в противном случае нет.

Ну, я попробовал Замену Исполняемого Файла - заменил вторую прогу и вот что получил:
CheckForCorrectPassword=True
Теперь осталось написать крак, как я и обещал. Я написал прогу, при запуске которой она автоматически запускает вторую прогу (главную) и передаёт ей параметр CheckForCorrectPassword=True.

Послал я этот крак владельцу того "оригинального" проекта. В ответ я получил сообщение такого содержания: Сдаюсь.

Практика.
Теперь я приведу вам небольшой пример использования приёма Замены Исполняемых Файлов. Редко мы запускаем неассоциированные файлы на компе, но если и запускаем, то (файл ведь неассоциирован) чаще нам надо его просмотреть в Блокноте или WordPad"e. Но я, по часто привычке просто открываю файл, забывая о том, что он неассоциирован. В результате запускается окно "открыть с помощью". И всё было бы в порядке, если бы это окно не запускалось 20 секунд (чем больше на компе программ, тем дольше оно грузится). Это происходит из-за того, что прога при запуске читает в реестре все ассоциации файлов на вашем компе.

Эту проблему, оказывается, легко решить с помощью нашего приёма. Мы знаем, что RUNDLL32.EXE (а она и запускает окно "открыть с помощью"), используется сразу для многих целей (в этой статье мы разбираем два примера работы этого приложения).
Наша цель - определить, когда запускается RUNDLL32.EXE для показа окна "открыть с помощью". Заменяем файл - эти действия нам известны и запускаем какой-нибудь неассоциированный файл. Получаем: shell32.dll,OpenAs_RunDLL <File_Name>, где <File_Name> - путь и имя файла.

Теперь пишем нашу программу. Какая она будет? Если система обращается к RUNDLL32 с просьбой показать окно "открыть с помощью", то мы показываем формочку, в которой спрашиваем "А может сразу открыть с помощью Notepad"а? Или будете дожидаться загрузки окна "открыть с помощью"?". Если юзер нажимает кнопку Да, то сразу запускаем файл в Notepad"е, а если нет, то видимо он решил открыть файл в другом приложении.

А что делать, если RUNDLL32 не будет запускаться для открытия окна "открыть с помощью", а, например, для установки связи? А мы переименуем RUNDLL32.EXE в 1RUNDLL32.EXE и если ваша прога получит иные параметры (например, для установки связи), то запускаем 1RUNDLL23.EXE с этими параметрами.

Показывать весь код проги я вам не буду - опытные уже, хотя если возникнут трудности - пишите.

Случай из личного опыта.
Однажды, при написании вируса для сайта visualbasic.boom.ru (для опубликования), я что-то наделал с моей системой. Потом при каждом запуске компьютера у меня появлялось окно "Настройка параметров системы" (я работаю в Windows Me, в других системах такое окно, кажется, не появляется). Что бы я ни делал, избежать появления этого окна я не мог. Тогда я заменил файл msconfig.exe на свой, и определил параметры командной строки. Затем, узнав, их я написал прогу, которая заменила мне msconfig.exe. Я переименовал msconfig.exe в 1msconfig.exe, а свою прогу сохранил как msconfig.exe. Если моя программа получала параметр, который сообщается при ошибках в системе, то никакого действия не совершалось (при запуске компа ничего лишнего не всплывало), если же передавались другие параметры (например, когда действительно нужно было настроить систему), то моя прога запускала 1msconfig.exe.

Вот и всё!
Перед вами - отличное средство (приём, оружие - называйте, как хотите), для определения параметров. Используйте его везде, где это возможно и у вас не возникнет вопросов о том, какие же параметры переданы проге.

Daniyar Atadjanov - пишите если чё!!!

Hosted by uCoz