首页
社区
课程
招聘
[转帖]杀毒软件的简单实现
发表于: 2005-6-10 23:34 8635

[转帖]杀毒软件的简单实现

2005-6-10 23:34
8635
*****************************************************
转自:赛冰河信息安全网
首页地址:http://blog.csdn.net/amh/
本人评价:一个很不错的BLOG
****************************************************
下面为原文:      

#include "FunDef.h"

int main (int argc, char *argv[])
{
     if (argc==1)
     {
          Usage(argv[0]);
          return 0;
     }

     if (!(ScanFileVXER(argv[1])))
     {
          printf("ScanFileVXER() GetLastError reports %d\n",erron);
          return 0;
     }

     if (!(ProcessVXER()))
     {
          printf("Processes() GetLastError reports %d\n",erron);
          return 0;
     }

     if (!(RegDelVXER()))
     {
          printf("RegDelVXER() GetLastError reports %d\n",erron);
          return 0;
     }

     return 0;
}

BOOL ScanFileVXER (char *FileName)
{
     int count=LOW;

     WIN32_FIND_DATA FindFileData;
     HANDLE hFind;
     BOOL returnvalue=FALSE;
     DWORD lpBufferLength=HIGH;
     char lpBuffer[HIGH]={LOW};
     char DirBuffer[MAX_PATH];

     long FileOffset=0x1784; //偏移地址
     int FileLength=0x77; //长度

     unsigned char Contents[]={
0x49, 0x20, 0x6A, 0x75, 0x73, 0x74, 0x20, 0x77, 0x61, 0x6E, 0x74, 0x20, 0x74, 0x6F, 0x20, 0x73,
0x61, 0x79, 0x20, 0x4C, 0x4F, 0x56, 0x45, 0x20, 0x59, 0x4F, 0x55, 0x20, 0x53, 0x41, 0x4E, 0x21,
0x21, 0x20, 0x62, 0x69, 0x6C, 0x6C, 0x79, 0x20, 0x67, 0x61, 0x74, 0x65, 0x73, 0x20, 0x77, 0x68,
0x79, 0x20, 0x64, 0x6F, 0x20, 0x79, 0x6F, 0x75, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x20, 0x74, 0x68,
0x69, 0x73, 0x20, 0x70, 0x6F, 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x20, 0x3F, 0x20, 0x53, 0x74,
0x6F, 0x70, 0x20, 0x6D, 0x61, 0x6B, 0x69, 0x6E, 0x67, 0x20, 0x6D, 0x6F, 0x6E, 0x65, 0x79, 0x20,
0x61, 0x6E, 0x64, 0x20, 0x66, 0x69, 0x78, 0x20, 0x79, 0x6F, 0x75, 0x72, 0x20, 0x73, 0x6F, 0x66,
0x74, 0x77, 0x61, 0x72, 0x65, 0x21, 0x21};
     //具体内容,十六进制

     //获取系统目录的完整路径
     if (GetSystemDirectory(DirBuffer,lpBufferLength)!=LOW)
     {
          if (SetCurrentDirectory(DirBuffer)!=LOW) //设置为当前目录
          {
               hFind=FindFirstFile(FileName,&FindFileData); //查找文件
               if (hFind==INVALID_HANDLE_VALUE)
               {
                    printf("FindFirstFile() GetLastError reports %d\n",erron);
                    FindClose(hFind);
                    return returnvalue;
               }
          else
          {
               count++;

               //获得文件的完整路径
               if (GetFullPathName          (FindFileData.cFileName,lpBufferLength,lpBuffer,NULL)!=LOW)
                    printf("FilePath:%s\n",lpBuffer);
               else
               {
                    printf("GetFullPathName() GetLastError reports %d\n",erron);
                    FindClose(hFind);
                    return returnvalue;
               }
          }

          //进行特征码的匹配工作
          ScanVXER(FindFileData.cFileName,FileOffset,FileLength,Contents);
          }
     }

     while (FindNextFile(hFind,&FindFileData)) //继续查找文件
     {
          count++;

          //以"."和".."除外
          if (strcmp(".",FindFileData.cFileName)==LOW||strcmp("..",FindFileData.cFileName)==LOW)
          {
               printf("File no include \".\" and \"..\"\n");
               exit(0);
          }

          if (GetFullPathName(FindFileData.cFileName,lpBufferLength,lpBuffer,NULL)!=LOW)
               printf("Next FilePath:%s\n",lpBuffer);
          else
          {
               printf("GetFullPathName() GetLastError reports %d\n",erron);
               FindClose(hFind);
               exit(0);
          }

          ScanVXER(FindFileData.cFileName,FileOffset,FileLength,Contents);

     }

     printf("File Total:%d\n",count); //打印出查找到的文件各数
     FindClose(hFind); //关闭搜索句柄
     returnvalue=TRUE;
     return returnvalue;
}

