Как стать автором
Обновить

Комментарии 38

Например, если вы находитесь в директории «C:\Windows\system32», то команда «CD D:\books» не сделает ровным счётом ничего.


ну вообще-то это команда сменит путь, но на другом диске, просто после этого нужно ввести команду
D:

Да, Вы правы, только всё равно таким решением пользоваться не очень удобно (можно ещё сначала переключиться на другой диск при помощи «D:», а потом ввести необходимую команду без ключа "/D").
Но в статье стоит поправить этот момент, ибо это не «ничего».
d:
cd books

равноправно

cd d:\books
d:
НЛО прилетело и опубликовало эту надпись здесь
Что Вы имеете ввиду? Отдельную команду в бинарник для этого добавить? Но зачем?
НЛО прилетело и опубликовало эту надпись здесь
Собирался погундеть о том, что дочерний процесс не может изменить cwd родителя, но потом осознал, что cmd не запускает батники в дочерних процессах.
Только тогда в .bat файлах придется вызывать команду zd через call zd…
Иначе управление обратно не вернется.

Все же выходит неполный аналог cd, если приходится запоминать особенности его вызова.
> Иначе управление обратно не вернется
Вообще-то всё вернется, если в конец zd.cmd добавить ещё и Exit /B
Ну, и чтобы совсем правильно — %1 заменить на %*, мало ли — вдруг путь с пробелами будет, чтобы не брать в кавычки.
>Вообще-то всё вернется, если в конец zd.cmd добавить ещё и Exit /B
Неработает.

Например, запуск
1.bat
@echo off
echo 1.1
2.bat
echo 1.2


2.bat
@echo off
echo 2
Exit /B


имеет такой результат
C:\1\test>1.bat
1.1
2


>Ну, и чтобы совсем правильно — %1 заменить на %*, мало ли — вдруг путь с пробелами будет, чтобы не брать в кавычки.
Спасибо за полезную инфу.
НЛО прилетело и опубликовало эту надпись здесь
Задайте алиас. Делов-то.
C:\> doskey cd=cd /D $*
C:\> cd Y:\
Y:\>
Тогда сломается «cd» без параметров. Которое, впрочем, эквивалентно команде «echo %cd%»
Хоть тема и старая, но оставлю как себе напоминалочку. Привыкшим к Линуксовой консоли лучше сделать вот так:
doskey pwd=cd & doskey cd=cd /D $* & doskey ls=dir $*
А ещё это можно «засейвить», чтобы оно всегда эпплаилось при запуске каждого консольного окна:
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor]
"AutoRun"="doskey pwd=cd & doskey cd=cd /D $* & doskey ls=dir $*"


Соответственно тогда cd здесь работает именно так, как описано в статье, для cd без параметров есть pwd (аналогичная команда есть под Линуксом), ну а ls — это просто из Линукса привычка :)
Мне почему-то кажется, что количество калорий, потраченное на дебаг и пропатчивание cmd.exe, эквивалентно количеству калорий, которое будет потрачено, если руками вводить букву диска в течении двухсот лет. Я не ретроград, но всё-таки эта фича из тех, к которым проще привыкнуть, чем побороть. Через пару дней работы с cmd уже на автомате сначала вводишь букву диска в командной строке, а потом уже делаешь CD в нужный каталог.
Статья ценна тем что в ней показано как можно подправить программу, чтобы она делала то что требуется так как автору хочется. Конечно есть множество howto по работе с отладчиками, но многие узнают о том что так можно именно благодаря этой странице.
Совершенно согласен. Работа с отладчиком на конкретном примере с конкретной целью — самое главное в данной статье
А Вы бы стали запускать такой бинарник? А если Вы бы полезли смотреть бинарный дифф, то одним бы им дело явно не обошлось — сырые байты без дизассемблирования вряд ли скажут Вам о чём-то конкретном. Ну, а с таким раскладом можно уже и проделать все те же действия, что были указаны в статье
сырые байты без дизассемблирования вряд ли скажут Вам о чём-то конкретном
Если это 90 90 90 90, то очень даже скажут. И ещё скажет объём такого диффа.
Да? Всё ведь зависит от контекста, в котором они написаны. Допустим, мы могли бы занопить такое место в бинарнике, которое бы позволило программе перейти на ветку кода, где выполняется отправка каких-то пользовательских данных на сервер или выключается компьютер. Последнее вполне реально в случае cmd.exe, в котором как раз имеется команда «shutdown»
Это несколько сложнее, нежели непосредственно внедрить вредоносный код, скажем, биткоин-майнера. Я всегда проверяю внешние бинари, особенно если приходится их патчить, но это не значит, что каждый раз я просматриваю весь листинг после дизассемблирования. Кстати, было бы интересно посмотреть на модификацию cmd.exe одними лишь нопами, которая бы отправляла данные о пользователе на заранее заданный сервер. :)
Это несколько сложнее, нежели непосредственно внедрить вредоносный код, скажем, биткоин-майнера

В случае выполнения команды «shutdown» вовсе необязательно. Вполне возможно, что в cmd.exe есть switch-case с определением очередной введённой пользователем команды, и, если занопить JMP'ы в нужных местах, можно как раз перейти не к обработке оригинальной команды, а к выполнению кода, находящегося в ветке команды «shutdown»

Кстати, было бы интересно посмотреть на модификацию cmd.exe одними лишь нопами, которая бы отправляла данные о пользователе на заранее заданный сервер

Конкретно к cmd.exe относился лишь второй пример:
Последнее вполне реально в случае cmd.exe, в котором как раз имеется команда «shutdown»
В случае выполнения команды «shutdown» вовсе необязательно.
В случае намеренного выполнения команды «shutdown» первый же комментарий здесь не позволил бы остальным запускать прогу, а Ваша карма была бы в значительной мере подпорчена.
Shutdown можно выполнять отложенный, чтобы не было сразу понятно, из-за чего он произошёл. Да и занопить можно попытаться так, чтобы реальная команда (например, CD в данном случае) тоже выполнялась
Ну, или придумать ещё десяток отговорок можно, конечно. Вариантов масса. Можно, например, nop-ами и нулями кодировать двоичный код, а затем дешифровать в памяти в рантайме.
Первое, о чем подумал, начав читать: а нет ли переменной %CDCMD%, аналогичной %DIRCMD%?
Четверть века даже не задумывался, что описанное автором является «проблемой». Но за раскопки кода плюсую.
Скрытый текст
А я вообще давно отказался от дисков в пользу NTFS-папок… =)
Через mountvol? Интересно как у вас это реализовано, я когда-то делал себе батник, который монтировал диски в папки и скрывал диски, но как-то не прижилось.
Может это, конечно, не кошерно, но я просто пользуюсь оснасткой «Управление дисками» (diskmgmt.msc).
Стандартное управление дисками позволяет убрать букву диска и смонтировать раздел в папку.
А смысл в чем?
А еще можно пользоваться pushd вместо cd. Заодно решается проблема с UNC.
Все же статья не про избавление от исторических причин. Я не знаю, кто бы пользовался cmd.exe так активно, чтобы именно cd мешал жить. Больше пользуются или менеджерами типа FAR или powershell, где подобные вещи исправлены.

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

А с каких пор в настройках cmd.exe можно установить галочки «Выделение мышью» и «Быстрая вставка»? Они решают проблему даже без необходимости запускать олю.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории