AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi shell in einem thread starten, schlägt fehl
Thema durchsuchen
Ansicht
Themen-Optionen

shell in einem thread starten, schlägt fehl

Ein Thema von TheGame1492 · begonnen am 28. Nov 2007 · letzter Beitrag vom 29. Nov 2007
Antwort Antwort
Benutzerbild von TheGame1492
TheGame1492

Registriert seit: 31. Jul 2004
Ort: Berlin
84 Beiträge
 
Delphi XE2 Professional
 
#1

shell in einem thread starten, schlägt fehl

  Alt 28. Nov 2007, 18:44
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 = 'quitthen
      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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 28. Nov 2007, 19:12
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


[add]
... := 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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#3

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

  Alt 29. Nov 2007, 07:16
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.
Peter Schaible
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#4

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

  Alt 29. Nov 2007, 07:19
oh und noch etwas ...
Zitat:
dispose(hSocket);
Wo hast du den Speicherbereich eigentlich reserviert den du mit dispose freigeben möchtest ?
Peter Schaible
  Mit Zitat antworten Zitat
Benutzerbild von TheGame1492
TheGame1492

Registriert seit: 31. Jul 2004
Ort: Berlin
84 Beiträge
 
Delphi XE2 Professional
 
#5

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

  Alt 29. Nov 2007, 20:16
ok thx habs nun hinbekommen


war nur das prob mit diesem PInteger
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

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

  Alt 29. Nov 2007, 22:32

Das dürfte nicht das einzige Problem gewesen sein.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von TheGame1492
TheGame1492

Registriert seit: 31. Jul 2004
Ort: Berlin
84 Beiträge
 
Delphi XE2 Professional
 
#7

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

  Alt 29. Nov 2007, 23:07
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 = 'quitthen
      close := true
    else if str ='killshellthen
    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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 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