BOOL ScanVXER (
char *V_FileName, //文件名
long V_FileOffset, //偏移地址
int V_Length, //长度
void *V_Contents) //具体内容
{
     int cmpreturn=LOW;
     char FileContents[HIGH]={LOW};
     BOOL returnvalue=FALSE;
     FILE *fp=NULL;

     fp=fopen(V_FileName,"rb"); //以二进制只读方式打开
     if (fp==NULL)
     {
          printf("File open FAIL\n");
          fclose(fp);
          return returnvalue;
     }

     fseek(fp,V_FileOffset,SEEK_SET); //把文件指针指向特征码在文件的偏移地址处
     fread(FileContents,V_Length,1,fp);//读取长度为特征码长度的内容
     cmpreturn=memcmp(V_Contents,FileContents,V_Length);
     //进行特征码匹配。失败返回FALSE
     if (cmpreturn==LOW)
     {
          printf("File Match completely\n"); //打印文件匹配消息
          strcpy(name,V_FileName); //将文件名保存在全局变量name中
          exit(0);
     }
     else
          returnvalue=FALSE;
}

BOOL ProcessVXER (void)
{
     DWORD lpidProcess[1024],cbNeeded_1,cbNeeded_2;
     HANDLE hProc;
     HMODULE hMod[1024];
     char ProcFile[MAX_PATH];
     char FileName[FIVE]={LOW};
     BOOL returnvalue=FALSE;
     int Pcount=LOW;
     int i;

     EnablePrivilege(SE_DEBUG_NAME); //提升权限

     //枚举进程
     if (!(EnumProcesses(lpidProcess,sizeof(lpidProcess),&cbNeeded_1)))
     {
          printf("EnumProcesses() GetLastError reports %d\n",erron);
          return 0;
     }

     for (i=LOW;i<(int)cbNeeded_1/4;i++)
     {
          //打开找到的第一个进程
          hProc=OpenProcess(PROCESS_ALL_ACCESS,FALSE,lpidProcess[i]);
          if (hProc)
          {
               //枚举进程模块
               if (EnumProcessModules(hProc,hMod,sizeof(hMod),&cbNeeded_2))
               {
                    //枚举进程模块文件名,包含全路径
                    if (GetModuleFileNameEx(hProc,hMod[0],ProcFile,sizeof(ProcFile)))
                    {
                         printf("[%5d]\t%s\n",lpidProcess[i],ProcFile); //输出进程
                         //可以考虑将其注释掉,这样就不会输出进程列表了
                         Pcount++;

                         strcpy(FileName,"C:\\WINNT\\system32\\");
                         strcat(FileName,name);//把文件名+路径复制到FileName变量中

                         //查找进程中是否包含FileName
                         if (strcmp(FileName,ProcFile)==LOW)
                         {
                              //如果包含,则杀掉。KillProc为自定义的杀进程函数
                              if (!(KillProc(lpidProcess[i])))
                              {
                                   printf("KillProc() GetLastError reports %d\n",erron);
                                   CloseHandle(hProc);
                                   exit(0);
                              }
                              DeleteFile(FileName); //进程杀掉后,再将文件删除
                         }
                    }
               }
          }
     }

     CloseHandle(hProc); //关闭进程句柄
     printf("\nProcess total:%d\n",Pcount); //打印进程各数
     returnvalue=TRUE;
     return 0;
}

