网络安全 频道

智能化防杀未知电脑病毒探讨

    一,概论。
    病毒随着网络的普及对于个人用户来说会是越来越大的危害。金州感觉病毒的危害主要在于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


等等。

0
相关文章