Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перенаправление ввода и вывода, Bind Shell 
:(
    Опции темы
Nobodyx
  Дата 26.3.2005, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.3.2005

Репутация: нет
Всего: нет



Намереваюсь сделать удалённую коммандную строку .(Bind Shell) Сама передача по сети не проблема(через winsock). Подскажите, пожалуйста, как организовать обмен данными с cmd.exe. Необходим не просто одиночный запуск cmd.exe с передачей параметров и получением вывода, а именно непрерывный обмен данными.
PM MAIL   Вверх
_hunter
Дата 28.3.2005, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



что ты подразумеваеш под непрерывным обменом? ибо передача ввода и получение вывода это и есть непрерывный обмен...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Snowy
Дата 28.3.2005, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Это возможно, но слишком проблематично.
Легче будет каждый раз вызывать ComSpec с ключем /C, чем эмулировать ему нажатие клавиш.
PM MAIL   Вверх
Гость_Ник
Дата 5.4.2005, 09:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Меня тоже интересует эта тема. Для того, чтобы было понятно, напишу на примере, что я хочу. Например запускаем telnet.exe, вводим open 127.0.0.1 80 (передача ввода) и получаем вывод с консоли (передача вывода). И так в интерактивном режиме. Нашел кое-что в базе знаний:
Код

Автор: Алексей Бойко 

Это пример запуска консольных программ с передачей ей консольного ввода (как если бы он был введен с клавиатуры после запуска программы) и чтением консольного вывода. Таким способом можно запускать например стандартный виндовый ftp.exe (в невидимом окне) и тем самым отказаться от использования специализированных, зачастую глючных компонент. 

function ExecuteFile(FileName,StdInput: string; 
                     TimeOut: integer; 
                     var StdOutput:string) : boolean; 

label Error; 

type 
  TPipeHandles = (IN_WRITE,  IN_READ, 
                  OUT_WRITE, OUT_READ, 
                  ERR_WRITE, ERR_READ); 

type 
  TPipeArray = array [TPipeHandles] of THandle; 

var 
  i         : integer; 
  ph        : TPipeHandles; 
  sa        : TSecurityAttributes; 
  Pipes     : TPipeArray; 
  StartInf  : TStartupInfo; 
  ProcInf   : TProcessInformation; 
  Buf       : array[0..1024] of byte; 
  TimeStart : TDateTime; 


function ReadOutput : string; 
var 
  i : integer; 
  s : string; 
  BytesRead : longint; 

begin 
  Result := ''; 
  repeat 

    Buf[0]:=26; 
    WriteFile(Pipes[OUT_WRITE],Buf,1,BytesRead,nil); 
    if ReadFile(Pipes[OUT_READ],Buf,1024,BytesRead,nil) then 
    begin 
      if BytesRead>0 then 
      begin 
        buf[BytesRead]:=0; 
        s := StrPas(@Buf[0]); 
        i := Pos(#26,s); 
        if i>0 then s := copy(s,1,i-1); 
        Result := Result + s; 
      end; 
    end; 

    if BytesRead1024 then break; 
  until false; 
end; 


begin 
  Result := false; 
  for ph := Low(TPipeHandles) to High(TPipeHandles) do 
    Pipes[ph] := INVALID_HANDLE_VALUE; 


  // Создаем пайпы 
  sa.nLength := sizeof(sa); 
  sa.bInheritHandle := TRUE; 
  sa.lpSecurityDescriptor := nil; 


  if not CreatePipe(Pipes[IN_READ],Pipes[IN_WRITE], @sa, 0 ) then 
    goto Error; 
  if not CreatePipe(Pipes[OUT_READ],Pipes[OUT_WRITE], @sa, 0 ) then 
    goto Error; 
  if not CreatePipe(Pipes[ERR_READ],Pipes[ERR_WRITE], @sa, 0 ) then 
    goto Error; 



  // Пишем StdIn 
  StrPCopy(@Buf[0],stdInput+^Z); 
  WriteFile(Pipes[IN_WRITE],Buf,Length(stdInput),i,nil); 


  // Хендл записи в StdIn надо закрыть - иначе выполняемая программа 
  // может не прочитать или прочитать не весь StdIn. 

  CloseHandle(Pipes[IN_WRITE]); 

  Pipes[IN_WRITE] := INVALID_HANDLE_VALUE; 


  FillChar(StartInf,sizeof(TStartupInfo),0); 
  StartInf.cb := sizeof(TStartupInfo); 
  StartInf.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; 


  StartInf.wShowWindow := SW_SHOW; // SW_HIDE если надо запустить невидимо 


  StartInf.hStdInput := Pipes[IN_READ]; 
  StartInf.hStdOutput := Pipes[OUT_WRITE]; 
  StartInf.hStdError := Pipes[ERR_WRITE]; 


  if not CreateProcess(nil, PChar(FileName), nil, 
                       nil, True, NORMAL_PRIORITY_CLASS, 
                       nil, nil, StartInf, ProcInf) then goto Error; 

  TimeStart := Now; 

  repeat 
    Application.ProcessMessages; 
    i := WaitForSingleObject(ProcInf.hProcess,100); 
    if i = WAIT_OBJECT_0 then break; 
    if (Now-TimeStart)*SecsPerDay>TimeOut then break; 
  until false; 


  if iWAIT_OBJECT_0 then goto Error; 
  StdOutput := ReadOutput; 

  for ph := Low(TPipeHandles) to High(TPipeHandles) do 
    if Pipes[ph]INVALID_HANDLE_VALUE then 
      CloseHandle(Pipes[ph]); 


  CloseHandle(ProcInf.hProcess); 
  CloseHandle(ProcInf.hThread); 
  Result := true; 
  Exit; 


Error: 

  if ProcInf.hProcessINVALID_HANDLE_VALUE then 

  begin 
    CloseHandle(ProcInf.hThread); 
    i := WaitForSingleObject(ProcInf.hProcess, 1000); 
    CloseHandle(ProcInf.hProcess); 
    if iWAIT_OBJECT_0 then 

    begin 
      ProcInf.hProcess := OpenProcess(PROCESS_TERMINATE, 
                                      FALSE, 
                                      ProcInf.dwProcessId); 

      if ProcInf.hProcess  0 then 
      begin 
        TerminateProcess(ProcInf.hProcess, 0); 
        CloseHandle(ProcInf.hProcess); 
      end; 
    end; 
  end; 

  for ph := Low(TPipeHandles) to High(TPipeHandles) do 
    if Pipes[ph]INVALID_HANDLE_VALUE then 
      CloseHandle(Pipes[ph]); 

end; 
Взято из http://forum.sources.ru 



Однако во-первых вылезает несколько ошибок (но я их поправил почти все, несколько ошибок типов и как мне кажется недописано кое-где =, например в " if ProcInf.hProcess 0 then ". Однако, что такое iWAIT_OBJECT_0 я так и не смог понять smile. Может кто скажет, в чем проблема или подкинет рабочий исходничек smile.
  Вверх
Nobodyx
Дата 7.4.2005, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.3.2005

Репутация: нет
Всего: нет



Cм.
http://forum.sources.ru/index.php?showtopic=89005

Это сообщение отредактировал(а) Nobodyx - 12.4.2005, 17:38
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0494 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.