MailSlots - будущее
троянологии
MailSlots - будущее троянологии.
Привет мой друг. Ты пишешь трояны? Используешь сокеты?
Думаешь как максимально скрыть свое присутствие? Если ответ да, то эта
статья для тебя.
В ней я расскажу про альтернативный способ передачи данных, а именно
MailSlots.
Эта система реализована с ранних версий Win и работает безупречно.
Причем практически не возможно определить передачу данных - только,
если снифить всю систему( Ни какие порты не открываются, соединения
не висят).
Сейчас немного практики. Для простоты понимания опишу все на Delphi.
Обмен текстовыми данными в локальной сети очень прост.
Для этого необходимы функции:
CreateMailslot - создание почтового канала;
GetMailslotInfo - определение наличия сообщения в канале;
ReadFile - чтение сообщения из канала, как из файла;
WriteFile - запись сообщения в канал, как в файл;
Все и так понятно, но на всякий случай напишу примеры.
Рассмотрим создание почтового канала (сервер).
h := CreateMailSlot(PChar('.mailslot' + MailSlotName),
0, MAILSLOT_WAIT_FOREVER,nil);
if h = INVALID_HANDLE_VALUE then
begin
raise Exception.Create('MailSlotServer: Ошибка создания канала !');
Отправка сообщений по почтовому каналу (клиенты).
if not GetMailSlotInfo(h,nil,DWORD(MsgNext),@MsgNumber,nil)
then
begin
raise Exception.Create('TglMailSlotServer: Ошибка сбора информации!');
end;
if MsgNext MAILSLOT_NO_MESSAGE then
begin
beep;
if ReadFile(h,str,200,DWORD(read),nil) then
MessageText := str
else
raise Exception.Create('TglMailSlotServer: Ошибка чтения сообщения !');
end;
Вот так просто мы можем скрыть передачу данных в сети.
Если кому интересно, то вот вам готовый компонент для работы с MailSlots,
написанный Чудиным А.В.
{
Globus Delphi VCL Extensions Library
' GLOBUS LIB '
Freeware
Copyright (c) 2000 Chudin A.V, FidoNet: 1246.1
gl3DCol Unit 05.2000 components TglMailSlotServer, TglMailSlotClient
}
unit glMSlots;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, extctrls;
type
TOnNewMessage = procedure (Sender: TObject; MessageText: string) of
object;
TglMailSlotServer = class(TComponent)
private
FMailSlotName, FLastMessage: string;
FOnNewMessage: TOnNewMessage;
Timer: TTimer;
h : THandle;
str : string[250];
MsgNumber,MsgNext,read : DWORD;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Open;
procedure Close;
protected
procedure Loaded; override;
procedure OnTimer(Sender: TObject);
published
property MailSlotName: string read FMailSlotName write FMailSlotName;
property OnNewMessage: TOnNewMessage read FOnNewMessage
write FOnNewMessage;
end;
TglMailSlotClient = class(TComponent)
private
FMailSlotName, FServerName, FLastMessage: string;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function Send(str: string):boolean;
protected
procedure Loaded; override;
procedure ErrorCatch(Sender : TObject; Exc : Exception);
published
property ServerName: string read FServerName write FServerName;
property MailSlotName: string read FMailSlotName write FMailSlotName;
end;
procedure register;
implementation
procedure register;
begin
RegisterComponents('Gl Components', [TglMailSlotServer, TglMailSlotClient]);
end;
constructor TglMailSlotServer.Create(AOwner: TComponent);
begin
inherited;
FEnabled := true;
FMailSlotName := 'MailSlot';
Timer := TTimer.Create(nil);
Timer.Enabled := false;
Timer.OnTimer := OnTimer;
end;
destructor TglMailSlotServer.Destroy;
begin
Timer.Free;
Close;
inherited;
end;
procedure TglMailSlotServer.Loaded;
begin
inherited;
Open;
end;
procedure TglMailSlotServer.Open;
begin
h := CreateMailSlot(PChar('.mailslot' + MailSlotName),
0, MAILSLOT_WAIT_FOREVER,nil);
if h = INVALID_HANDLE_VALUE then
raise Exception.Create('TglMailSlotServer: Ошибка создания канала !');
Timer.Enabled := true;
end;
procedure TglMailSlotServer.Close;
begin
if h 0 then
CloseHandle(h);
h := 0;
end;
procedure TglMailSlotServer.OnTimer(Sender: TObject);
var
MessageText: string;
begin
MessageText := '';
if not GetMailSlotInfo(h,nil,DWORD(MsgNext),@MsgNumber,nil)
then
raise Exception.Create('TglMailSlotServer: Ошибка сбора информации!');
if MsgNext MAILSLOT_NO_MESSAGE then
begin
beep;
if ReadFile(h,str,200,DWORD(read),nil) then
MessageText := str
else
raise Exception.Create('TglMailSlotServer: Ошибка чтения сообщения !');
end;
if (MessageText'')and Assigned(OnNewMessage) then
OnNewMessage(self, MessageText);
FLastMessage := MessageText;
end;
constructor TglMailSlotClient.Create(AOwner: TComponent);
begin
inherited;
FMailSlotName := 'MailSlot';
FServerName := '';
end;
destructor TglMailSlotClient.Destroy;
begin
inherited;
end;
procedure TglMailSlotClient.Loaded;
begin
inherited;
Application.OnException := ErrorCatch;
end;
procedure TglMailSlotClient.ErrorCatch(Sender :
TObject; Exc : Exception);
var
UserName: array[0..99] of char;
i: integer;
begin
i:=SizeOf(UserName);
GetUserName(UserName,DWORD(i));
Send('/'+UserName+'/'+FormatDateTime ('hh:mm',Time)+'/'+Exc.message);
Application.ShowException(Exc);
end;
function TglMailSlotClient.Send(str: string):boolean;
var
strMess: string[250];
UserName: array[0..99] of char;
h: THandle;
i: integer;
begin
if FServerName = '' then
FServerName := '.';
h:=CreateFile( PChar('' + FServerName + 'mailslot' + FMailSlotName),
GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if h INVALID_HANDLE_VALUE then
begin
strMess := str;
WriteFile(h, strMess, Length(strMess) + 1,
DWORD(i), nil);
CloseHandle(h);
end;
Result := h INVALID_HANDLE_VALUE;
end;
end.
Компонент TglMailSlotServer создает почтовый
канал с именем MailSlotName и принимает входящие сообщения.
Компонент TglMailSlotClient отправляет сообщения в канал с именем MailSlotName
на машине ServerName.
Ну вот теперь точно все. удачи вам в написании троянов.
Если понадобиться помощь, то обращайтесь.
{---- madnet ---- mailto:dead3000@tut.by}
madnet
|