行为1:setup.exe创建了spoclsv.exe这样一个程序
行为2:删除了c盘和admin用户文件夹的默认共享(不考虑)
行为3:删除了安全类软件的自启动项(用户自行重装杀毒软件,不考虑)
行为4:在run键下创建了一个svcshare的自启动项,每次开机时病毒自动运行
行为5:在注册表下修改hidden\showall和hidden\showall\checkvalue两个键达到在文件管理器中即使查看隐藏文件夹也无法显现病毒
行为6:将自身拷贝c盘根目录下命名为setup.exe,并且创建autorun.inf用于病毒的启动
行为7:在某些文件夹中创建Desktop_.ini这样的文件
行为8:向内网外网发送数据,并连接局域网中的其他电脑(删除病毒本体解决,不考虑)

新建mfc程序

CRC32():计算病毒程序的散列值

  1. DWORD CRC32(BYTE* ptr,DWORD Size)
  2. {
  3. DWORD crcTable[256],crcTmp1;
  4. //动态生成CRC-32表
  5. for (int i=0; i<256; i++)
  6. {
  7. crcTmp1 = i;
  8. for (int j=8; j>0; j--)
  9. {
  10. if (crcTmp1&1) crcTmp1 = (crcTmp1 >> 1) ^ 0xEDB88320L;
  11. else crcTmp1 >>= 1;
  12. }
  13. crcTable[i] = crcTmp1;
  14. }
  15. //计算CRC32值
  16. DWORD crcTmp2= 0xFFFFFFFF;
  17. while(Size--)
  18. {
  19. crcTmp2 = ((crcTmp2>>8) & 0x00FFFFFF) ^ crcTable[ (crcTmp2^(*ptr)) & 0xFF ];
  20. ptr++;
  21. }
  22. return (crcTmp2^0xFFFFFFFF);
  23. }

FindVirProcess():查找病毒进程

  1. BOOL FindVirProcess(char *pszProcessName,DWORD *dwPid)
  2. {
  3. BOOL bFind = FALSE;
  4. HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  5. if (hProcessSnap == INVALID_HANDLE_VALUE)
  6. {
  7. return bFind;
  8. }
  9. PROCESSENTRY32 pe = { 0 };
  10. pe.dwSize = sizeof(pe);
  11. BOOL bRet = Process32First(hProcessSnap,&pe);
  12. while (bRet)
  13. {
  14. if (lstrcmp(pe.szExeFile,pszProcessName) == 0)
  15. {
  16. *dwPid = pe.th32ProcessID;
  17. bFind = TRUE;
  18. break;
  19. }
  20. bRet = Process32Next(hProcessSnap,&pe);
  21. }
  22. CloseHandle(hProcessSnap);
  23. return bFind;
  24. }

EnableDebugerPrivilege提升权限

  1. BOOL EnableDebugPrivilege(char *pszPrivilege)
  2. {
  3. HANDLE hToken = INVALID_HANDLE_VALUE;
  4. LUID luid;
  5. TOKEN_PRIVILEGES tp;
  6. BOOL bRet = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);
  7. if (bRet == FALSE)
  8. {
  9. return bRet;
  10. }
  11. bRet = LookupPrivilegeValue(NULL,pszPrivilege,&luid);
  12. if (bRet == FALSE)
  13. {
  14. return bRet;
  15. }
  16. tp.PrivilegeCount = 1;
  17. tp.Privileges[0].Luid = luid;
  18. tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  19. bRet = AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);
  20. return bRet;
  21. }

