Cmd exe обработчик команд windows

Cmd exe обработчик команд windows

Обработчик команд Windows

В Windows имеется так называемая консоль — программа cmd.exe, которая является командным интерпретатором. При простом запуске, без указания параметров командной строки, консоль отображает версию операционной системы, информацию о защите авторских прав разработчиков ОС и саму командную строку, в которой можно ввести как параметр командной строки самой программы Cmd.exe, так и любую внешнюю команду, например, команду на запуск другого приложения или стандартную команду, типа mkdir, del и т. п.

Параметры командной строки

Синтаксис для командной строки:

Можно использовать одновременно несколько команд, используя между ними специальный разделитель — символы &&, при этом все сочетание нескольких команд должно быть заключено в кавычки, например, "команда&&команда&& команда".

/? — вызов справки
/A — вывод результатов выполнения заданной команды в формате ANSI
/C — выполнение заданной команды с последующим закрытием окна консоли
/D — отключение выполнения команд AutoRun (которые первыми автоматически выполняются при вызове cmd.exe), заданных в специальных разделах реестра HKEY_LOCAL_MACHINESoftwareMicrosoftCommand ProcessorAutoRun и HKEY_CURRENT_USERSoftwareMicrosoftCommand ProcessorAutoRun
/E:ON (/E:OFF) — разрешение (запрет) расширений команд. В Windows XP по умолчанию включена расширенная обработка всех команд cmd.exe, этот параметр служит для включения / выключения расширений конкретного процесса. Расширенная обработка включает следующие команды: assoc, call, chdir (cd), color, del (erase), endlocal, for, ftype, goto, if, mkdir (md), popd, prompt, pushd, set, setlocal, shift, start (изменен также вызов внешних команд)
/F:ON (/F:OFF) — разрешение (запрет) завершения имен файлов и папок (по умолчанию выключено) конкретного вызова cmd.exe. Довольно удобная функция, позволяющая не вводить полностью вручную в окне консоли пути к файлам или имена самих папок, а ввести только часть длинного пути и с помощью нажатия специальной комбинации клавиш дать операционной системе найти подходящие варианты и просто выбрать нужный. (Если необходимо включить или отключить завершение имен для всех вызовов cmd.exe, то смотри Автонабор команд). Параметры пользователя имеют приоритет над параметрами компьютера, значение параметра /F командного процессора имеет приоритет над параметрами реестра. Microsoft вносит некоторые разъяснения по поводу использования этой функции: "Если завершение включено с помощью ключа командной строки /F:ON, то используются два управляющих символа: Ctrl+D для имен папок и Ctrl+F для имен файлов. Чтобы отключить конкретный символ завершения в системном реестре, в качестве кода специального символа используется шестнадцатеричное значение символа пробела (0 x 20). Завершение вызывается при вводе одного из этих двух специальных символов. Функция завершения берет строку пути слева от точки ввода, дописывает к ней символ шаблона, если таковой отсутствует, а затем строит список путей, которые соответствуют полученному определению. После этого выводится первый элемент этого списка соответствующих путей. Если же список пуст, то подается звуковой сигнал, и ничего не выводится. После этого повторный ввод того же самого специального символа приводит к циклическому перебору всех соответствующих путей. Нажатие клавиши Shift при вводе управляющего символа позволяет просматривать список путей в обратном порядке. Если изменить выведенный путь, а затем снова ввести управляющий символ, сохраненный список очищается, и строится новый список путей. То же самое происходит, если переключиться с одного символа завершения на другой. Единственное отличие при использовании символа завершения файла состоит в том, что при этом для построения списка соответствия берется и путь, и имя файла, а при использовании символа завершения папки — только путь. Если символ завершения используется в одной из встроенных команд манипулирования папками (CD, MD или RD), то всегда подразумевается символ завершения папок. Символ завершения правильно работает и с именами файлов, содержащими пробелы или иные специальные символы, если при этом строка соответствия заключена в кавычки. Кроме того, если сместить точку ввода влево, а затем использовать символ завершения внутри строки, оставшийся справа от точки ввода текст будет отброшен. Специальные символы, которые требуют обязательного заключения в кавычки: &()[]<>^=;!’+,

