Часто при автоматизации задач или интеграции стороннего программного обеспечения мы сталкиваемся с ситуацией, когда исполняемый файл (EXE) поддерживает работу через командную строку, но список доступных ключей (параметров) нигде не задокументирован. Связаться с разработчиком не всегда возможно, а стандартные методы не дают результата. В этой статье мы подробно разберем, как «вытянуть» информацию о параметрах запуска из любого приложения, используя методы от простого к сложному.
Прежде чем приступать к глубокому анализу, проанализируем стандартные возможности самой программы. Большинство разработчиков закладывают базовые флаги для вывода справочной информации. Попробуем запустить файл в консоли cmd.exe со следующими аргументами:
app.exe /?app.exe /helpapp.exe -happ.exe --helpapp.exe /manЕсли программа корректно написана, она может вывести окно со списком команд или отобразить их прямо в консоли. Однако, если приложение графическое (GUI), оно может проигнорировать эти команды или закрыться без вывода текста. В таком случае переходим к следующим шагам.
Внутри любого бинарного файла содержатся текстовые данные: названия функций, сообщения об ошибках и, что самое важное для нас, строки, с которыми программа сравнивает введенные параметры. Рассмотрим использование утилиты Strings из пакета Sysinternals.
Эта утилита сканирует файл и выводит все последовательности символов. Чтобы не листать тысячи строк, воспользуемся фильтрацией. В командной строке выполним команду:
strings.exe -n 3 app.exe | findstr /i /c:"/"
strings.exe -n 3 app.exe | findstr /i /c:"-"
Здесь мы ищем строки длиной не менее 3 символов, которые начинаются со слеша или дефиса. Часто параметры группируются в одном месте кода, поэтому, найдя один известный ключ (например, /verbose), посмотрите на строки рядом с ним — скорее всего, там будут и остальные.
Иногда нам нужно узнать не все теоретически возможные ключи, а те, с которыми программа работает в данный момент (например, если она запущена каким-то системным сервисом). Разберем способ мониторинга через Process Explorer или WMIC.
В Process Explorer найдите интересующий процесс, нажмите правой кнопкой мыши и выберите Properties. В поле Command Line будет отображена полная строка запуска. Аналогично это можно сделать через системную консоль Windows:
wmic path win32_process get Commandline,Caption
Этот метод полезен, если программа является частью более крупного комплекса и запускается «родительским» приложением с определенными настройками.
Если приложение написано на современных языках, таких как C# или VB.NET, нам очень повезло. Такие программы легко превращаются обратно в исходный код. Проанализируем ситуацию с помощью dnSpy или ILSpy.
dnSpy.Main.args[] или вызовы Environment.GetCommandLineArgs().В коде вы увидите конструкцию типа switch или набор if...else, где программа поочередно проверяет каждый аргумент. Это даст вам 100% точный список всех ключей и понимание того, за что каждый из них отвечает.
Некоторые программы хранят справочную информацию в своих ресурсах (String Table). Воспользуемся утилитой Resource Hacker. Откройте файл и перейдите в раздел String Table. Часто там хранятся тексты диалоговых окон, в том числе и тех, которые выводятся при ошибке синтаксиса командной строки. Там можно обнаружить скрытые ключи, такие как /S (тихая установка) или /LOG.
Программы получают аргументы командной строки, обращаясь к функциям операционной системы Windows API. Выясним причину поведения программы, отследив вызовы функций GetCommandLineA и GetCommandLineW. С помощью инструмента API Monitor можно запустить приложение и посмотреть, какие данные оно запрашивает у системы сразу после старта.
Также стоит обратить внимание на Process Monitor (ProcMon). Если программа при запуске с определенным ключом начинает искать файл config.xml или проверять ветку реестра, это может натолкнуть на мысли о предназначении этого параметра.
Если ни один из методов не помог, остается «тяжелая артиллерия» — дизассемблирование. Разберем по шагам логику работы в отладчике:
Загрузите файл в x64dbg. Установите точку останова (breakpoint) на системный вызов получения командной строки. После этого пошагово выполняйте код (клавиша F8). Вы увидите, как программа берет строку, которую вы ввели при запуске, и начинает сравнивать её с константами в своей памяти. Например, инструкция REPE CMPSB или вызовы strcmp будут последовательно сравнивать ваш ввод со списком допустимых команд. Эти константы и есть те самые искомые параметры.
Поиск параметров запуска — это всегда небольшое исследование. Рассмотрим краткий чек-лист для эффективной работы:
/? и Strings — это дает результат в 70% случаев.Помните, что некоторые параметры могут быть «скрытыми» и предназначаться только для отладки разработчиками, поэтому при их использовании стоит соблюдать осторожность, особенно если они касаются удаления данных или изменения системных настроек.