首页
社区
课程
招聘
[原创][开源]简易安全卫士的实现
发表于: 2015-12-16 17:00 27214

[原创][开源]简易安全卫士的实现

2015-12-16 17:00
27214
void Scam_All(LPCTSTR szPath)
{
  WIN32_FIND_DATA wfd;
  HANDLE hFind;
  CString sFullPath;
  CString sFindFilter;
  DWORD dwAttributes = 0;
  sFindFilter = szPath;
  sFindFilter += TEXT("\\*.*");
  if ((hFind = FindFirstFile(sFindFilter, &wfd)) == INVALID_HANDLE_VALUE)
    return;
  do
  {
    if (_tcscmp(wfd.cFileName, TEXT(".")) == 0 ||
      _tcscmp(wfd.cFileName, TEXT("..")) == 0)
    {
      continue;
    }
    //获取完整路径名
    sFullPath = szPath;
    sFullPath += TEXT("\\");
    sFullPath += wfd.cFileName;
    //如果当前路径是文件夹,则需要递归文件夹中的文件
    if (wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
    {
      Scam_All(sFullPath);
    }
    //否则,这是一个文件
    else
    {
      //输出正在搜索的文件路径界面,让用户直观的看到正在扫描的文件路径
      m_szStatus = _T("正在扫描 : ")+sFullPath;
      SendMessage(WM_MYUPDATEDATA, FALSE);
      //判断是否是病毒
      if (IsMD5)    
      {
        //MD5查杀
        //如果是病毒 将文件信息保存到病毒Vector
        if (MD5Scan(sFullPath))
        {
          //插入List中显示
          m_List_Vir.InsertItem(0, wfd.cFileName);  //文件名
          m_List_Vir.SetItemText(0, 1, sFullPath);  //文件路径
          m_List_Vir.SetItemText(0, 2,        //文件大小
             GetShowSize(wfd.nFileSizeLow)); 
          //保存病毒信息到Vector容器
          VIRINFO VirInfo;
          _tcscpy_s(VirInfo.szVirName, wfd.cFileName);
          _tcscpy_s(VirInfo.szVirPath, sFullPath);
          _tcscpy_s(VirInfo.szVirSize, GetShowSize(wfd.nFileSizeLow));
          m_vecVirInfo.push_back(VirInfo);
        }
      }
      else 
      {
        //白名单查杀
        //如果是病毒 将文件信息保存到病毒Vector
        if (WhiteScan(sFullPath))
        {
          //插入List中显示
          m_List_Vir.InsertItem(0, wfd.cFileName);  //文件名
          m_List_Vir.SetItemText(0, 1, sFullPath);  //文件路径
          m_List_Vir.SetItemText(0, 2,        //文件大小
            GetShowSize(wfd.nFileSizeLow));
          //保存病毒信息到Vector容器
          VIRINFO VirInfo;
          _tcscpy_s(VirInfo.szVirName, wfd.cFileName);
          _tcscpy_s(VirInfo.szVirPath, sFullPath);
          _tcscpy_s(VirInfo.szVirSize, GetShowSize(wfd.nFileSizeLow));
          m_vecVirInfo.push_back(VirInfo);
        }
      }
    }
  } while (FindNextFile(hFind, &wfd));
  FindClose(hFind);
}
BOOL MD5Scan(LPCTSTR szPath)
{
  //LPCTSTR 转CHAR*
  int num = WideCharToMultiByte(CP_OEMCP, NULL, szPath, -1, NULL, 0, NULL, FALSE);
  char *pchar = new char[num];
  WideCharToMultiByte(CP_OEMCP, NULL, szPath, -1, pchar, num, NULL, FALSE);
  //获取MD5值
  char* md5 = md5FileValue(pchar);
  //CHAR* 转LPCTSTR
  num = MultiByteToWideChar(0, 0, md5, -1, NULL, 0);
  wchar_t *wide = new wchar_t[num];
  MultiByteToWideChar(0, 0, md5, -1, wide, num);
  m_szMD5 = wide;
  delete[]pchar;
  delete[]wide;
  
  //获取文件MD5信息完毕
  //判断是本地查杀还是云端查杀
  if (IsLocal)
  {
    //本地MD5查杀    与m_LocalMD5作对比
    for (DWORD i = 0; i < m_LocalMD5.size();i++)
    {
      if (m_LocalMD5[i] == m_szMD5)
      {
        //是病毒 返回真
        return TRUE;
      }
    }
  }
  else
  {  
    //云端MD5查杀    与m_ServerMD5作对比
    //本地MD5查杀    与m_LocalMD5作对比
    for (DWORD i = 0; i < m_ServerMD5.size(); i++)
    {
      if (m_ServerMD5[i] == m_szMD5)
      {
        //是病毒 返回真
        return TRUE;
      }
    }
  }
  return FALSE;
}
BOOL WhiteScan(LPCTSTR szPath)
{
  //判断是本地查杀还是云端查杀
  if (IsLocal)
  {
    //本地白名单查杀    与m_LocalWhite作对比
    for (DWORD i = 0; i < m_LocalWhite.size(); i++)
    {
      if (m_LocalWhite[i] == szPath)
      {
        //是病毒 返回真
        return FALSE;
      }
    }
  }
  else
  {
    //云端MD5查杀    与m_ServerWhite作对比
    for (DWORD i = 0; i < m_ServerWhite.size(); i++)
    {
      if (m_ServerWhite[i] == szPath)
      {
        //是病毒 返回真
        return FALSE;
      }
    }
  }
  return TRUE;
}
void DeleteVir()
{
  //先判断病毒Vector是否为空,若为空,则提示没有可以清除的文件
  if (m_vecVirInfo.size() == 0)
  {
    return;
  }
  //删除病毒
  for (DWORD i = 0; i < m_vecVirInfo.size();i++)
  {
    DeleteFile(m_vecVirInfo[i].szVirPath);    
  }
  m_vecVirInfo.clear();
  m_List_Vir.DeleteAllItems();
  m_szStatus = _T("病 毒 清 除 完 毕 !");
  UpdateData(FALSE);
}
BOOL SHGetSpecialFolderPath(
        HWND   hwndOwner,
  _Out_ LPTSTR lpszPath,
  _In_  int    csidl,
  _In_  BOOL   fCreate
);
VOID CleanRunHistory()
{
  if (IsScanFile)  
    return;  //如果是正在扫描垃圾文件,则直接返回,不进行清理操作。
  SHDeleteKey(HKEY_CURRENT_USER, 
    TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU"));
}
BOOL WINAPI SetProcessWorkingSetSize(
  _In_ HANDLE hProcess,
  _In_ SIZE_T dwMinimumWorkingSetSize,
  _In_ SIZE_T dwMaximumWorkingSetSize
);
BOOL WINAPI EmptyWorkingSet( _In_ HANDLE hProcess);
void ClearMemory()
{
  HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hProcessSnap == INVALID_HANDLE_VALUE)
  {
    return;
  }
  
  PROCESSENTRY32 ProcessInfo;          
  ProcessInfo.dwSize = sizeof(ProcessInfo);  
  int count = 0;
  //获取系统中第一个进程的信息  
  BOOL Status = Process32First(hProcessSnap, &ProcessInfo);
  while (Status)
  {
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE,
      ProcessInfo.th32ProcessID);
    if (hProcess)
    {
      //设置进程工作区大小
      SetProcessWorkingSetSize(hProcess, -1, -1);
      //尽可能多的将指定进程的页面从工作区移除
      EmptyWorkingSet(hProcess);
      CloseHandle(hProcess);
    }
    //获取下一个进程的信息  
    Status = Process32Next(hProcessSnap, &ProcessInfo);
  }
}
  m_szStatus = _T("正在清理内存中... ...");
  UpdateData(FALSE);
  //获取清理前的内存信息
  MEMORYSTATUSEX memStatus = { sizeof(MEMORYSTATUSEX) };
  GlobalMemoryStatusEx(&memStatus);
  DOUBLE preUsedMem = (DOUBLE)(memStatus.ullTotalPhys - memStatus.ullAvailPhys) / 1024 / 1024;
  //开始清理内存
  ClearMemory();
  //获取清理后的内存信息
  GlobalMemoryStatusEx(&memStatus);
  DOUBLE afterUsedMem = (DOUBLE)(memStatus.ullTotalPhys - memStatus.ullAvailPhys) / 1024 / 1024;
  //输出清理信息
  m_szStatus.Format(_T("内存清理完毕!本次清理 : %.2f MB"), preUsedMem - afterUsedMem);

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 4
支持
分享
最新回复 (66)
雪    币: 367
活跃值: (15)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
谢谢分享。。
2015-12-16 17:18
0
雪    币: 44
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
niubio
2015-12-16 17:33
0
雪    币: 152
活跃值: (92)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
感谢楼主无私奉献,热情分享
2015-12-16 17:58
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最近安全卫士的源码很多啊
2015-12-16 18:13
0
雪    币: 191
活跃值: (848)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2015-12-16 18:20
0
雪    币: 8201
活跃值: (2701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不会编程的学习一下
2015-12-16 18:24
0
雪    币: 6
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢楼主分享。
2015-12-16 18:58
0
雪    币: 341
活跃值: (138)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
9
好像有点简单了嘛。。。MD5对比额,毕竟才6天。你这个界面真好看哈哈

//************************************************************
// 函数名称:        Scan_Single
// 函数说明:        单个文件查杀
// 作        者:        cyxvc
// 时        间:        2015/11/13
// 返 回        值:        void
//************************************************************
void CMyDlg2::Scan_Single(LPCTSTR szPath)
{
        WIN32_FIND_DATA wfd;
        CString sFindFilter;
        DWORD dwAttributes = 0;

        sFindFilter = szPath;
        FindFirstFile(sFindFilter, &wfd);

        //判断是否是病毒
        if (IsMD5)
        {
                //MD5查杀
                if (MD5Scan(szPath))
                {
                        //插入List
                        m_List_Vir.InsertItem(0, wfd.cFileName);        //文件名
                        m_List_Vir.SetItemText(0, 1, szPath);                //文件路径
                        m_List_Vir.SetItemText(0, 2,                                //文件大小
                                GetShowSize(wfd.nFileSizeLow));
                        //保存到Vector
                        VIRINFO VirInfo;
                        _tcscpy_s(VirInfo.szVirName, wfd.cFileName);
                        _tcscpy_s(VirInfo.szVirPath, szPath);
                        _tcscpy_s(VirInfo.szVirSize, GetShowSize(wfd.nFileSizeLow));
                        m_vecVirInfo.push_back(VirInfo);
                }
        }
        else
        {
                //白名单查杀
                //如果是病毒 将文件信息保存到病毒Vector
                if (WhiteScan(szPath))
                {
                        //插入List
                        m_List_Vir.InsertItem(0, wfd.cFileName);        //文件名
                        m_List_Vir.SetItemText(0, 1, szPath);                //文件路径
                        m_List_Vir.SetItemText(0, 2,                                //文件大小
                                GetShowSize(wfd.nFileSizeLow));
                        //保存到Vector
                        VIRINFO VirInfo;
                        _tcscpy_s(VirInfo.szVirName, wfd.cFileName);
                        _tcscpy_s(VirInfo.szVirPath, szPath);
                        _tcscpy_s(VirInfo.szVirSize, GetShowSize(wfd.nFileSizeLow));
                        m_vecVirInfo.push_back(VirInfo);
                }
        }
}

//************************************************************
// 函数名称:        WhiteScan
// 函数说明:        白名单查杀
// 作        者:        cyxvc
// 时        间:        2015/11/13
// 参        数:        LPCTSTR szPath
// 返 回        值:        BOOL
//************************************************************
BOOL CMyDlg2::WhiteScan(LPCTSTR szPath)
{
        //判断是本地查杀还是云端查杀
        if (IsLocal)
        {
                //本地白名单查杀                与m_LocalWhite作对比
                for (DWORD i = 0; i < m_LocalWhite.size(); i++)
                {
                        if (m_LocalWhite[i] == szPath)
                        {
                                //是病毒 返回真
                                return FALSE;
                        }
                }
        }
        else
        {
                //云端MD5查杀                与m_ServerWhite作对比
                for (DWORD i = 0; i < m_ServerWhite.size(); i++)
                {
                        if (m_ServerWhite[i] == szPath)
                        {
                                //是病毒 返回真
                                return FALSE;
                        }
                }
        }
        return TRUE;
}
2015-12-16 19:07
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼主很牛逼啊 学习下
2015-12-16 19:14
0
雪    币: 334
活跃值: (929)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
15pb 最近在发力啊
2015-12-16 20:16
0
雪    币: 77
活跃值: (1010)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
MD5对比只是象征性的意思一下,表示通过某种方式对比是否是病毒文件而已
真正的病毒分析肯定很复杂,哈哈,我就不在这里献丑了
2015-12-16 20:20
0
雪    币: 108
活跃值: (125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
简易安全卫士的实现
2015-12-16 20:55
0
雪    币: 136
活跃值: (1470)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
15
牛逼,代码不错
2015-12-16 22:07
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
感谢分享,学习。
2015-12-16 22:28
0
雪    币: 290
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
感谢分享
2015-12-16 22:57
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
确实不错,感谢楼主分享。小菜下一个学习学习。
2015-12-16 22:59
0
雪    币: 171
活跃值: (92)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
收下了,多谢楼主!
2015-12-16 23:32
0
雪    币: 764
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
看着不错,谢谢分享
2015-12-17 01:02
0
雪    币: 89
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
楼主真牛逼啊,六天做出来了
2015-12-17 09:19
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
感谢分享,学习了
2015-12-17 11:12
0
雪    币: 15
活跃值: (765)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
6666666666666天
2015-12-17 13:37
0
雪    币: 157
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
先感谢楼主分享,怎么解压出来是空的?大家有这种情况吗?
2015-12-17 13:57
0
雪    币: 77
活跃值: (1010)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
25
有可能是你的解压软件不支持7z?
我给你传了个网盘的rar格式的你下下来试试
链接: http://pan.baidu.com/s/1sjVIQuD 密码: ztfk
2015-12-17 15:28
0
游客
登录 | 注册 方可回帖
返回
//