
Запуск процессов с командой перенаправления вывода
Для перенаправления ввода и вывода консольных приложений используются специальные символы командной строки "<", ">" и "|". Например:tree c:\windows > out.txtВ этом случае вывод команды tree вполне ожидаемо будет сохранен в файл out.txt. Но если попытаться выполнить эту же команду средствами WinAPI, например, через функции WinExec, CreateProcess или ShellExecute(Ex), то нужного результата достигнуто не будет. Дело в том, что перенаправление обрабатывается только командным процессором, а функции WinAPI просто передают командную строку в неизменном виде, то есть программе "tree" будут переданы параметры "c:\windows > out.txt". В большинстве случаев они окажутся просто некорректными с точки зрения программы, а могут привести к неожиданным результатам.
Code (Assembler) : Убрать нумерацию
- ; Выполнить напрямую команду с перенаправлением
- invoke WinExec,exec_re,SW_SHOW
- ...
- ...
- exec_re db 'c:\Windows\System32\tree.com c:\Windows\System32 >out.txt',0
Если вы хотите, чтобы эти символы интерпретировались в вашем приложении как операторы перенаправления вывода, то вам нужно передавать их командному процессору следующим образом:
cmd.exe /c tree c:\windows > out.txtХорошим тоном будет сперва узнать, где в системе обитает командный процессор. Сделать это можно, получив значение переменной окружения COMSPEC.
Code (Assembler) : Убрать нумерацию
- ; Получить переменную окружения COMSPEC
- ; со ссылкой на командный процессор
- invoke GetEnvironmentVariable,variable,cmd,100h
- ; Дописать ключ /c
- invoke lstrcat,cmd,exec_add
- ; Дописать выполняемую команду с перенаправлением
- invoke lstrcat,cmd,exec_re
- ; Выполнить команду через командный процессор
- invoke WinExec,cmd,SW_SHOW
- ...
- ...
- exec_re db 'c:\Windows\System32\tree.com c:\Windows\System32 >out.txt',0
- exec_add db ' /c ',0
- variable db 'COMSPEC',0
Code (Assembler) : Убрать нумерацию
- ; Заполнить структуру SECURITY_ATTRIBUTES
- mov [sattr.nLength],sizeof.SECURITY_ATTRIBUTES
- mov [sattr.lpSecurityDescriptor],0
- mov [sattr.bInheritHandle],TRUE
- ; Создание выходного файла с наследуемыми атрибутами
- invoke CreateFile,filen,GENERIC_WRITE,\
- 0,sattr,CREATE_ALWAYS,\
- FILE_ATTRIBUTE_NORMAL,0
- ; Проверка
- mov ebx,eax
- cmp eax,INVALID_HANDLE_VALUE
- je .loc_error
- ; Заполнить структуру STARTUPINFO данными процесса
- mov [sinfo.cb],sizeof.STARTUPINFO
- mov [sinfo.dwFlags],STARTF_USESTDHANDLES
- mov [sinfo.hStdInput],0
- mov [sinfo.hStdOutput],ebx
- mov [sinfo.hStdError],ebx
- ; Запустить консольное приложение
- invoke CreateProcess,exec_pt,exec_cl,\
- 0,0,TRUE,CREATE_NO_WINDOW,0,0,sinfo,pinfo
- test eax,eax
- jz .loc_error
- ; Синхронное ожидание завершения tree.com
- invoke WaitForSingleObject,[pinfo.hProcess],\
- INFINITE
- ; Прибраться за собой
- invoke CloseHandle,[pinfo.hProcess]
- invoke CloseHandle,[pinfo.hThread]
- ; Закрыть файл
- invoke CloseHandle,ebx
- invoke ExitProcess,0
- .loc_error:
- ; Прибраться за собой
- invoke CloseHandle,ebx
- invoke ExitProcess,1
Просмотров: 2497 | Комментариев: 5
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(03.02.2026 в 16:24):
Добавил способом перенаправления с CreateFile + CreateProcess. Спасибо, пригодится. Архив обновлен.
Илья
(21.01.2026 в 20:15):
Можно сделать технологичнее и без запуска cmd.
Через функцию CreateProcessW с установкой параметра bInheritHandles и передачей в поле hStdOutput структуры STARTUPINFOW предварительно открытого наследуемого дескриптора файла.
Через функцию CreateProcessW с установкой параметра bInheritHandles и передачей в поле hStdOutput структуры STARTUPINFOW предварительно открытого наследуемого дескриптора файла.
dma
(09.07.2019 в 11:05):
Ну еще бы ManHunter, да оказался бы не прав - прав конечно. Человек который не скрывает ни своего лица, ни страны, ни города проживания, ни горячих точек (или точки), в котороых(ой) ему довелось побывать - не может быть не правым. И самое интересное, что всем этим можно гордиться.
На меня, видимо, произвела впечатление эта тема, потому что я недавно интересовался ей, а эта ветка явилась как бы приятным бонусом к моим знаниям. Как говорится, кто предупрежден - тот вооружен. Вдруг когда-нибудь буду заниматься плотно этой темой и всплывет подобная проблема.
На меня, видимо, произвела впечатление эта тема, потому что я недавно интересовался ей, а эта ветка явилась как бы приятным бонусом к моим знаниям. Как говорится, кто предупрежден - тот вооружен. Вдруг когда-нибудь буду заниматься плотно этой темой и всплывет подобная проблема.
ManHunter
(09.07.2019 в 09:51):
Это нормально. Кому-то нравится попадья, а кому-то свиной хрящик.
dma
(09.07.2019 в 09:46):
ManHunter, немного не хватает вашему блогу равномерности интересов среди ваших читателей. В каких-то ветках число комментариев порой зашкаливает за сотню, а здесь ни одного. Я решил хоть как-то исправить эту несправедливость. Но вы ж понимаете, мои возможности, к сожалению (а может и к счастью :)), достаточно скромны, а так бы я с радостью организовал бы здесь сто положительных отзывов. Видимо люди не слышали о таком понятии как шеллкод, а эта ветка как бы предподготовка к нему. Я правильно мыслю или нет? :) К чему это я? К спасибе, естественно, а к чему еще. :)
Добавить комментарий
Заполните форму для добавления комментария
Примеры программ с исходными текстами (FASM)

