информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медПортрет посетителяЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Logitech готовится закрыть очередную... 
 Серьёзная атака на инфраструктуру... 
 Microsoft призналась в сознательном... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Запустить в телнете/ssh? Перенаправить вывод на smb-ресурс? Или внутри софтины (через пайп)? 07.09.12 11:17  Число просмотров: 1986
Автор: Ustin <Ustin> Статус: Elderman
Отредактировано 07.09.12 12:19  Количество правок: 6
<"чистая" ссылка>
up: на сервере: unxutils, cmd /c soft.exe >> \\srv\share\1.out
на клиенте: unxutils, tail -f \\srv\share\1.out |grep...
но 1.out сильно распухнет, поэтому, ИМХО, лучше собирать вывод софтово.
---
Если софтово - пример на делпхи, жрёт stdout и stderr.
Пример рассчитан на запуск винрара, поэтому парсить надо внутри while.
function GetDosOutput(const CmdLine:string;Params:String):string;overload; 
var 
  SA: TSecurityAttributes; 
  SI: TStartupInfo; 
  PI: TProcessInformation; 
  StdOutPipeRead, StdOutPipeWrite: THandle; 
  WasOK: Boolean;
  Buffer: array[0..255] of Char;
  BytesRead: Cardinal; 
  WorkDir, Line: String; 
begin 
  with SA do 
  begin 
    nLength := SizeOf(SA); 
    bInheritHandle := True; 
    lpSecurityDescriptor := nil; 
  end; 
  // создаём пайп для перенаправления стандартного вывода 
  CreatePipe(StdOutPipeRead,  // дескриптор чтения 
             StdOutPipeWrite, // дескриптор записи 
             @SA,              // аттрибуты безопасности 
             0                // количество байт принятых для пайпа - 0 по умолчанию 
             );

    // Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода, 
    // а так же проверяем, чтобы он не показывался на экране. 
    with SI do 
    begin 
      FillChar(SI, SizeOf(SI), 0); 
      cb := SizeOf(SI); 
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; 
      wShowWindow := SW_HIDE; 
      hStdInput := GetStdHandle(STD_INPUT_HANDLE); // стандартный ввод не перенаправляем 
      hStdOutput := StdOutPipeWrite; 
      hStdError := StdOutPipeWrite; 
    end; 

    // Запускаем компилятор из командной строки
    WorkDir := ProcessPath(CmdLine,PPPT_PARENTDIR);
    WasOK := CreateProcess(PChar(CmdLine),PChar(Params) ,nil, nil, True, 0, nil, PChar(WorkDir), SI, PI); 

    // Теперь, когда дескриптор получен, для безопасности закрываем запись. 
    // Нам не нужно, чтобы произошло случайное чтение или запись. 
    CloseHandle(StdOutPipeWrite);  
    // если процесс может быть создан, то дескриптор, это его вывод 
    if WasOK then
        // получаем весь вывод до тех пор, пока DOS-приложение не будет завершено 
        Line := ''; 
        repeat 
          // читаем блок символов (могут содержать возвраты каретки и переводы строки) 
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil); 

          // есть ли что-нибудь ещё для чтения? 
          if BytesRead > 0 then 
          begin 
            // завершаем буфер PChar-ом 
            Buffer[BytesRead] := #0; 
            // добавляем буфер в общий вывод 
            Line := Line + Buffer; 
          end; 
        until not WasOK or (BytesRead = 0); 
        // ждём, пока завершится консольное приложение 
        WaitForSingleObject(PI.hProcess, INFINITE); 
        // Закрываем все оставшиеся дескрипторы 
        CloseHandle(PI.hThread); 
        CloseHandle(PI.hProcess); 
      result:=Line;
      CloseHandle(StdOutPipeRead);
end; 

---
<programming>
Сграбить текстовый поток из ДОС-окна. 07.09.12 05:32  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
Иемеем сервак, подключенный к приемнику. С него вДОС-окно валится непрерывный поток сообщений (текст). Это окно через удаленный стол открыто на другом компе.

Задача:
Сграбить поток из этого окна и наладить его непрерывный парсинг, накопление и анализ. Чем?
MSDN, всё чётко описано 07.09.12 11:30  
Автор: kstati <Евгений Борисов> Статус: Elderman
<"чистая" ссылка>