FindFiles():删除Desktop_.ini文件

  1. DWORD WINAPI FindFiles(LPVOID lpszPath)
  2. {
  3. WIN32_FIND_DATA stFindFile;
  4. HANDLE hFindFile;
  5. // 扫描路径
  6. char szPath[MAX_PATH];
  7. char szFindFile[MAX_PATH];
  8. char szSearch[MAX_PATH];
  9. char *szFilter;
  10. int len;
  11. int ret = 0;
  12. szFilter = "*.*";
  13. lstrcpy(szPath, (char *)lpszPath);
  14. len = lstrlen(szPath);
  15. if(szPath[len-1] != '\\')
  16. {
  17. szPath[len] = '\\';
  18. szPath[len+1] = '\0';
  19. }
  20. lstrcpy(szSearch, szPath);
  21. lstrcat(szSearch,szFilter);
  22. hFindFile = FindFirstFile(szSearch, &stFindFile);
  23. if(hFindFile != INVALID_HANDLE_VALUE)
  24. {
  25. do
  26. {
  27. lstrcpy(szFindFile, szPath);
  28. lstrcat(szFindFile, stFindFile.cFileName);
  29. if(stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  30. {
  31. if(stFindFile.cFileName[0] != '.')
  32. {
  33. FindFiles(szFindFile);
  34. }
  35. }
  36. else
  37. {
  38. if(!lstrcmp(stFindFile.cFileName,"Desktop_.ini"))
  39. {
  40. // 去除文件的隐藏、系统以及只读属性
  41. DWORD dwFileAttributes = GetFileAttributes(szFindFile);
  42. dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;
  43. dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;
  44. dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
  45. SetFileAttributes(szFindFile, dwFileAttributes);
  46. // 删除Desktop_.ini
  47. BOOL bRet = DeleteFile(szFindFile);
  48. csTxt += szFindFile;
  49. if (bRet)
  50. {
  51. csTxt += _T("被删除!\r\n");
  52. }
  53. else
  54. {
  55. csTxt += _T("无法删除\r\n");
  56. }
  57. }
  58. }
  59. ret = FindNextFile(hFindFile, &stFindFile);
  60. }while(ret != 0);
  61. }
  62. FindClose(hFindFile);
  63. return 0;
  64. }

OnBtnKill():主程序

  1. void CKillWhBoyDlg::OnBtnKill()
  2. {
  3. // TODO: Add your control notification handler code here
  4. BOOL bRet = FALSE;
  5. DWORD dwPid = 0;
  6. ///
  7. // 结束spoclsv.exe进程,并删除病毒程序本身
  8. ///
  9. bRet = FindTargetProcess("spoclsv.exe", &dwPid);
  10. if (bRet == TRUE)
  11. {
  12. csTxt = _T("检查系统内存...\r\n");
  13. csTxt += _T("系统中存在病毒进程:spoclsv.exe\r\n");
  14. csTxt += _T("准备进行查杀...\r\n");
  15. SetDlgItemText(IDC_LIST,csTxt);
  16. // 提升权限
  17. bRet = EnableDebugPrivilege(SE_DEBUG_NAME);
  18. if (bRet == FALSE)
  19. {
  20. csTxt += _T("提升权限失败\r\n");
  21. }
  22. else
  23. {
  24. csTxt += _T("提升权限成功!\r\n");
  25. }
  26. SetDlgItemText(IDC_LIST,csTxt);
  27. // 打开并尝试结束病毒进程
  28. HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPid);
  29. if (hProcess == INVALID_HANDLE_VALUE)
  30. {
  31. csTxt += _T("无法结束病毒进程\r\n");
  32. return ;
  33. }
  34. bRet = TerminateProcess(hProcess,0);
  35. if (bRet == FALSE)
  36. {
  37. csTxt += _T("无法结束病毒进程\r\n");
  38. return ;
  39. }
  40. csTxt += _T("病毒进程已经结束\r\n");
  41. SetDlgItemText(IDC_LIST,csTxt);
  42. CloseHandle(hProcess);
  43. }
  44. else
  45. {
  46. csTxt += _T("系统中不存在spoclsv.exe病毒进程\r\n");
  47. }
  48. Sleep(10);
  49. // 查杀磁盘中是否存在名为spoclsv.exe的病毒文件
  50. char szSysPath[MAX_PATH] = { 0 };
  51. GetSystemDirectory(szSysPath,MAX_PATH);
  52. lstrcat(szSysPath,"\\drivers\\spoclsv.exe");
  53. csTxt += _T("检查硬盘中是否存在spoclsv.exe文件...\r\n");
  54. if (GetFileAttributes(szSysPath) == 0xFFFFFFFF)
  55. {
  56. csTxt += _T("spoclsv.exe病毒文件不存在\r\n");
  57. }
  58. else
  59. {
  60. csTxt += _T("spoclsv.exe病毒文件存在,正在计算散列值\r\n");
  61. HANDLE hFile = CreateFile(szSysPath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  62. if (hFile == INVALID_HANDLE_VALUE)
  63. {
  64. AfxMessageBox("Create Error");
  65. return ;
  66. }
  67. DWORD dwSize = GetFileSize(hFile,NULL);
  68. if (dwSize == 0xFFFFFFFF)
  69. {
  70. AfxMessageBox("GetFileSize Error");
  71. return ;
  72. }
  73. BYTE *pFile = (BYTE*)malloc(dwSize);
  74. if (pFile == NULL)
  75. {
  76. AfxMessageBox("malloc Error");
  77. return ;
  78. }
  79. DWORD dwNum = 0;
  80. ReadFile(hFile,pFile,dwSize,&dwNum,NULL);
  81. // 计算spoclsv.exe的散列值
  82. DWORD dwCrc32 = CRC32(pFile,dwSize);
  83. if (pFile != NULL)
  84. {
  85. free(pFile);
  86. pFile = NULL;
  87. }
  88. CloseHandle(hFile);
  89. // 0x89240FCD是“熊猫烧香”病毒的散列值
  90. if (dwCrc32 != 0x89240FCD)
  91. {
  92. csTxt += _T("spoclsv.exe校验和验证失败\r\n");
  93. }
  94. else
  95. {
  96. csTxt += _T("spoclsv.exe校验和验证成功,正在删除...\r\n");
  97. // 去除文件的隐藏、系统以及只读属性
  98. DWORD dwFileAttributes = GetFileAttributes(szSysPath);
  99. dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;
  100. dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;
  101. dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
  102. SetFileAttributes(szSysPath, dwFileAttributes);
  103. // 删除spoclsv.exe
  104. bRet = DeleteFile(szSysPath);
  105. if (bRet)
  106. {
  107. csTxt += _T("spoclsv.exe病毒被删除!\r\n");
  108. }
  109. else
  110. {
  111. csTxt += _T("spoclsv.exe病毒无法删除\r\n");
  112. }
  113. }
  114. }
  115. SetDlgItemText(IDC_LIST,csTxt);
  116. Sleep(10);
  117. ///
  118. // 删除每个盘符下的setup.exe与autorun.inf,以及Desktop_.ini
  119. ///
  120. char szDriverString[MAXBYTE] = { 0 };
  121. char *pTmp = NULL;
  122. //获取字符串类型的驱动器列表
  123. GetLogicalDriveStrings(MAXBYTE, szDriverString);
  124. pTmp = szDriverString;
  125. while( *pTmp )
  126. {
  127. char szAutorunPath[MAX_PATH] = { 0 };
  128. char szSetupPath[MAX_PATH] = { 0 };
  129. lstrcat(szAutorunPath,pTmp);
  130. lstrcat(szAutorunPath,"autorun.inf");
  131. lstrcat(szSetupPath,pTmp);
  132. lstrcat(szSetupPath,"setup.exe");
  133. if (GetFileAttributes(szSetupPath) == 0xFFFFFFFF)
  134. {
  135. csTxt += pTmp;
  136. csTxt += _T("setup.exe病毒文件不存在\r\n");
  137. }
  138. else
  139. {
  140. csTxt += pTmp;
  141. csTxt += _T("setup.exe病毒文件存在,正在进行计算校验和...\r\n");
  142. HANDLE hFile = CreateFile(szSetupPath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  143. if (hFile == INVALID_HANDLE_VALUE)
  144. {
  145. AfxMessageBox("Create Error");
  146. return ;
  147. }
  148. DWORD dwSize = GetFileSize(hFile,NULL);
  149. if (dwSize == 0xFFFFFFFF)
  150. {
  151. AfxMessageBox("GetFileSize Error");
  152. return ;
  153. }
  154. BYTE *pFile = (BYTE*)malloc(dwSize);
  155. if (pFile == NULL)
  156. {
  157. AfxMessageBox("malloc Error");
  158. return ;
  159. }
  160. DWORD dwNum = 0;
  161. ReadFile(hFile,pFile,dwSize,&dwNum,NULL);
  162. DWORD dwCrc32 = CRC32(pFile,dwSize);
  163. if (pFile != NULL)
  164. {
  165. free(pFile);
  166. pFile = NULL;
  167. }
  168. CloseHandle(hFile);
  169. if (dwCrc32 != 0x89240FCD)
  170. {
  171. csTxt += _T("校验和验证失败\r\n");
  172. }
  173. else
  174. {
  175. csTxt += _T("校验和验证成功,正在删除...\r\n");
  176. // 去除文件的隐藏、系统以及只读属性
  177. DWORD dwFileAttributes = GetFileAttributes(szSetupPath);
  178. dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;
  179. dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;
  180. dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
  181. SetFileAttributes(szSetupPath, dwFileAttributes);
  182. // 删除setup.exe
  183. bRet = DeleteFile(szSetupPath);
  184. if (bRet)
  185. {
  186. csTxt += pTmp;
  187. csTxt += _T("setup.exe病毒被删除!\r\n");
  188. }
  189. else
  190. {
  191. csTxt += pTmp;
  192. csTxt += _T("setup.exe病毒无法删除\r\n");
  193. }
  194. }
  195. }
  196. // 去除文件的隐藏、系统以及只读属性
  197. DWORD dwFileAttributes = GetFileAttributes(szAutorunPath);
  198. dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;
  199. dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;
  200. dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
  201. SetFileAttributes(szAutorunPath, dwFileAttributes);
  202. // 删除autorun.inf
  203. bRet = DeleteFile(szAutorunPath);
  204. csTxt += pTmp;
  205. if (bRet)
  206. {
  207. csTxt += _T("autorun.inf被删除!\r\n");
  208. }
  209. else
  210. {
  211. csTxt += _T("autorun.inf不存在或无法删除\r\n");
  212. }
  213. // 删除Desktop_.ini
  214. FindFiles(pTmp);
  215. // 检查下一个盘符
  216. pTmp += 4;
  217. }
  218. Sleep(10);
  219. ///
  220. // 修复注册表内容,删除病毒启动项并修复文件的隐藏显示
  221. ///
  222. csTxt += _T("正在检查注册表...\r\n");
  223. SetDlgItemText(IDC_LIST,csTxt);
  224. // 首先检查启动项
  225. char RegRun[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
  226. HKEY hKeyHKCU = NULL;
  227. LONG lSize = MAXBYTE;
  228. char cData[MAXBYTE] = { 0 };
  229. long lRet = RegOpenKey(HKEY_CURRENT_USER, RegRun, &hKeyHKCU);
  230. if(lRet == ERROR_SUCCESS)
  231. {
  232. lRet = RegQueryValueEx(hKeyHKCU,"svcshare",NULL,NULL,(unsigned char *)cData,(unsigned long *)&lSize);
  233. if ( lRet == ERROR_SUCCESS)
  234. {
  235. if (lstrcmp(cData,"C:\\WINDOWS\\system32\\drivers\\spoclsv.exe") == 0)
  236. {
  237. csTxt += _T("注册表启动项中存在病毒信息\r\n");
  238. }
  239. lRet = RegDeleteValue(hKeyHKCU,"svcshare");
  240. if (lRet == ERROR_SUCCESS)
  241. {
  242. csTxt += _T("注册表启动项中的病毒信息已删除!\r\n");
  243. }
  244. else
  245. {
  246. csTxt += _T("注册表启动项中的病毒信息无法删除\r\n");
  247. }
  248. }
  249. else
  250. {
  251. csTxt += _T("注册表启动项中不存在病毒信息\r\n");
  252. }
  253. RegCloseKey(hKeyHKCU);
  254. }
  255. else
  256. {
  257. csTxt += _T("注册表启动项信息读取失败\r\n");
  258. }
  259. // 接下来修复文件的隐藏显示,需要将CheckedValue的值设置为1
  260. char RegHide[] = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\Hidden\\SHOWALL";
  261. HKEY hKeyHKLM = NULL;
  262. DWORD dwFlag = 1;
  263. long lRetHide = RegOpenKey(HKEY_LOCAL_MACHINE, RegHide, &hKeyHKLM);
  264. if(lRetHide == ERROR_SUCCESS)
  265. {
  266. csTxt += _T("检测注册表的文件隐藏选项...\r\n");
  267. if( ERROR_SUCCESS == RegSetValueEx(
  268. hKeyHKLM, //subkey handle
  269. "CheckedValue", //value name
  270. 0, //must be zero
  271. REG_DWORD, //value type
  272. (CONST BYTE*)&dwFlag, //pointer to value data
  273. 4)) //length of value data
  274. {
  275. csTxt += _T("注册表修复完毕!\r\n");
  276. }
  277. else
  278. {
  279. csTxt += _T("无法恢复注册表的文件隐藏选项\r\n");
  280. }
  281. }
  282. ///
  283. // 病毒查杀完成
  284. ///
  285. csTxt += _T("病毒查杀完成,请使用专业杀毒软件进行全面扫描!\r\n");
  286. SetDlgItemText(IDC_LIST,csTxt);
  287. }

项目

test11111.zip
image.png