Prob mit Ausgabe auf anderen PC

Hi!
Habe ein Programm geschrieben das auf einen Port hört. (Serveranwendung)
Wenn ich mich jetzt mit dem Programm verbinde, soll es eine Shell starten und die Ausgabe auf den Clienten umleiten. Soll praktisch wie telnet funzen. Wenn man jetzt befehle eingibt soll es diese ausführen und die Ausgabe zum Clienten leiten.

PS: Das ganze ist ein Windowsprogramm ;)

thx im voraus..

seiko_jr
 
Ist zufälligerweise das >hier< gemeint?
Also du verbindest dich zum Port und du krigst die DOS-Box auf dem entfernten Rechner und kannst da Remote Befehle eingeben wie DIR und die werden dir dann angezeigt und der andere führt sie aus?
Das geht mit zwei Pipelines und CreateProcess, ich habe auch sowas geproggt, nur bei mir funzt das net unter 98 und Befehle wie "edit" oder "ftp", die interaktiv ein neuen Bildschirm erstellen, werden nicht auf dem Bildschirm angezeigt und STRG+C ist wirkungslos ... :(
 
@jesuz: ich code in c++ unter windows

@slude: hab mir dein prog gedownt. genau sowas mein ich... :)
kannst du mir genauer erklären wie sowas geht,
oder ne addy geben wo es erklärt wird?
 
Das ist nicht einfach so zu erklären. Ich habe mir diese Funktionen für die Remote-Shell mit viel Mühe selber zusammen- und umgeflickt und kann dir pauschal leider keine URL sagen, wo das drinsteht.
Grob geht es mit zwei Pipelines, eine für die Eingabe und eine für die Ausgabe, und da könntest du mal es mit Google probieren mit den Stichwörtern Pipeline, CreatePipe, Demo, Source ... probieren. Ich hatte da mal was gefunden aber das war lange her.

Ich kann dir den Code geben, der "nur" zu 25% fertig ist - ist nämlich das stadium, bevor ich den Codeabschnitt in meinem "Zweitausendzeiler"-DLL eingeflickt habe.

Code:
procedure Test;
var buf:array[0..1023]of byte;
    si:STARTUPINFO;
    sa:SECURITY_ATTRIBUTES;
    sd:SECURITY_DESCRIPTOR;
    pi:PROCESS_INFORMATION;
    newstdin,newstdout,read_stdout,write_stdin:THandle;

    exit_:cardinal;
    bread:cardinal;
    avail:cardinal;

    tmp:integer;s:string;
begin
  if Win32Platform=VER_PLATFORM_WIN32_NT then begin
    InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(@sd,true,nil,false);
    sa.lpSecurityDescriptor:=@sd;
  end else sa.lpSecurityDescriptor:=nil;
  sa.nLength:=sizeof(SECURITY_ATTRIBUTES);
  sa.bInheritHandle:=true;
  if not CreatePipe(newstdin,write_stdin,@sa,0)then exit;
  if not CreatePipe(read_stdout,newstdout,@sa,0)then begin
    CloseHandle(newstdin);CloseHandle(write_stdin);
    exit;
  end;
  GetStartupInfo(si);
  si.dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
  si.wShowWindow:=SW_HIDE;
  si.hStdOutput:=newstdout;
  si.hStdError:=newstdout;
  si.hStdInput:=newstdin;
  if not CreateProcess('c:\\winnt\\system32\\cmd.exe',nil,nil,nil,true,
   CREATE_NEW_CONSOLE,nil,nil,si,pi)then begin
    CloseHandle(newstdin);CloseHandle(newstdout);
    CloseHandle(read_stdout);CloseHandle(write_stdin);
    exit;
  end;
  ReadFile(read_stdout,buf,1023,bread,nil);
  for tmp:=0to 214738do begin
    GetExitCodeProcess(pi.hProcess,exit_);
    if not (exit_=STILL_ACTIVE) then break;
    PeekNamedPipe(read_stdout,@buf[0],1023,@bread,@avail,nil);
    if (bread<>0) then begin
      ZeroMemory(@buf[0],length(buf));
      if (avail > 1023) then begin
        while (bread >= 1023) do begin
          ReadFile(read_stdout,buf,1023,bread,nil);
          Form1.Memo1.Text:=Form1.Memo1.Text+Strpas(@buf[0]);
          ZeroMemory(@buf[0],length(buf));
        end;
      end else begin
        ReadFile(read_stdout,buf,1023,bread,nil);
        Form1.Memo1.Text:=Form1.Memo1.Text+StrPas(@buf[0]);
        ZeroMemory(@buf[0],length(buf));
      end;
    end;
    s:=Form1.Label1.Caption;
    if s<>''then begin
      WriteFile(write_stdin,s[1],length(s),bread,nil);
      Form1.Label1.Caption:='';
    end;
    Application.ProcessMessages;
  end;
  TerminateProcess(pi.hProcess,0);
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
  CloseHandle(newstdin);            //clean stuff up
  CloseHandle(newstdout);
  CloseHandle(read_stdout);
  CloseHandle(write_stdin);
end;
Form1.Memo1 ist Ausgabe und Form1.Label1 ist welcher Befehl ausgeführt werden soll - der wird dann wenn beim Edit-Feld "Enter" gedrückt wird via Label1.Caption:=Edit1.Text eingespeist. Allerdings den Text zügig eingeben, da nur for x =0 to 214748 ...
 
Zurück
Oben