Комментарии 38
Например, если вы находитесь в директории «C:\Windows\system32», то команда «CD D:\books» не сделает ровным счётом ничего.
ну вообще-то это команда сменит путь, но на другом диске, просто после этого нужно ввести команду
D:
НЛО прилетело и опубликовало эту надпись здесь
Что Вы имеете ввиду? Отдельную команду в бинарник для этого добавить? Но зачем?
НЛО прилетело и опубликовало эту надпись здесь
Собирался погундеть о том, что дочерний процесс не может изменить cwd родителя, но потом осознал, что cmd не запускает батники в дочерних процессах.
Только тогда в .bat файлах придется вызывать команду zd через call zd…
Иначе управление обратно не вернется.
Все же выходит неполный аналог cd, если приходится запоминать особенности его вызова.
Иначе управление обратно не вернется.
Все же выходит неполный аналог cd, если приходится запоминать особенности его вызова.
> Иначе управление обратно не вернется
Вообще-то всё вернется, если в конец zd.cmd добавить ещё и Exit /B
Ну, и чтобы совсем правильно — %1 заменить на %*, мало ли — вдруг путь с пробелами будет, чтобы не брать в кавычки.
Вообще-то всё вернется, если в конец zd.cmd добавить ещё и Exit /B
Ну, и чтобы совсем правильно — %1 заменить на %*, мало ли — вдруг путь с пробелами будет, чтобы не брать в кавычки.
>Вообще-то всё вернется, если в конец zd.cmd добавить ещё и Exit /B
Неработает.
Например, запуск
1.bat
2.bat
имеет такой результат
>Ну, и чтобы совсем правильно — %1 заменить на %*, мало ли — вдруг путь с пробелами будет, чтобы не брать в кавычки.
Спасибо за полезную инфу.
Неработает.
Например, запуск
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%»
Хоть тема и старая, но оставлю как себе напоминалочку. Привыкшим к Линуксовой консоли лучше сделать вот так:
Соответственно тогда cd здесь работает именно так, как описано в статье, для cd без параметров есть pwd (аналогичная команда есть под Линуксом), ну а ls — это просто из Линукса привычка :)
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 в данном случае) тоже выполнялась
Первое, о чем подумал, начав читать: а нет ли переменной %CDCMD%, аналогичной %DIRCMD%?
Четверть века даже не задумывался, что описанное автором является «проблемой». Но за раскопки кода плюсую.
Скрытый текст
А я вообще давно отказался от дисков в пользу NTFS-папок… =)
Через mountvol? Интересно как у вас это реализовано, я когда-то делал себе батник, который монтировал диски в папки и скрывал диски, но как-то не прижилось.
Может это, конечно, не кошерно, но я просто пользуюсь оснасткой «Управление дисками» (diskmgmt.msc).
Если вдруг кому стало интересно и кто ещё не знает «как» — support.microsoft.com/en-us/kb/323424/ru
Стандартное управление дисками позволяет убрать букву диска и смонтировать раздел в папку.
А смысл в чем?
А еще можно пользоваться pushd вместо cd. Заодно решается проблема с UNC.
Все же статья не про избавление от исторических причин. Я не знаю, кто бы пользовался cmd.exe так активно, чтобы именно cd мешал жить. Больше пользуются или менеджерами типа FAR или powershell, где подобные вещи исправлены.
А если писать скрипты, то явно не стоит привязываться к тому, что они будут всегда выполняться в подпатченном cmd.exe
В общем, не для продакшена.
А если писать скрипты, то явно не стоит привязываться к тому, что они будут всегда выполняться в подпатченном cmd.exe
В общем, не для продакшена.
Исторических причин у него накопилось изрядное количество — достаточно вспомнить хотя бы то, как необходимо производить вставку и копирование в данный интерпретатор (ради справедливости стоит сказать, что в Windows 10 эту ситуацию наконец исправили, да и приложения наподобие ConEmu здорово в этом помогают).
А с каких пор в настройках cmd.exe можно установить галочки «Выделение мышью» и «Быстрая вставка»? Они решают проблему даже без необходимости запускать олю.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Избавляемся от «исторических причин» в cmd.exe