本文總結 Linux 病毒原型代碼,介紹 ELF 感染器原理與病毒傳播流程,需具備 ELF 格式、C/匯編混合閱讀、病毒基本原理知識。
參考 Silvio Cesare《UNIX ELF PARASITES AND VIRUS》演算法:
1. ELF 頭 p_shoff 增加 PAGE_SIZE。
2. 修補寄生代碼跳轉至原入口。
3. 定位文本段程序頭。
4. 修改 ELF 入口指向新代碼(p_vaddr + p_filesz)。
5. 增加 p_filesz、p_memsz 容納寄生代碼。
6. 後續段 p_offset 增加 PAGE_SIZE。
7. 文本段最後節區 sh_len 增加寄生代碼長度。
8. 後續節區 sh_offset 增加 PAGE_SIZE。
9. 物理插入新代碼並填充至 PAGE_SIZE。
原型使用的 g-elf-infector 依此原理編寫,源碼見附錄。僅用於製作首個帶毒文件,與病毒本體分離。使用需定義三項:返回地址偏移、寄生代碼函數、結尾函數(防編譯器重排序)。
定位文本段,將病毒代碼接在尾部,調整段/節虛擬地址,建立 section 關聯防 strip 移除,注意對齊(p_align)。修改 ELF 頭入口地址指向病毒代碼:
org_entry = ehdr->e_entry;
ehdr->e_entry = phdr[txt_index].p_vaddr + phdr[txt_index].p_filesz;
採用 PUSH + RET 組合:
__asm__ volatile (
"return:\n\t"
"push $0xAABBCCDD\n\t" /* push ret_addr */
"ret\n"
);
其中 0xAABBCCDD 存放真實程序入口,感染時由感染程序填寫。