".
/K — выполнение заданной команды без последующего завершения (окно консоли не закроется)
/Q — отключение вывода команд на экран (ECHO OFF).
/R — аналогичен параметру /C
/S — изменение поведения команды после /C или /K
/T:цвет — задание цвета текста и фона окна консоли. Параметр цвет имеет значение в виде двух шестнадцатеричных чисел: первое определяет цвет фона окна, а второе — текста в окне. То есть результатом выполнения команды "CMD /T:7С" будут светло-красные буквы на белом фоне.
/U — вывод результатов выполнения команды в формате Unicode
/V:ON (/V:OFF) — разрешение (запрет) отложенного расширения переменных среды (для конкретного вызова cmd.exe) с применением восклицательного знака "!" в качестве разделителя. Например, /V:ON разрешает использовать !var! в качестве расширения переменной var во время выполнения. Синтаксис var служит для расширения переменных при вводе, что приводит совсем к другим результатам внутри цикла FOR. При включенном отложенном расширении переменных среды символ "!" (восклицательный знак) может использоваться для замены текущего значения переменной среды во время выполнения; /X — означает то же, что и ключ /E:ON, из соображений совместимости; /Y то же, что и /E:OFF. И еще несколько замечаний. Если указаны ключи /C или /K, то остальная часть командной строки после такого ключа обрабатывается как командная строка, а обработка символов кавычек (") ведется таким образом. Символы кавычек в командной строке сохраняются, если выполняются все перечисленные ниже условия: ключ /S отсутствует; есть ровно два символа кавычек; между ними нет других специальных символов, как то: &<>()@^|; между ними имеются один или несколько пробелов; строка, заключенная в кавычки, является именем исполняемого файла. В противном случае проверяется первый символ, и если он является символом кавычек, то он удаляется, также удаляется последний символ кавычек в командной строке, а весь текст после этого последнего символа кавычек сохраняется.

Читайте также:  Gs yuasa аккумулятор для бритвы philips

Таблица для задания цвета текста и фона окна консоли

0 — черный 1 — синий 2 — зеленый 3 — голубой
4 — красный 5 — лиловый 6 — желтый 7 — белый
8 — серый 9 — светло-синий A — светло-зеленый B — светло-голубой
C — светло-красный D — светло-лиловый E — светло-желтый F — ярко-белый

Кстати, цвет и другие настройки можно изменять и другим способом. Щелкните по строке заголовка окна и выберите пункт Свойства. Откроется окно с четырьмя вкладками, на которых будут доступны опции изменения настроек программы. Если вам не нравится стандартный черный экран командной строки, то на вкладке Цвета вам предлагается выбрать цвет экрана и текста либо из 16 стандартных цветов, для которых имеется соответствующие образцы, либо задав числовое значение цвета в формате RGB.

На вкладке Расположение настраивается размер окна и экранного буфера. Если в ранних ОС MS-DOS и Windows размер экрана оставался неизменным 25 строк в высоту и 80 символов в длину, и для вывода большего количества строк приходилось добавлять команду |more, то в системах NT и более поздних можно просто задать достаточно большой размер буфера экрана и пользоваться полосой прокрутки, что гораздо удобнее.

Текст в окне командной строки

Для копирования и вставки текста в окно командной строки обычные для Windows комбинации клавиш, такие как Ctrl+C, Ctrl+V, работать не будут. Для извлечения текста из буфера обмена вам придется вызвать меню, щелкнув правой кнопкой мыши по заголовку окна, и выбрать подменю Изменить. Или же просто щелкните правой кнопкой по окну. Для копирования текста из окна выберите пункт Пометить и мышью выделите нужный текст. Затем либо нажмите Enter, либо в том же меню выберите Копировать. Если надо вставить какой-то текст в окно командной строки, обратитесь к команде Вставить.

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

Быстрая вставка пути к файлу

Можно не вводить длинный путь к файлу, а просто перетащить файл в окно командной строки.

Автозаполнение

Можно использовать автозаполнение — напечатайте первую часть пути, например, E:. Затем нажмите клавишу Tab. Все доступные имена файлов и папок будут циклически показываться в окне.

История команд

Нажимая на клавишу со стрелкой вверх, вы можете выбрать предыдущие использованные вами команды. Клавиша со стрелкой вниз позволит перейти к следующим командам. Чтобы увидеть все команды, нажмите на клавишу F7.

Полноэкранный режим

Начиная с Windows Vista, командная строка не поддерживает полноэкранный режим. Если вы нажмете на клавиши Alt+Enter, то получите соответствующее сообщение.

Команды

TITLE — для изменения заголовка строки
TITLE [строка], где строка — это будущий заголовок окна командной строки (записывается без кавычек). После задания заголовка окна он может быть изменен только повторным вызовом команды TITLE. Использование данной команды может быть полезно в командных файлах. Так, выполнение примера, который приведен ниже, будет сопровождаться появлением соответствующей надписи в заголовке окна:

Команда АТ — С помощью этой команды можно запускать команды и программы в определенное время.
AT [\имя компьютера] [ [id] [/DELETE] | /DELETE [/YES]]
AT [\имя компьютера] time [/INTERACTIVE] [ /EVERY:дата[. ] | /NEXT:дата [. ]] "команда"
\имя компьютера указывает на удаленный компьютер, на котором могут быть запущены планируемые задачи. Если этот параметр не указан, то по умолчанию предполагается тот компьютер, на котором запускается команда АТ;
id идентификатор, назначенный указанной команде;
/delete отменяет намеченную команду. Если id опущен, все назначенные команды на компьютере отменены;
/yes этот параметр в случае использования с предыдущим параметром (/delete) автоматически включает подтверждение для всех запросов;
time время выполнения команды (в 24-часовом формате часы:минуты);
/interactive позволяет команде AT обмениваться с подключенными на данный момент в системе пользователями;
/every:дата[. ] выполняет команду в каждый указанный день (дни) недели или месяц. Если дата опущена, подразумевается текущий день месяца;
/next:дата[. ] выполняет указанную команду при следующем наступлении указанной даты (например, в следующий четверг). Если дата не указанна, по умолчанию принимается текущий день месяца;
"команда" указывается команда Windows NT или пакетная программа, которая будет выполнена. Имя файла должно указываться полностью. При этом, если выполняется какая-либо из внутренних команд, например, COPY или DIR, а не исполняемый файл, то необходим запуск командного интерпретатора с ключом / С, например: AT 10:00 "CMD /C DIR > C: est.out.
Команда For — Ее возможности обширны, но мы ограничимся демонстрацией лишь одной из них — Копирование по сети на все машины сразу. Допустим, что требуется скопировать файл на двадцать машин. Делается это очень быстро. Сначала в файл list.txt записываем список всех имеющихся в сети машин. В консоли пишем: Затем, чтобы выполнить, например, копирование файла patch.exe на каждую машину из списка, даем команду: Переменная %i будет автоматически принимать значение NetBIOS-имени машины из новой строки файла list.txt и на эту машину будет производиться копирование.

Запуск командной строки (cmd.exe) с правами администратора

Для запуска командной строки (cmd.exe) с правами администратороа сделайте следующее:
Нажмите Пуск и в поле поиска ввдеите cmd. На найденном файле нажмите правую клавишу мыши и выберите в контекстном меню пункт "Запуск от имени администратора". Обратите внимание, что заголовок окна примет вид Администратор: Командная строка.

Реестр

В справочнике по реестру Windows смотрите статью Изменение вида приглашения командной строки

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

Читайте также:  Почему роутер плохо раздает вай фай

Из-за чего возникает и насколько опасно

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

  1. Открытие любого приложения, которое было запланировано пользователем заранее. Обновления начнут сразу же загружаться.
  2. Если пользователь ранее скачивал различные программы из интернета, то данное приложение может автоматически начать запускаться.
  3. Вирус, что является наиболее вероятной причиной, если выскакивает беспричинно командная строка. Таким образом он активизируется во время загрузки компьютера.

Также стоит рассмотреть случаи, когда подобная ситуация возникает:

  1. Чаще всего это случается сразу же после загрузки Виндовс, пользователь еще не успевает ничего предпринять. В большинстве случаев данная ситуация – не всегда показатель вируса. Вполне вероятно, что некоторые составляющие ПК попросту устарели, их нужно заменить.
  2. Командная строка появляется беспричинно во время работы за компьютером, при этом через некоторое время возникает вновь. Пользователь может вовсе ничего не делать за ПК, окно появляется само. Вот это уже показатель возможного заражения вирусом.

Какими могут быть последствия

Примечание! Все будет зависеть от того, в какое время появляется случайно возникающая командная строка. Если при самом начале загрузки, то в 90% случаев достаточно просто заменить устаревшие запчасти компьютера или оставить все без изменений.

Также такая ситуация может возникнуть у пользователей ОС Виндовс 10, которая требует большой процент производительности ПК, вследствие чего возникают случайные неполадки и зависания.

А второй случай требует детального рассмотрения, так как с вирусами бороться сложнее.

Определение проблемы

Для начала стоит определить, насколько всплывающая командная строка опасна для работы системы.

    Запускаем окно «Выполнить» (Win+R на клавиатуре).

Как избавиться от вируса

В данной ситуации прекрасным помощником может оказаться программа «CCleaner». Ее нужно скачивать только с официальных источников, а не с непроверенных сайтов, во избежание еще большего заражения вирусами.

    При установке в самом верху экрана можно выбрать язык. По умолчанию в большинстве случаев уже стоит русскоязычная версия, но при желании можно изменить на украинский язык или другой. Если пользователь не пользуется браузером «Google Chrome», то внизу экрана будет стоять соответствующая галочка. При установке программы появится и этот браузер, однако эту галочку можно снять. Теперь нужно нажать кнопку «Установить».

Еще один способ для пользователей Windows 10

Примечание! Обычно использования программы «Ccleancer» целиком хватает для того, чтобы избавить компьютер от вируса . Однако можно прибегнуть и к его удалению через командную строку. Данный способ актуален для тех пользователей, которые пользуются ОС Windows 10.

  1. Для начала нужно зайти в консоль. Чтобы это сделать, понадобится нажать на кнопку «Пуск» в левом углу, в строке поиска прописать «cmd». Система сразу же выдаст приложение «Командная строка», на которое нужно нажать правой кнопкой мыши и кликнуть на «Запустить от имени администратора».

После всех проделанных действий вирус больше не должен появиться. В противном случае потребуется обратиться в сервисный центр.

Видео — Как удалить файловый вирус всплывающей строки cmd при запуске windows

Понравилась статья?
Сохраните, чтобы не потерять!

Сфера разработки программного обеспечения является одной из тех областей человеческой деятельности, где термин «исторические причины» используется наиболее часто. Оно и понятно — многие «долгоиграющие» проекты наподобие ядер различных операционных систем, браузеров и прочего обросли за время своего существования нехилым арсеналом вещей, менять поведение которых станет далеко не каждый, даже если перфекционист внутри разработчика говорит обратное. Вероятнее всего, большая часть кода была написана программистами, которые уже давно не работают в компании, а даже те, кто ещё связывают свои жизни с данной корпорацией, сомневаются, что остальные компоненты программного комплекса нормально отрерагируют на те или иные изменения. «Нет уж, лучше оставлю, как оно есть».

В качестве примера одной из таких вещей можно назвать cmd.exe. Да-да, это тот самый интерпретатор командной строки, входящий в поставку всех современных (и не очень) операционных систем семейства Windows. Исторических причин у него накопилось изрядное количество — достаточно вспомнить хотя бы то, как необходимо производить вставку и копирование в данный интерпретатор (ради справедливости стоит сказать, что в Windows 10 эту ситуацию наконец исправили, да и приложения наподобие ConEmu здорово в этом помогают). Но речь сегодня пойдёт о другом поведении, которое заствляет задуматься впервые столкнувшегося с cmd.exe человека, казалось бы, там, где этого совсем не требуется.

Как вы знаете, одной из команд, которые воспринимает cmd.exe, является «CD». Официальный хелп по этой команде сообщает следующее:

C:UsersNikita.Trophimov>CD /?
Displays the name of or changes the current directory.
[. ]

Казалось бы, всё просто. Вызываешь CD без аргумента — в stdout выводится путь до текущей директории, передаёшь другую директорию в качестве аргумента — он сменяет текущую директорию на указанную. Подводные камни тут начинаются в том случае, если пользователь решил сменить директорию одновременно вместе с диском. Например, если вы находитесь в директории «C:Windowssystem32», то команда «CD D:ooks» не сделает ровным счётом ничего. На мой взгляд, очевидного для новых пользователей в этом совершенно ничего нет, так что их спасает гугл или официальная документация, которая, кстати, сообщает:

Use the /D switch to change current drive in addition to changing current
directory for a drive.

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

Читайте также:  Pci ven 8086 dev 0102 subsys 844d1043

Как протекал процесс, и что из этого вышло, читайте под катом.

Всё большая часть ОС семейства Windows является 64-битными, что не является исключением и в моём случае. Все стандартные утилиты (calc.exe, taskmgr.exe, наш с вами cmd.exe и т.д.) также обзавелись 64-битными аналогами, которые и поставляются по дефолту вместе с операционной системой. Для реверса это означает то, что мы в данном случае не можем, к сожалению, воспользоваться уже привычным нам по предыдущим статьям (которые можно найти, например, тут) OllyDbg (кстати, работа над поддержкой x64 до сих пор ведётся).

Какие у нас есть варианты? С x64 умеют работать как минимум IDA Pro и относительно новый x64_dbg. К сожалению, поддержкой x64 обладают лишь платные версии IDA Pro, так что предлагаю остановиться на втором варианте.

Делаем копию cmd.exe, скачиваем снэпшот последней версии x64_dbg, запускаем его и загружаем в него исследуемый нами исполняемый файл:

Нажимаем F9 до тех пор, пока программа не перестанет останавливаться на брейкпоинтах (приятно, что очень многие хоткеи из OllyDbg работают и тут), делаем right-click по содержимому окна CPU -> Search for -> String references и ищем строку "/D":

Ставим на каждую из них по бряку при помощи F2, вводим в окно запущенного процесса cmd.exe команду «CD /D D:ooks» (предполагая, что мы, разумеется, находимся на другом диске) и останавливаемся на бряке по адресу 0x7F6D01F972A:

Рядом с бряком находится вызов функции _wcsnicmp, используемой для сравнения указанного кол-ва байт в переданных ей строках:

Важно понимать, что, в отличие от x86, в x64 используется совершенно другой calling convention:

The Microsoft x64 calling convention is followed on Microsoft Windows and pre-boot UEFI (for long mode on x86-64). It uses registers RCX, RDX, R8, R9 for the first four integer or pointer arguments (in that order), and XMM0, XMM1, XMM2, XMM3 are used for floating point arguments. Additional arguments are pushed onto the stack (right to left). Integer return values (similar to x86) are returned in RAX if 64 bits or less. Floating point return values are returned in XMM0. Parameters less than 64 bits long are not zero extended; the high bits are not zeroed

В данном случае в качестве строковых аргументов функции _wcsnicmp передаются "/D" и "/D D:ooks", а в регистре R8 хранится информация о том, сколько байт необходимо сравнивать (в данном случае 2). Разумеется, в этом случае в результате вызова функции _wcsnicmp в регистре EAX окажется ноль, что заставит программу перейти по адресу 0x7F6D01F97F2.

Первое, что приходит на ум — это сделать данный переход безусловным (поменять инструкцию JE на JMP), заставив таким образом программу думать, что ей всегда был передан аргумент "/D". Давайте так и поступим. Нажимаем F9, перемещаемся в предыдущую директорию для единообразия исходных данных, вводим команду «CD D:ooks» (обратите внимание на отсутствие ключа "/D"), выделяем строку с инструкцией je cmd.7F6D01F97F2, находящейся по адресу 0x7F6D01F9747, нажимаем пробел и меняем JE на JMP, не забывая поставить галочку рядом с надписью «Fill with NOP’s»:

Снова нажимаем F9 и видим, что команда всё равно некорректно завершила свою работу, но уже, по крайней мере, не промолчала, как это было в прошлый раз:

Ставим бряк на JMP’е и занимаемся трассировкой. Сразу же после прыжка в регистр RCX попадает «урезанная» версия строки, которая хранится по адресу, указанному в регистре RBX. Если быть более точным, из неё «удаляются» первые два символа (два, потому что строки юникодовые, что можно было бы понять по сигнатуре функции _wcsnicmp и символу «L» перед строковыми литералами, в связи с чем на каждый из них требуется по два байта, а команда «обрезает» строку при помощи RBX+4):

Несложно догадаться, что делается это как раз для того, чтобы убрать из строки, содержащей интересующий программу путь до директории, ключ "/D", который и состоит из двух символов. Разумеется, нам этого делать уже не надо, т.к. теперь подобные действия будут «обрезать» часть пути до указанной пользователем директории. Что ж, заменим данную инструкцию на lea rcx, qword ptr ds:[rbx] (занопить её нельзя, т.к. в регистр RCX всё же должно попасть значение):

Снова вводим команду без указания ключа "/D", и… Видим, что переход в нужную директорию действительно осуществляется.

Для того, чтобы сохранить проделанные нами изменения, открываем меню «Patches» при помощи Ctrl-P, проверяем, что выделены все необходимые изменения, нажимаем на кнопку «Patch File» и выбираем имя для пропатченной версии cmd.exe.

К сожалению, даже если у нас получится заменить оригинальный cmd.exe из директории "%WINDIR%system32" на пропатченный, Windows всё равно восстановит прежнюю исполняемого версию файла из кеша, так что сделайте отдельный ярлык для пропатченного бинарника и пользуйтесь им.

Послесловие

Порой даже мелочи могут сделать нашу жизнь проще и приятнее или, наоборот, лишь усугубить положение дел. Если Вы уже несколько раз споткнулись о подводный камень в виде недостающего флага "/D", то почему бы не взять в руки отладчик и не исправить эту ситуацию? Не забывайте, что баги и «исторические причины» встречаются сплошь и рядом, а править их разработчики намереваются далеко не всегда.

Справедливости ради стоит отметить, что в PowerShell необходимость в указании ключа "/D" для команды CD всё же убрали.

Спасибо за внимание, и снова надеюсь, что статья оказалась кому-нибудь полезной.

Ссылка на основную публикацию
Adblock detector