Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi shell in einem thread starten, schlägt fehl (https://www.delphipraxis.net/104178-shell-einem-thread-starten-schlaegt-fehl.html)

TheGame1492 28. Nov 2007 17:44


shell in einem thread starten, schlägt fehl
 
Hoi, Ich versuche in einem Thread eine Shell zu erzeugen.

Delphi-Quellcode:

program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, Winsock;

var
  shellThreadID: DWORD;
  str: string;
  close: boolean;

procedure CreateShell;
var
   hSocket: PInteger;
   si: TStartupInfo;
   pi: TProcessInformation;

begin
   hSocket := PInteger(99);
   ZeroMemory(@si, SizeOf(si));
   si.cb := SizeOf(si);
   si.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
   si.wShowWindow := SW_HIDE;
   si.hStdInput := hSocket^;
   si.hStdOutput := hSocket^;
   si.hStdError := hSocket^;
   CreateProcess(nil, '', nil, nil, true, CREATE_NEW_CONSOLE, nil, nil, si, pi);
   WaitForSingleObject(pi.hProcess, INFINITE);
   CloseHandle(pi.hProcess);
   CloseHandle(pi.hThread);
   Shutdown(hSocket^, SD_BOTH);
   CloseSocket(hSocket^);
   Dispose(hSocket);
end;

begin
  shellThreadID := 1191;
  //CreateThread(nil, 0, @CreateShell, nil, 0, shellThreadID);


  //auf quit warten
  close := false;
  while close = false do
  begin
    sleep(100);
    ReadLn(str);
    if str = 'quit' then
      close := true;

  end;
end.
dort soll man denn via "telnet 127.0.0.1 99" eigentlich connecten können

nur schmiert das vorher ab mit einer Zugriffsverletzung.

Was könnte an dem Code falsch sein? ;)

himitsu 28. Nov 2007 18:12

Re: shell in einem thread starten, schlägt fehl
 
Erstens: Wo tritt der Fehler auf? (praktisch, wenn sowas mit erwähnt würde)
Ok, ich weiß schon Sleep, aber weißt du auch warum?

Wärend Sleep wird der erstellte Thread ausgeführt und dort schlägt der Aufruf von CreateProcess fehl (liegt bestimmt an deinen "komischen" Parametern).

Leg mal einen Haltepunkt auf den Beginn deiner Treadprozedur und schau was passiert.

Dann wäre es gut, wenn du deiner Threadprozdur richtig defnierst :!:
siehe MSDN > ThreadProc


zur StartupInfo (SI), was soll hSocket:=PInteger(99); darstellen?
hmm 127.0.0.1 99, aber ob das so richtig ist :gruebel:


[add]
Delphi-Quellcode:
... := hSocket^;
ist auch nicht soooo korrekt.

versuch doch für den Anfang erstmal einen direkten Aufruf, dann läßt es sich leicher Debuggen
und plötlich fällt och der hSocket^-Fehler auf.
Delphi-Quellcode:
function CreateShell(lpParameter: LongWord): LongWord; StdCall;
var...

begin
  ...
end;


begin
  //CreateThread(nil, 0, @CreateShell, nil, 0, shellThreadID);
  CreateShell(0);

  //auf quit warten
  repeat
    //sleep(100);
    ReadLn(str);
  until str = 'quit';
end.

peschai 29. Nov 2007 06:16

Re: shell in einem thread starten, schlägt fehl
 
Hallo
Zitat:

hSocket := PInteger(99);
hSocket ist bei dir ein Zeiger und dem weist du die ADRESSE 99 zu. Dabei sollte es unerheblich sein, daß es ein Zeiger auf einen Integer ist. Zeiger ist Zeiger!
Bei
Zitat:

... hSocket^
macht es dann vermutlich Bumm, dau die die Adresse 99 dereferenzieren möchtest und die liegt in enem absolut gesperrten Bereich des Betriebssystem.

peschai 29. Nov 2007 06:19

