一, 概论。
二, 病毒的基本结构
三, 关于智能化的探讨
四, 智能化的实现
五, 感谢及参考文献
一概论。
病毒随着网络的普及对于个人用户来说会是越来越大的危害。金州感觉病毒的危害主要在于1.它对系统的危害。一些开机型病毒,导致系统无法启动。一些文件型病毒导致系统性能下降等等。2.它对文件数据的危害。一些病毒发作时会删除文件资料数据。(金州注释:个人感觉文件资料才是硬盘最宝贵的东西。)对于众多的大众用户来说,最直接的防治病毒的办法就是使用杀毒软件。当今的各种杀毒软件一般对病毒判断的核心都是依靠病毒码扫描的办法。这种方法的优点是判断准确,很少出现误判之类的,查杀迅速。(金州注释:查杀病毒最大的问题一直是发现它。)最大的缺点是,从病毒样本提取出来特征码的前提必须是已经捕获了病毒。用一种不恰当的说法来说,这很像是亡羊补牢。由于杀毒软件公司的捕获系统先进和奖励众多的用户提供病毒样本,在一定程度上来说,产生了一个相对的时间差。使杀毒软件对大众用户起到了一定的保护作用。但是随着网络的日益发展,病毒编程技术的日益进步,(金州注释,反病毒技术从另外一个角度来说也是对病毒技术的利用。)尤其是传播速度和变异的发展。两三年之前,谢正瑜,吴宗杉,杨俊杰就联合提出了《利用遗传基因演算法所建构之电脑病毒运作模式》的设想,这种方法虽然限于病毒体积的大小和一些技术限制,至今仍未发现被普遍深入应用,但是三位先生的具有可实施性的设想已经足以打破依靠特征码为核心的样本病毒查杀技术。在此之后,各大杀毒厂商均在智能性查杀病毒上投注较大精力。但是至今的查杀病毒的核心仍然未能实现智能化,仍然是依靠病毒特征码和样本库为核心。从一种角度来说,这也许是对用户负责的态度。本文将尽量全面的尽金州所知,来进行关于智能化防杀病毒的探讨。并尽量详尽列举被认为危害较大的病毒代码进行相对的比较分析。(金州注释,以下探讨植根于32位windows平台。另,由于一些珍贵的资料无法获得。可能一些探讨显得不是很彻底。惭愧。)
二,病毒的基本结构。
此处所谈的病毒的结构不是说的网上常见的理论性的那种结构。关于常识性的病毒的结构的论断网上资料很多,在此不论述。此处所说的是为智能化防杀病毒作为基础的病毒的结构。
对病毒的拦截金觉得主要应该在病毒的启动之时。以下对病毒结构的分析着重这一点。
我们知道所谓病毒这种非法的恶意程序,一定要把自己的主体植入内存。即在受害体的电脑上运行。任何程序在不运行的时候都失去自己存在的意义。电脑病毒必须运行才能产生病毒的危害。(金州注释,此处所说的运行指的是在受害体电脑中的运行,而不是指的是从网络和其他外界方式植入受害体电脑的过程。所以谈论的不涉及捆绑,诱骗,社会工程等过程。)病毒运行的方式有很多种。每一种都必须要写入内存,以下简单列出一些常见的病毒运行方式。(金州注释,仅供参考不一定全面。)
1.直接运行进程。
此处说的指的是运行的时候创建文件的过程。即运行时候产生的结果。主要是指的是对CreateFile(),OpenFile(),GetFile()等函数的调用。很多病毒都会运用这些函数读写文件。简单举例。
I LOVE YOU病毒中,
Set c = fso.GetFile(WScript.ScriptFullName)
c.Copy(dirsystem&"\MSKernel32.vbs")
c.Copy(dirwin&"\Win32DLL.vbs")
c.Copy(dirsystem&"\LOVE-LETTER-FOR-YOU.TXT.vbs")
Mydoom病毒中,
HANDLE h = CreateFile(argv[1], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, 0,
OPEN_EXISTING, 0, 0);
if (h == INVALID_HANDLE_VALUE) {
printf("%s: cannot open \"%s\"\n", argv[0], argv[1]);
return;
}
if (GetFileSize(h,0) < 0x100) {
printf("%s: invalid size\n", argv[0]);
CloseHandle(h);
return;
}
DWORD dwPeOffs, dwRead, dwWritten;
SetFilePointer(h, 0x3C, 0, FILE_BEGIN);
ReadFile(h, &dwPeOffs, 4, &dwRead, 0);
2.写入注册表启动项目。
多数病毒利用RegCreateKey函数,新增加一个注册表的Value值。或者利用RegWriteKey函数写入修改值。使用RegOpenKey打开获取等等,总之是改变注册表以达到自己的目的。
如I LOVE YOU病毒的一节,
Dim num,downread
regcreate "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersio
n\Run\MSKernel32",dirsystem&"\MSKernel32.vbs"
regcreate "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersio
n\RunServices\Win32DLL",dirwin&"\Win32DLL.vbs"
downread=""
downread=regget("HKEY_CURRENT_USER\Software\Microsoft\Internet Explore
r\Download Directory")
这个病毒虽然很老了,但事实脚本病毒的典型。此病毒就是利用regcreatekey函数新增开机启动项目。在run和runsrvices 下新增value值。来达到运行病毒的目的。
如happy time 病毒,中
Dim R
On Error Resume Next
Set R = CreateObject("WScript.Shell")
R.RegWrite k, v
End Sub
Rw Ks & "Help\wallPaper", n3
Rw "HKEY_CURRENT_USER\Control Panel\desktop\wallPaper", n3
oeid = Rg("HKEY_CURRENT_USER\Identities\Default User ID")
oe = "HKEY_CURRENT_USER\Identities\" & oeid & "\Software\Microsoft\Outlook Express\5.0\Mail"
如mydoom病毒中:
for (i=0; i<2; i++)
if (RegOpenKeyEx((i == 0) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
tmp, 0, KEY_READ, &k) == 0) {
RegCloseKey(k);
return;
}
sync->first_run = 1;
for (i=0; i<2; i++)
if (RegCreateKeyEx((i == 0) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
tmp, 0, NULL, 0, KEY_WRITE, NULL, &k, &disp) == 0)
RegCloseKey(k);
}
void sync_startup(struct sync_t *sync)
{
HKEY k;
char regpath[128];
char valname[32];
/* "Software\\Microsoft\\Windows\\CurrentVersion\\Run" */
rot13(regpath, "Fbsgjner\\Zvpebfbsg\\Jvaqbjf\\PheeragIrefvba\\Eha");
rot13(valname, "GnfxZba"); /* "TaskMon" */
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, regpath, 0, KEY_WRITE, &k) != 0)
if (RegOpenKeyEx(HKEY_CURRENT_USER, regpath, 0, KEY_WRITE, &k) != 0)
return;
RegSetValueEx(k, valname, 0, REG_SZ, sync->sync_instpath, lstrlen(sync->sync_instpath)+1);
还有很多木马和恶意程序都会关联到注册表的启动已经修改注册表的相关一些项目。在此不一一列举。总之,这种方式一直被广泛地运用着。(金州注释:本文所说的病毒是广泛意义上的病毒。包括一切危害或潜在危害到用户的程序。)
3.注册为服务
大多调用、CreateService、OpenService、RegisterServiceCtrlHandler、SetServiceStatus、等等API的。一般代码如下类似,
//创建服务
SC_HANDLE hService = ::CreateService(
hSCM, szServiceName, szServiceName,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
szFilePath, NULL, NULL, _T(""), NULL, NULL);
if (hService == NULL)
{
::CloseServiceHandle(hSCM);
MessageBox(NULL, _T("Couldn't create service"), szServiceName, MB_OK);
return FALSE;
}
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
return TRUE;
}
在灰鸽子VIP1.2版本中:
begin
Svc := OpenService(Mgr, PChar(Peizhi.WinServerName), SERVICE_ALL_ACCESS);
Result := Svc <> 0;
if Result then
begin
QueryServiceConfig(Svc, nil, 0, Size);
Config := AllocMem(Size);
try
QueryServiceConfig(Svc, Config, Size, Size);
ServiceStartName := PQueryServiceConfig(Config)^.lpServiceStartName;
//MessageBox(0, PChar(Peizhi.WinServerName), SApplicationName, MB_ICONERROR);
if CompareText(ServiceStartName, 'LocalSystem') = 0 then
ServiceStartName := 'SYSTEM';
finally
Dispose(Config);
end;
CloseServiceHandle(Svc);
end;
CloseServiceHandle(Mgr);
end;
很多木马程序为了运行和获得系统权限,都需要或明或暗的添加服务。在win32系统中,添加服务必定要用到相关的api函数。病毒也是一种程序,金州觉得必然有迹可循。只要我们先把握住了它的方式。就像知道一个人走什么路一样,提前在路上就好截住他。
4.win32病毒。
对于win32病毒,常常需要用到GetProcAddress,WriteProcessMemory,CreateRemoteThread等等API,调用到kernel32.dll,user32.dll,wsock32.dll,advapi32等等。
MGF V1.3中,
push 0A5171D00h ;VirtualAlloc()的自定义编码
push ebp ;hKernel32
call _GetProcAddress ;先获取VirtualAlloc()的地址
or eax,eax
jz _ErrorExit
call dwCreateRemoteThread[ebx] ;在EXPLORER.EXE进程里建立远程线程
push dword ptr [ebp-8]
call dwCloseHandle[ebx]
szWriteProcessMemory dd 037A09978h
szCreateRemoteThread dd 004697753h
Win32.poly.ShowTime2中,
mov edi,[ebp]
add edi,hKernel32[ebx]
lea esi,[offset nGetProcAddress+ebx]
db "WriteProcessMemory",0
db "VirtualFree",0
db "VirtualFreeEx",0
等等。
尤其是CreateRemoteThread这个函数,此处赞同mgf大哥的看法,这个东西正常的程序几乎不会调用。win32病毒也会注册run等注册表键值。凡以上从写雷同的不再赘述。
5.一些蠕虫的常用引发模式。
传统的一些蠕虫长会去读outlook,同样改变注册表,找寻消息应用程序接口( MAPI)等。常常用到creatobject,getnamespace mapi.等等。搜索网络的常常会调用Socket函数,但是很难智能化判断这个函数的运用。因为很多正常程序有时候也会使用到。(金州注释:在此不再过多论述这一点,原因个人感觉有二,1.随着个人用户趋向winxp主流,服务器趋向win2003,winxp以上版本有DEP(Date Execution Prevention数据执行保护)默认保护常用的系统进程,使机器溢出型蠕虫执行起来难度增大,金州估计这也是近年大面积单机溢出蠕虫没有造成很大的危害的原因之一,2.智能化蠕虫已经实现,一些蠕虫已经能利用搜索引擎或网络程序本身找寻漏洞传播,如santy蠕虫,SQL Slammer,MySpace worm,最近est论坛上茄子宝简单测试小型的xssworm等等。这类蠕虫金州觉得以后会是一种趋势,而这类蠕虫的特点根据所要利用的对象不同改变较大。很难概念性的统述。以上个人感觉。不一定恰当。因为没有准备好。所以不在此多说)
三,关于智能化的探讨。
所谓智能化就像截住一个人一样,由以上金州的浅薄分析,大概可以看出病毒有一定的套路,虽然这个套路在不断的改变。并非羚羊挂角,无迹可循,还是模模糊糊有一些影像痕迹的。这些病毒的运行过程的痕迹,是防杀病毒智能化并非是海市蜃楼,无法企及。各大杀毒厂商关于智能化防杀病毒的研究也从未中断。以下分三点探讨这个问题。(金州注释:以下所有探讨只代表个人看法,多有不足,仅供参考。)
1.为什么需要智能化
金州觉得这个主要有两点,1,传统的防杀病毒的方式越来越显示出不足。依靠病毒样本库和特征码的杀毒方式,随着网络时代流通的加速。在截获病毒样本和病毒大面积发作之间的时间差越来越小,越来越难以防范日益传播迅速的病毒。早期的病毒产生比较慢,而近些年由于计算机知识普遍的提高,病毒产生的速度越来越快,数量也越来越大。特征码病毒库为核心的病毒防杀越来越显出不足之处。何况很多个人编制的病毒甚至不会被发现。而杀毒的根本意义在于保护用户个体的安全,而不仅在于维护整个网络安全。从一定角度来说,只要有一个安装杀毒的用户被感染了(此时样本还为被捕获),就是杀毒厂商的失败。2.智能化病毒随着电脑技术的发展会越来越先进,而传统的防杀病毒方式只是存在于完全被动的防御阶段。智能化病毒甚至能改变特征码逃过传统的防杀方式。
2.能不能实现智能化
当然能实现智能化,其实已经出现了很多这样的工具了。比如一些监控注册表和服务的软件,一些监测工具。例如System Safety Monitor,WinPatrol等此类的工具。防火墙监控外出进程等等都已经在运用了。
3.实现智能化的难点
智能化实现很大的一个难点是,对病毒的判定。虽然台湾的一些人写出了相关的论文(金州注释,会在参考文献中给出),并且在一些特定环境下实践成功。但是金州觉得他们这种实验并不具有完全性。1是试验的病毒对象极少。2.他们忽视了电脑这种东西用来并不全是为了整天杀毒玩的,电脑是用来工作或娱乐的。这个才是主体。一个电脑给杀毒软件的空间并不多。也不可能分给它极大的资源。
特征码防杀病毒的方法优点就是准确,速度快。而这恰恰是智能化防杀病毒的难点。从准确上来说,现在所谓的智能化防杀病毒的方法主要是拦截API来作为判断的依据。这样难免会出现正误判或负误判。(金州注释:即不是病毒却当作病毒了,是病毒却忽略了。)如果只是拦截(金州注释:目前很多软件能做到这些),把判断的权力交给使用者,这样判断的准确性又要依靠用户的知识能力决定。如果每个使用病毒防杀软件的用户都是专家,那还要防杀软件干什么?也就是说防杀软件必须判断并自主做出处理。来确认某一个程序是否是病毒。这个确定的准确性很难解决。目前一些所谓智能杀毒的软件都或多或少的存在一些这样的问题。
同样,因为是智能化监测。也就是面对的很可能是全新的病毒,即使判断出来了。那么如何清除呢?这一点对于依靠病毒库的防杀软件来说很简单。因为特定的病毒样本已经被实践过,直到他将会产生什么。而对于智能化的防杀软件来说,这只能依靠一种方式来实现,即完全监控电脑运作的一切行为,这是不可能的。如果这样,防杀软件很可能会占用极大的资源,而且会对用户造成诸多的不便。如果不这样,对彻底清除病毒来说,比较难弄。
也许正是因为以上的原因。现在一些病毒防杀软件声称智能化和传统的特征码方式相结合。甚至说这样就能杀掉百分之百的未知病毒。这样当然是不现实的。因为这样并为解决智能化防杀病毒的两大难题。判定和清除。这样也许只有一个好处。就是利用智能化判定为可疑程序,然后让用户提交到病毒库,分析之后,用依靠病毒库的防杀软件清除掉。谁都可以看出来,这样离智能化还很遥远。
四,智能化的实现
金州注释,注意,以下所谈的并不是说的智能化防杀病毒普及化的实现。而是试验性的实现。鉴于个人学识问题,以下简单谈两点。
1..监控注册表
修改注册表是很多病毒要走的甚至是必走的道路。现在已经有很多这样的监控软件,尤其是对注册表启动项目的监控。大概就两类,一类一旦发现修改是会自动报警 ,一类是只是被动显示。这样的软件更多。不论是哪一种,都可以起到作用。这类的软件只算是半个智能化,因为还需要人的判断,这样的监控软件并不能直接判断到底启动添加的是合法的还是非法的恶意程序。没有想到扯了这么长,就不给源代码。网上有参考。
2.拦截API。
这个是现在智能化防杀病毒软件的核心方向。其实拦截API已经包括了监控注册表了。之所以单独把监控注册表列出来是因为监控注册表现在已经有很多相关工具,对于半智能化来说,实现的相对比较完美了。关于拦截API。胡大雄等在《VIBEDS—一个利用病毒行为模式侦测电脑病毒的防毒系统》中列出了以下资料:
win32病毒与worm常使用的API
名称 用途说明
CreateFile 开启欲感染的档案
GetModuleHandle 获得档案模组的控制代码
GetProcAddress 获得API的进入点
VirtualQueryEx 查询/修改档案内存内容
WriteProcessMemory 将病毒代码写入欲感染档案的内存
RegCreateKeyEx 建立自动执行的键值
RegOpenKeyA()
RegCreatKeyA()
RegSetVslueA()
RegSetValueExA()
CopyFileA()
CopyFileExA()
connect 连接到网络
表二,邮件病毒常使用的API
名称 参数
CreateObject Scritping.FilesystemObject,
Shell.Applocaition,
Outlook.Application等。
Kill File&Directory
DeleteFile File
ReadReg HKEY_CURRENT_USER\Control Panel\Desktop\WallPaper 等。
RegWrite 参数同上
GetNamespace MAPI
Attached.Add Virus File
(金州注释,上面的文件表明显得不够全面了。主要是表明一个意思,即智能化监控是完全可以做到的。说的是监控。)
他们还提出并实践了一个可行性的智能化防治病毒的体系。金州仍略感不足。一是没有解决杀除病毒的方法。(金州注释,不过人家谈的就是侦测。)没有提出杀出而只提出侦测明显的这个系统是专家系统。不能普及到大众用户。二,他并未提供对未知病毒的侦测试验。换句话说,就是他利用已知病毒来检测智能化侦测系统的判断力。但是他提出了两点很宝贵的东西,一是完整的判断思路。二是指出了智能化即使实现以后。仍然需要升级,只不过升级的不是病毒库。二是对拦截API的判断库。这就是说杀毒厂商仍然不会改变自己的市场利益。反而这是他们的市场竞争力。最后,金个人感觉智能化的道路很难,就像智能化病毒的道路一样,很难。病毒和反病毒技术相互生存,就像战争一样,病毒在破坏的同时也产生了很多新的技术。反病毒软件从一种程度上来说也是一种病毒。州觉得最好是有一天,大众知识增长,增强了自己的判断力。那么半智能化辅助系统就足够了。半智能化就不需要升级了。最后的最后,折腾了半天,发现写了这么多好象等于什么都没说。所以把名字改成探讨了。生活比想象中的艰难,东西比想象中的难学。但是我们一直在努力生活,努力学习。
pdf:
http://www.eviloctal.com/blog/job.php?action-download-pid--tid-609-aid-288.html六, 感谢及参考文献。
感谢以下前辈无偿共享以下资料提供学习。
1. 许明阳 《利用拦截API侦测电脑病毒》
2. 胡大雄,邓全良,徐熊健《VIBEDS—一个利用病毒行为模式侦测电脑病毒的防毒系统》
3. 佚名 《先进的反病毒引擎设计》
4.
http://www.xfocus.net 感谢原因,无偿共享资料。
5.
http://forum.eviloctal.com/ 感谢原因,提供学习环境。
金州[est_vip]2006.8.29
附:
致歉及声明。
1.因金州二字被一些公司在搜索引擎买断,所以采用“金州注释”作为关键字。造成了偶然看到此文的读者阅读不便。表示歉意,见谅。见谅。
2.个人学习中写的稚嫩文字中,多署名est_vip,其实就是est论坛的一个普通会员,现在est已经没有这个称呼了。est是第一个信任我的论坛,那个时候还有vip这个称呼。人最好不要忘本。所以只如此署名。即使有一天est不存在了。(只怕是丢了est得人。惭愧。)后来承蒙一些朋友信任。参与过一些不错的论坛。而从未在自己文字中提及感谢,感觉十分对不住。所有对我略有帮助的人,我从未忘记。真诚感谢,GCT.冰封浪子,juey(黑域在线),EST.Fr.Qaker&Sunwear,CRST.冷漠,WST.maple-x,cciss.7all.等。祝福你们好人有好命。祝福所有善良的人。
3.感激所有前辈们无私共享的学习资源。坚持弘扬无偿共享精神。