Creating a Child Process with Redirected Input and Output
Запустить в телнете/ssh? Перенаправить вывод на smb-ресурс? Или внутри софтины (через пайп)? 07.09.12 11:17  
Автор: Ustin <Ustin> Статус: Elderman
Отредактировано 07.09.12 12:19  Количество правок: 6
<"чистая" ссылка>
up: на сервере: unxutils, cmd /c soft.exe >> \\srv\share\1.out
на клиенте: unxutils, tail -f \\srv\share\1.out |grep...
но 1.out сильно распухнет, поэтому, ИМХО, лучше собирать вывод софтово.
---
Если софтово - пример на делпхи, жрёт stdout и stderr.
Пример рассчитан на запуск винрара, поэтому парсить надо внутри while.
function GetDosOutput(const CmdLine:string;Params:String):string;overload; 
var 
  SA: TSecurityAttributes; 
  SI: TStartupInfo; 
  PI: TProcessInformation; 
  StdOutPipeRead, StdOutPipeWrite: THandle; 
  WasOK: Boolean;
  Buffer: array[0..255] of Char;
  BytesRead: Cardinal; 
  WorkDir, Line: String; 
begin 
  with SA do 
  begin 
    nLength := SizeOf(SA); 
    bInheritHandle := True; 
    lpSecurityDescriptor := nil; 
  end; 
  // создаём пайп для перенаправления стандартного вывода 
  CreatePipe(StdOutPipeRead,  // дескриптор чтения 
             StdOutPipeWrite, // дескриптор записи 
             @SA,              // аттрибуты безопасности 
             0                // количество байт принятых для пайпа - 0 по умолчанию 
             );

    // Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода, 
    // а так же проверяем, чтобы он не показывался на экране. 
    with SI do 
    begin 
      FillChar(SI, SizeOf(SI), 0); 
      cb := SizeOf(SI); 
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; 
      wShowWindow := SW_HIDE; 
      hStdInput := GetStdHandle(STD_INPUT_HANDLE); // стандартный ввод не перенаправляем 
      hStdOutput := StdOutPipeWrite; 
      hStdError := StdOutPipeWrite; 
    end; 

    // Запускаем компилятор из командной строки
    WorkDir := ProcessPath(CmdLine,PPPT_PARENTDIR);
    WasOK := CreateProcess(PChar(CmdLine),PChar(Params) ,nil, nil, True, 0, nil, PChar(WorkDir), SI, PI); 

    // Теперь, когда дескриптор получен, для безопасности закрываем запись. 
    // Нам не нужно, чтобы произошло случайное чтение или запись. 
    CloseHandle(StdOutPipeWrite);  
    // если процесс может быть создан, то дескриптор, это его вывод 
    if WasOK then
        // получаем весь вывод до тех пор, пока DOS-приложение не будет завершено 
        Line := ''; 
        repeat 
          // читаем блок символов (могут содержать возвраты каретки и переводы строки) 
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil); 

          // есть ли что-нибудь ещё для чтения? 
          if BytesRead > 0 then 
          begin 
            // завершаем буфер PChar-ом 
            Buffer[BytesRead] := #0; 
            // добавляем буфер в общий вывод 
            Line := Line + Buffer; 
          end; 
        until not WasOK or (BytesRead = 0); 
        // ждём, пока завершится консольное приложение 
        WaitForSingleObject(PI.hProcess, INFINITE); 
        // Закрываем все оставшиеся дескрипторы 
        CloseHandle(PI.hThread); 
        CloseHandle(PI.hProcess); 
      result:=Line;
      CloseHandle(StdOutPipeRead);
end; 

---
Редирект консольного вывода в сеть? 07.09.12 09:39  
Автор: HandleX <Александр Майборода> Статус: The Elderman
Отредактировано 07.09.12 09:41  Количество правок: 3
<"чистая" ссылка>
> Имеем сервак, подключенный к приемнику. С него вДОС-окно
> валится непрерывный поток сообщений (текст). Это окно через
> удаленный стол открыто на другом компе.
"ДОС окно" это насколько я понимаю консольное приложение, которое выводит в stdout?

> Задача:
> Сграбить поток из этого окна и наладить его непрерывный
> парсинг, накопление и анализ. Чем?
Заредиректить stdout через cmd'шный pipe, например cmd receiver.exe | nc -vv -l -p 8080
nc (netcat) взять где-нить виндовозный порт, в интернетах полно.

Потом дёргаешь с того хоста с порта 8080 вывод той проги.
Пичалька будет, если программа не гонит вывод в stdout, а занимается фигнёй и сама рисует на экране консольными функциями вывода.
В крайнем случае -- копать исходники ConEmu, оно умеет... 08.09.12 01:57  
Автор: _AMMOnium_ Статус: Незарегистрированный пользователь
<"чистая" ссылка>
В крайнем случае -- копать исходники ConEmu, оно умеет читать почти любые консоли.
Редирект, ИМХО, должен быть, но хозяева на сервер не пускают 08.09.12 05:09  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
прогу остановить и пререзапустить нельзя.

Написать прогу, грабящую текст из окна для меня не проблема, но не договорившись с шефом о цене ничегописать я не хочу. Потому спрашиваю, нет ли готовой грабилки, способной перехватить вывод в окно и перенаправить его в файл/ввод другой проги. Дело в том, что мне сначала надо парсер текста и аниматор ГИС прикинуть.
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2019 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach