Непонятности с анонимными пайпами и cmd.exe

Тема в разделе "WASM.WIN32", создана пользователем geroin.vxd, 28 июл 2006.

  1. geroin.vxd

    geroin.vxd New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2006
    Сообщения:
    11
    Уважаемые гуру, подскажите решение проблемы.
    -Стандартный вариант Бэкдора. Имеем командный интерпретатор (cmd.exe), запущенный с унаследованными хэндлами ввода-вывода созданных ранее анонимных пайпов. И вроде все ништяк, пока дело не доходит до DIR в SYSTEMDIR. Ввиду большого количества файла, информация выводится интерпретатором в пайп порциями, я так предполагаю ввиду небольшого размера буфера вывода интерпретатора. Мож кто подскажет, как обойти сей замут, чтоб в пайп залить сразу весь result. Либо какой Char заслать в буфер ввода, чтоб выскочила следующая порция.

    -И сразу второй вопрос. Функцией WriteFile засылаем в интерпретатор команду на выполнение. Как известно, эта функция возвращает управление, как только завершит запись. Следующая команда - чтение пайпа- ReadFile. Тут создается трабл с командами, которые интерпретатор выполняет достаточно долго - выходной буфер содержит не всю информацию. В плане синхронизации как понимаю никаких особых сигнальных Event-ов для cmd.exe не придумано, т.к. процесс и поток переходит в сигнальное состояние только при Terminate. При рассмотрении работы cmd под микроскопом видим два Eventa, один из которых в момент выполнения команды находится в сигнальном состоянии. Можно ли воспользоваться сим Event-ом для нормальной синхронизации? Хотя предполагаю дело это геморное, т.к. придется творить DuplicateHandle, а потом искать нужный...
    Как можно замутить качественную синхронизацию в таком случае?
     
  2. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Ммдя... Наверное точно придется хэндл ловить... Либо буфер на изменение каким-либо образом проверять...
    А мож Слип(100) тебе поможеть (знаю, грязное это дело ну а куда ещё....)
     
  3. geroin.vxd

    geroin.vxd New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2006
    Сообщения:
    11
    Не, Sleep никак не идет, творение жалко портить плохим почерком. Буфер проверял на изменение, PeekNamedPipe, вроде работает, правда код тоже корявейший. Вот и задаю вопрос, а может кто знает какие либо ухищрения?
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Читай буфер, пока не прочтёшь весь и используй PeekNamedPipe, чтобы не подвиснуть - вот и всё.
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Код (Text):
    1. dir /P
     
  6. geroin.vxd

    geroin.vxd New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2006
    Сообщения:
    11
    Quantum

    Гениальное просто! И что сразу не дошло? Теперь вместо посылки DIR просто всегда шлем DIR /p, и вуаля!
    Может и с синхронизацией есть подобная мыслишка? :derisive:
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    С синхронизацией я лично поступал довольно тупо: Read + Sleep, пока в буфере последним звеном не появится промпт шелла. Код по сей день исправно функционирует в одном коммерческом софте (не бакдор).
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Quantum
    Может, с шеллом проще. Но если та или иная консольная прога думает больше положенного над ответом, то и нам придётся висеть на ReadFile, что зачастую неприемлимо. Вариант с созданием потока для чтения и прибиением его слишком груб. Для этого и приходится проверять через PeekNamedPipe.
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    IceStudent
    При взаимодействии с 16-битными приложениями через пайп в 9х иногда возникают странные исключения и приходится перенаправлять выход в файл. Универсального решения, AFAIK, нет. К тому же, именованные пайпы вообще только NT поддерживаются.
     
  10. geroin.vxd

    geroin.vxd New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2006
    Сообщения:
    11
    Quantum
    При ожидании конца выполнения команды по появлению промпта шелла будет загвоздка:
    -допустим сверяем последний принятый байт буфера с 03eh (">"). Теперь в результате к примеру вышеуказанной команды DIR /p мы соответственно ничего не дождемся, т.к. в конце буфера будет ANSI строка "Для продолжения нажмите любую клавишу...". Много команд cmd.exe запрашивают подтверждение (Y\N) и т.д. и т.п. Попытаюсь выдернуть хэндл Eventa из cmd, и по нему определять. Всем BIG THNKS!
     
  11. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    geroin.vxd
    http://drmist.ru/sources/BindWinAll/bind.cpp
    Фактически переведенный Console.asm из пинча.
     
  12. geroin.vxd

    geroin.vxd New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2006
    Сообщения:
    11
    ВсЁ, замутил с поиском хэндла Eventa, проверкой его на PID и Type, копированием в свой процесс и последующим опросом. Причем код получился не особо громоздким... Хотя была пара подводных камней. Если кто что знает об этом, PLEASE, просветите.
    -ProceXP from Sysinternals определяет объект как Event, а при работе с ним система видит его как MUTANT
    -Какого спрашивается Дуя в структуре SYSTEM_HANDLE_INFORMATION хэндл определен как word? Полдня с этим боролся, параметры в стеке съезжали...
     
  13. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    geroin.vxd
    Не нужно использовать такие черезжопные методы. Ведь в консоли должен работать не только cmd.exe, а вообще любая программа (даже с псевдографикой, наподобии far). Имхо лучше всего читать из пайпа данные по 1 байту, а затем держать их в буфере, и по заполнении буфера, либо по истечении таймаута отправлять их на обратную сторону.
     
  14. geroin.vxd

    geroin.vxd New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2006
    Сообщения:
    11
    Ms Rem
    Гы! Зато как круто получилось - гланды, как говорится, через задний проход удаляем. Не, просто в данной реализации, для чего предназначено, кроме cmd.exe ничего не используется. А так естественно понятно, что ни одна другая консольная аппликуха с таким методом синхронизации не попрет по естественной причине. А для себя приятно, задумал, посоветовался, сделал по своему :derisive:

    ЗЫ Большой респект за библиотеку Ring0 для Delphi. В Phrack#59 это дело описывается, но реализовать сходу не получается, жуков выводил неделю, BSOD FOREVER. Потом твое Дело просто переложил на ASM, и вуаля! THNKS
     
  15. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Вот это уже более правильная реализация, но всеравно не идеал. Можно вполне обойтись только одним потоком.
     
  16. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    я правильно понимаю, речь о телнет-шелле? если да, то имхо тут что-то не сходится, far невозможно использовать через telnet (насколько я знаю, кажется это связанно с тем, что он не совсем "кончолькое приложение", а вобще если у кого есть исходник, опровергающий мое утверждение - я с любопытством посмотрел бы)
     
  17. geroin.vxd

    geroin.vxd New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2006
    Сообщения:
    11
    Да собственно дело не в телнете. Выдернутый через анонимный пайп из консоли буфер в дальнейшем можно отправить на RemoteHost массой способов such as: NamedPipes, MailSlots, Sockets e.t.c. и принять самопальным же клиентом... Хотя, ежели честно, с FAR я таким образом не работал, ничего сказать не могу.
     
  18. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Ну дык для этого нужен и не совсем обычный шел :) Нужно передавать по сети также движения мыши, нажатия клавиш и.т.п. Реализацию этого пишет один местный чел (я чейчас изучаю даже рабочий исходник, правда не сетевой). Если он захочет - то возможно выложит сорцы на паблик, но я его постараюсь от этого отговорить :)
     
  19. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    Ms Rem
    ))
    ну если он вздруг его дапишет и захочит поменяться на то же самое, но для всего экрана - моя аска у тебя (вероятно еще - а то похоже ты сменил уин а также возможно и клиент) есть.
     
  20. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    дык уже с год есть ремотный фар. это реальность.