BOOL KillProc (DWORD *ProcessID)
{
     HANDLE hProc;
     BOOL returnvalue=FALSE;

     //打开由ProcessVXER传递的进程PID
     hProc=OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessID);

     if (hProc)
     {
     //终止进程
          if (!(TerminateProcess(hProc,0)))
          {
               printf("TerminateProcess GetLastError reports %d\n",erron);
               return returnvalue;
          }
     }

     CloseHandle(hProc);
     returnvalue=TRUE;
     return returnvalue;
}

BOOL EnablePrivilege(PCHAR PrivilegeName)
{
     HANDLE hProc,hToken;
     TOKEN_PRIVILEGES TP; 
     hProc=GetCurrentProcess(); //打开进程的一个伪句柄

     if(!OpenProcessToken(hProc,TOKEN_ADJUST_PRIVILEGES,&hToken))
     {
          return FALSE;
     }

     if(!LookupPrivilegeValue(NULL,PrivilegeName,&TP.Privileges[0].Luid))
     {
          CloseHandle(hToken);
          return FALSE;
     }

     TP.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
     TP.PrivilegeCount=1;

     if(!AdjustTokenPrivileges(hToken,FALSE,&TP,sizeof(TP),0,0))
     {
          CloseHandle(hToken);
          return FALSE;
     }

     CloseHandle(hToken);
     return TRUE;
}

int RegDelVXER (void)
{
     HKEY hkey;
     DWORD ret=LOW;

     //打开注册表的Run项
     ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\",0,KEY_ALL_ACCESS,&hkey);

     if (!ret==ERROR_SUCCESS)
     {
          printf("Register Open FAIL\n");
          exit(0);
     }

     //删除键值windows auto update。
     ret==RegDeleteValue(hkey,"windows auto update");

     if (ret==ERROR_SUCCESS)
          printf("Success Delete\n");
     else
     {
          printf("Delete FAIL\n");
          exit(0);
     }

     RegCloseKey(hkey); //关闭打开的注册表项
     return 1;
}

void Usage (char *Parameter)
{
     char *Path="%SystemRoot%\\system32\\";

     fprintf(stderr,"============================================================================\n"
" 杀毒软件的简单实现\n"
"环境:Win2K Adv Server + Visual C++ 6.0\n"
"作者:dahubaobao\n"
"主页:www.RingZ.org\;n"
"OICQ:382690\n"
"邮件:382690@qq.com\n"
"声明:本帖由环行区(RingZ)原创,转载请注明出处,谢谢!\n\n"
"使用方法:\n"
"%s 文件名。例如:%s msblast.exe\n\n"
"注意事项:\n"
"本程序只是简单介绍杀毒软件的编写方法,所以有很多不完善的地方,包括:\n"
"1,本程序是以冲击波蠕虫做的例子\n"
"2,文件遍历只搜索了%s目录下的文件\n"
"3,本程序不能查杀冲击波变种\n\n"
"本程序只是用做代码交流,如有错误,还请多多包含!\n"
"============================================================================"
,Parameter,Parameter,Path);
} 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
哎,改别人代码的格式还真难
现在眼睛都花了。
自己先顶一下
2005-6-10 23:49
0
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
3
最初由 北极星2003 发布
哎,改别人代码的格式还真难
现在眼睛都花了。
自己先顶一下


在VC里选中一段程序,按ALT+F8试试
2005-6-11 00:07
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
4
最初由 RoBa 发布


在VC里选中一段程序,按ALT+F8试试


哎,亏我还用了这么久的VC
2005-6-11 00:21
0
雪    币: 50161
活跃值: (20605)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
最初由 北极星2003 发布


哎,亏我还用了这么久的VC


正常,越是自己熟悉的东西越不容易看清楚。
2005-6-11 07:53
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
6
呵呵,你应该想到,微软向来喜欢大包大揽,这种常用的功能,强大的VC一定会提供的~
2005-6-11 11:39
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好像是木马类的。
如果是寄生性的怎么处理呢?
2005-6-11 14:06
0
游客
登录 | 注册 方可回帖
返回
//