Re: shell in einem thread starten, schlägt fehl
 
oh und noch etwas ...
Zitat:

dispose(hSocket);
Wo hast du den Speicherbereich eigentlich reserviert den du mit dispose freigeben möchtest ?

TheGame1492 29. Nov 2007 19:16

Re: shell in einem thread starten, schlägt fehl
 
ok thx habs nun hinbekommen ;)


war nur das prob mit diesem PInteger

sirius 29. Nov 2007 21:32

Re: shell in einem thread starten, schlägt fehl
 
:gruebel:
Das dürfte nicht das einzige Problem gewesen sein.

TheGame1492 29. Nov 2007 22:07

Re: shell in einem thread starten, schlägt fehl
 
joa da hatte noch bissl was gefehlt ;)

Delphi-Quellcode:

var
 WSAData: TWSAData;
 FDSet: TFDSet;
 SockAddrIn: TSockAddrIn;
 serverSocket: TSocket;
 Connected: PInteger;
 ThreadID: Cardinal;
 cmdLine: Array [0..MAX_PATH] of Char;
 shellPort: integer;
 shellThreadID: DWORD;
 str: string;
 close: boolean;
 hSocket: pinteger;


function ShellThread(parameter: pointer): integer;
var

   si: TStartupInfo;
   pi: TProcessInformation;
begin
   hSocket := parameter;
   ZeroMemory(@si, SizeOf(si));
   si.cb := SizeOf(si);
   si.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
   si.wShowWindow := SW_HIDE;
   si.hStdInput := hSocket^;
   si.hStdOutput := hSocket^;
   si.hStdError := hSocket^;
   CreateProcess(nil, cmdLine, nil, nil, true, CREATE_NEW_CONSOLE, nil, nil, si, pi);
   WaitForSingleObject(pi.hProcess, INFINITE);
   CloseHandle(pi.hProcess);
   CloseHandle(pi.hThread);
   Shutdown(hSocket^, SD_BOTH);
   CloseSocket(hSocket^);
   Dispose(hSocket);
   Result := 0;
end;


function CreateShell( parameter: pointer): integer; StdCall;
begin
  WSAStartUp(MakeWord(1, 1), WSAData);
  ServerSocket := WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, nil, 0, 0);
  SockAddrIn.sin_family := AF_INET;
  SockAddrIn.sin_addr.s_addr := INADDR_ANY;

  SockAddrIn.sin_port := htons(shellport);
  Bind(ServerSocket, SockAddrIn, SizeOf(SockAddrIn));
  Listen(ServerSocket, 1);
  GetEnvironmentVariable('Comspec', cmdLine, MAX_PATH);
  while True do
   begin
     FD_Zero(FDSet);
     FD_Set(ServerSocket, FDSet);
     Select(0, @FDSet, nil, nil, nil);
     if FD_IsSet(ServerSocket, FDSet) then
     begin
       New(Connected);
       Connected^ := Accept(ServerSocket, nil, nil);
       if Connected^ <> SOCKET_ERROR then
         BeginThread(nil, 0, ShellThread, Connected, 0, ThreadID)
       else
         Break;
      end;
    end;
  WSACleanup;
end;

begin
  shellThreadID := 1234
  shellPort := 123;

  CreateThread(nil, 0, @CreateShell, nil, 0, shellThreadID);

  close := false;
  while close = false do
  begin
    ReadLn(str);
    if str = 'quit' then
      close := true
    else if str ='killshell' then
    begin
      TerminateThread(ThreadID, 0);
      TerminateThread(shellThreadID, 0);
      TerminateProcess(ThreadID, 0);
      TerminateProcess(shellThreadID, 0);
      Shutdown(hSocket^, SD_BOTH);
      CloseSocket(hSocket^);
      Dispose(hSocket);
    end;
  end;

die killshell methode is nen bissl unkonventionell glaub ich, weil das ganze prog dadurch mit gekillt wird ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz