现在的位置: 首页 > 综合 > 正文

基于visual c++之windows核心编程代码分析(43)剿灭病毒编程

2013年10月18日 ⁄ 综合 ⁄ 共 19760字 ⁄ 字号 评论关闭

编制或者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或者程序代码被称为计算机病毒(Computer Virus)。具有破坏性,复制性和传染性。

我们如何编程干掉病毒呢,有的病毒很拽很得瑟。

看我们来实践干掉病毒

提升权限

  1. //                   函数功能:提升权限                            // 
  2. //      参数:lpszPrivilege:权限名  bEnablePrivilege:是否允许    // 
  3. ///////////////////////////////////////////////////////////////////// 
  4. BOOL SetPrivilege(LPCTSTR lpszPrivilege,BOOL bEnablePrivilege) 
  5.     TOKEN_PRIVILEGES tp; 
  6.     LUID luid; 
  7.     HANDLE hProcessToken=NULL;   
  8.     if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken)) 
  9.         return -1; 
  10.     if(!LookupPrivilegeValue(NULL,lpszPrivilege,&luid)) 
  11.         return FALSE; 
  12.     tp.PrivilegeCount = 1; 
  13.     tp.Privileges[0].Luid=luid; 
  14.     if(bEnablePrivilege) 
  15.         tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED; 
  16.     else 
  17.         tp.Privileges[0].Attributes =0; 
  18.     //Enable the privilege or disable all privilege 
  19.     AdjustTokenPrivileges(hProcessToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),(PTOKEN_PRIVILEGES)NULL,(PDWORD)NULL); 
  20.     if(GetLastError()!=ERROR_SUCCESS) 
  21.         return FALSE; 
  22.     if(hProcessToken!=NULL) 
  23.         CloseHandle(hProcessToken); 
  24.     return TRUE; 

删除病毒让病毒不能自己启动

  1. ///                    函数功能:删除自启动项                            /// 
  2. //////////////////////////////////////////////////////////////////////////// 
  3. VOID DeleteRunouceRegistry() 
  4. {    
  5.     HKEY hTestKey; 
  6.     CHAR szBuf[128]; 
  7.     if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_READ|KEY_WRITE,&hTestKey)==ERROR_SUCCESS) 
  8.     { 
  9.         if(RegDeleteValue(hTestKey,"Runouce")!=ERROR_SUCCESS) 
  10.         { 
  11.             sprintf(szBuf,"%d",GetLastError()); 
  12.             MessageBox(NULL,szBuf,NULL,MB_OK); 
  13.         } 
  14.     } 

批处理调用

  1. ////              使用说明:将批处理放在程序同一个文件夹中,然后调用下面的代码    //// 
  2. ////                        将kill.bat改成相应的文件名                            //// 
  3. //////////////////////////////////////////////////////////////////////////////////////                     
     
  4. GetModuleFileName(NULL,szPath,MAX_PATH); //获取程序的路径 
  5. lstrcpy( _tcsrchr(szPath, _T('\\') ) + 1, _T("kill.bat") );//然后去掉程序名加上kill.bat 
  6. strcpy(szCmdLine,"cmd.exe /c start ");//WinExec的命令行 
  7. strcat(szCmdLine,szPath); 
  8. WinExec(szCmdLine,SW_SHOWNORMAL); 

对抗病毒镜像劫持

  1. ///                     函数功能:对抗映像劫持                           /// 
  2. //////////////////////////////////////////////////////////////////////////// 
  3. VOID DeleteRunouceRegistry()//这里以任务管理器为例 
  4. {    
  5.     HKEY hTestKey; 
  6.     CHAR szBuf[128]; 
  7.     if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\taskmgr",0,KEY_READ|KEY_WRITE,&hTestKey)==ERROR_SUCCESS) 
  8.     { 
  9.         if(RegDeleteValue(hTestKey,"Debugger")!=ERROR_SUCCESS) 
  10.         { 
  11.             sprintf(szBuf,"%d",GetLastError()); 
  12.             MessageBox(NULL,szBuf,NULL,MB_OK); 
  13.         } 
  14.     } 

删除顽固文件

  1. ///                 函数功能:强删顽固文件                /// 
  2. ///   使用说明:将\\??\\E:\\autorun.inf改成相应的文件名   /// 
  3. ///////////////////////////////////////////////////////////// 
  4. #include <windows.h> 
  5. #include <stdio.h> 
  6. #include <stdlib.h> 
  7.   
  8. typedef unsigned long NTSTATUS; 
  9. typedef unsigned
    short USHORT
  10. typedef unsigned long
    ULONG
  11. typedef unsigned
    long DWORD
  12. typedef long
    LONG
  13. typedef __int64
    LONGLONG
  14.   
  15. typedef struct UNICODE_STRING{ 
  16.     USHORT Length; 
  17.     USHORT MaxLen; 
  18.     USHORT *Buffer; 
  19. } UNICODE_STRING,*PUNICODE_STRING; 
  20.   
  21. #define OBJ_INHERIT             0x00000002L 
  22. #define OBJ_PERMANENT           0x00000010L 
  23. #define OBJ_EXCLUSIVE           0x00000020L 
  24. #define OBJ_CASE_INSENSITIVE    0x00000040L 
  25. #define OBJ_OPENIF              0x00000080L 
  26. #define OBJ_OPENLINK            0x00000100L 
  27. #define OBJ_KERNEL_HANDLE       0x00000200L 
  28. #define OBJ_FORCE_ACCESS_CHECK 0x00000400L 
  29. #define OBJ_VALID_ATTRIBUTES    0x000007F2L 
  30.   
  31. #define FILE_ATTRIBUTE_NORMAL               0x00000080 
  32. #define FILE_SHARE_DELETE                   0x00000004 
  33. #define FILE_OPEN_IF                        0x00000003 
  34. #define FILE_SYNCHRONOUS_IO_NONALERT        0x00000020 
  35. #define GENERIC_WRITE                       (0x40000000L) 
  36. #define SYNCHRONIZE                         (0x00100000L) 
  37. #define GENERIC_READ                        (0x80000000L) 
  38.   
  39. typedef struct _OBJECT_ATTRIBUTES{ 
  40.     ULONG Length; 
  41.     HANDLE RootDirectory; 
  42.     PUNICODE_STRING ObjectName; 
  43.     ULONG Attributes; 
  44.     PVOID SecurityDescriptor; 
  45.     PVOID SecurityQualityOfService; 
  46. } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; 
  47. typedef CONST OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES; 
  48.   
  49. typedef NTSTATUS (__stdcall *ZWDELETEFILE)( 
  50.         IN POBJECT_ATTRIBUTES ObjectAttributes); 
  51.   
  52. typedef VOID (__stdcall *RTLINITUNICODESTRING)( 
  53.         IN OUT PUNICODE_STRING DestinationString, 
  54.         IN PCWSTR SourceString); 
  55.   
  56. typedef struct _IO_STATUS_BLOCK{ 
  57.         DWORD Status; 
  58.         ULONG Information; 
  59. } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; 
  60.   
  61. typedef NTSTATUS (__stdcall *ZWCREATEFILE)( 
  62.     OUT PHANDLE FileHandle, 
  63.     IN ACCESS_MASK DesiredAccess, 
  64.     IN POBJECT_ATTRIBUTES ObjectAttributes, 
  65.     OUT PIO_STATUS_BLOCK IoStatusBlock, 
  66.     IN PLARGE_INTEGER AllocationSize OPTIONAL, 
  67.     IN ULONG FileAttributes, 
  68.     IN ULONG ShareAccess, 
  69.     IN ULONG CreateDisposition, 
  70.     IN ULONG CreateOptions, 
  71.     IN PVOID EaBuffer OPTIONAL, 
  72.     IN ULONG EaLength); 
  73.   
  74. typedef VOID (NTAPI *PIO_APC_ROUTINE) ( 
  75.    IN PVOID ApcContext, 
  76.    IN PIO_STATUS_BLOCK IoStatusBlock, 
  77.    IN ULONG Reserved); 
  78.   
  79. typedef NTSTATUS (__stdcall *ZWWRITEFILE)( 
  80.     IN HANDLE FileHandle, 
  81.     IN HANDLE Event OPTIONAL, 
  82.     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, 
  83.     IN PVOID ApcContext OPTIONAL, 
  84.     OUT PIO_STATUS_BLOCK IoStatusBlock, 
  85.     IN PVOID Buffer, 
  86.     IN ULONG Length, 
  87.     IN PLARGE_INTEGER ByteOffset OPTIONAL, 
  88.     IN PULONG Key OPTIONAL); 
  89.   
  90. typedef NTSTATUS (__stdcall *ZWCLOSE)( 
  91.     IN HANDLE Handle); 
  92.   
  93. int main() 
  94.     HINSTANCE hNtDll; 
  95.     ZWDELETEFILE ZwDeleteFile; 
  96.     RTLINITUNICODESTRING RtlInitUnicodeString; 
  97.     ZWCREATEFILE ZwCreateFile; 
  98.     ZWWRITEFILE ZwWriteFile; 
  99.     ZWCLOSE ZwClose; 
  100.   
  101.     hNtDll = LoadLibrary ("NTDLL"); 
  102.     if (!hNtDll) 
  103.        return 0; 
  104.   
  105.     ZwDeleteFile = (ZWDELETEFILE)GetProcAddress (hNtDll,"ZwDeleteFile"); 
  106.     RtlInitUnicodeString = (RTLINITUNICODESTRING)GetProcAddress (hNtDll,"RtlInitUnicodeString"); 
  107.     ZwCreateFile = (ZWCREATEFILE)GetProcAddress (hNtDll,"ZwCreateFile"); 
  108.     ZwWriteFile = (ZWWRITEFILE)GetProcAddress (hNtDll,"ZwWriteFile"); 
  109.     ZwClose = (ZWCLOSE)GetProcAddress (hNtDll,"ZwClose"); 
  110.   
  111.     UNICODE_STRING ObjectName; 
  112.     RtlInitUnicodeString(&ObjectName,L"\\??\\E:\\autorun.inf");//记得这里是要有\\??\\在前面的,WDK说的. 
  113.   
  114.     OBJECT_ATTRIBUTES ObjectAttributes = { 
  115.         sizeof(OBJECT_ATTRIBUTES),         
    // Length 
  116.         NULL,                              
    // RootDirectory
     
  117.         &ObjectName,                        // ObjectName 
  118.         OBJ_CASE_INSENSITIVE,              
    // Attributes
     
  119.         0,                                  // SecurityDescriptor 
  120.         NULL,                              
    // SecurityQualityOfService
     
  121.     }; 
  122.   
  123.     HANDLE hFile; 
  124.     PVOID content =
    "ForZwFileTest"
  125.     IO_STATUS_BLOCK IoStatusBlock; 
  126.   
  127.     ZwCreateFile(&hFile, 
  128.         GENERIC_WRITE|SYNCHRONIZE|GENERIC_READ, 
  129.         &ObjectAttributes, 
  130.         &IoStatusBlock, 
  131.         0, 
  132.         FILE_ATTRIBUTE_NORMAL, 
  133.         FILE_SHARE_DELETE, 
  134.         FILE_OPEN_IF, 
  135.         FILE_SYNCHRONOUS_IO_NONALERT, 
  136.         NULL, 
  137.         0); 
  138.     ZwWriteFile(hFile, 0, 0, 0, &IoStatusBlock, content, 12, NULL, NULL); 
  139.     ZwClose(hFile); 
  140.   
  141.     ZwDeleteFile(&ObjectAttributes); 
  142.   
  143.     FreeLibrary (hNtDll); 
  144.     return 0; 

多进程保护终结者

  1. ////                     功能:对抗多进程保护                              ////// 
  2. ////       主程序里调用EnumProcessAndSuspendProcess()和                    ////// 
  3. ////    EnumProcessAndTerminateProcess()就能将病毒程序结束掉               ////// 
  4. ///////////////////////////////////////////////////////////////////////////////// 
  5.  
  6. typedef DWORD (WINAPI *PFSuspendProcess)(HANDLE hProcess); 
  7.  
  8. PFSuspendProcess SuspendProcess;  //挂起进程的API,在ntdlll.dll中 
  9. //函数功能:挂起进程   参数:进程ID 
  10. VOID SuspendProc(DWORD dwPID) 
  11.   HMODULE hNtDllLib=LoadLibrary("ntdll.dll");
    //加载ntdll.dll,获得dll句柄 
  12.   SuspendProcess=(PFSuspendProcess)GetProcAddress(hNtDllLib,"ZwSuspendProcess"); 
  13. //获取ZwSuspendProcess的地址 
  14.   if (SuspendProcess) 
  15.   { 
  16.       HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPID); 
  17.       //获取指定进程ID的句柄 
  18.       SuspendProcess(hProcess); //挂起进程 
  19.   } 
  20.   FreeLibrary(hNtDllLib);//释放dll 
  21. VOID TerminateProc(DWORD dwPID) 
    //函数功能:结束进程  参数:进程ID 
  22.   HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPID); 
  23.   TerminateProcess(hProcess,0);   
  24.  
  25. //函数功能:枚举进程并挂起进程 
  26. VOID WINAPI EnumProcessAndSuspendProcess() 
  27.     HANDLE hProcessSnap; 
  28.     PROCESSENTRY32 pe32; 
  29.     // Snapshot 
  30.     hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); 
  31.     if( hProcessSnap == INVALID_HANDLE_VALUE ) 
  32.     { 
  33.          printf( "CreateToolhelp32Snapshot (of processes) error!\n"); 
  34.         return
  35.     } 
  36.     // 设置输入参数,结构的大小 
  37.     pe32.dwSize = sizeof( PROCESSENTRY32 ); 
  38.      
  39.     // 开始列举进程 
  40.     if( !Process32First( hProcessSnap, &pe32 ) ) 
  41.     { 
  42.         printf( "Process32First error!\n" ); 
    // 出错信息 
  43.         CloseHandle( hProcessSnap ); 
  44.         return
  45.     } 
  46.     do 
  47.     {    
  48.         //枚举进程然后将病毒进程挂起 
  49.         if (stricmp(pe32.szExeFile,"Global.exe")==0) 
  50.         { 
  51.            SuspendProc(pe32.th32ProcessID); 
  52.         } 
  53.         ...   
  54.         //在这里添加要结束的进程名 
  55.     } while( Process32Next( hProcessSnap, &pe32 ) ); 
  56.      
  57.     CloseHandle( hProcessSnap );    //关闭句柄 
  58.     return
  59. //函数功能:枚举进程并结束进程 
  60. VOID WINAPI EnumProcessAndTerminateProcess() 
  61.     HANDLE hProcessSnap; 
  62.     PROCESSENTRY32 pe32; 
  63.     // Snapshot 
  64.     hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); 
  65.     if( hProcessSnap == INVALID_HANDLE_VALUE ) 
  66.     { 
  67.         printf( "CreateToolhelp32Snapshot (of processes) error!\n"); 
  68.         return
  69.     } 
  70.     // 设置输入参数,结构的大小 
  71.     pe32.dwSize = sizeof( PROCESSENTRY32 ); 
  72.      
  73.     // 开始列举进程 
  74.     if( !Process32First( hProcessSnap, &pe32 ) ) 
  75.     { 
  76.         printf( "Process32First error!\n" ); 
    // 出错信息 
  77.         CloseHandle( hProcessSnap ); 
  78.         return
  79.     } 
  80.     do 
  81.     {   //枚举进程然后将病毒进程结束 
  82.         if (stricmp(pe32.szExeFile,"Global.exe")==0) 
  83.         { 
  84.             TerminateProc(pe32.th32ProcessID); 
  85.         } 
  86.         ... 
  87.         //在这里添加要结束的进程名 
  88.     } while( Process32Next( hProcessSnap, &pe32 ) ); 
  89.      
  90.     CloseHandle( hProcessSnap );    //关闭句柄 
  91.     return

卸载被远程注射的dll

  1. /////                     函数功能:卸载掉注入的dll  参数;dll名                      ///// 
  2. /////////////////////////////////////////////////////////////////////////////////////////// 
  3. int KillDLL(char *DllName) 
  4.      // 解除所有进程中某DLL模块的加载 
  5.     HANDLE hProcess=NULL; 
  6.     if(!SetPrivilege(SE_DEBUG_NAME,TRUE)) 
  7.     { 
  8.         return -2; 
  9.     } 
  10.     DWORD aProcesses[1024],cbNeeded,cProcesses; 
  11.     unsigned int i; 
  12.     //计算目前有多少进程,aerocesses[]用来存放有效的进程PIDs 
  13.         if(!EnumProcesses(aProcesses,sizeof(aProcesses),&cbNeeded))  
  14.              return -11; 
  15.     cProcesses=cbNeeded/sizeof(DWORD); 
  16.     //按有效的PID遍历所有的进程 
  17.     for(i= 0;i<cProcesses;i++) 
  18.     { 
  19.     if((hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,aProcesses[i]))==NULL) 
  20.         { 
  21.             continue
  22.         } 
  23.         // 由目标进程地址空间写入DLL名称 
  24.         DWORD dwSize,dwWritten; 
  25.         dwSize=strlen(DllName)+1; 
  26.         LPVOID lpBuf=VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT,PAGE_READWRITE); 
  27.             if(lpBuf=NULL) 
  28.             { 
  29.                 CloseHandle(hProcess); 
  30.                 continue
  31.             } 
  32.     //向其中写入dll的名称 
  33.         if(WriteProcessMemory(hProcess,lpBuf,(LPVOID)DllName,dwSize,&dwWritten)) 
  34.         {    
  35.                    // 若写入字节数与实际写入字节数不相等,仍属失败 
  36.             if(dwWritten!=dwSize) 
  37.             { 
  38.                 VirtualFreeEx(hProcess,lpBuf,dwSize,MEM_DECOMMIT); 
  39.                 CloseHandle(hProcess); 
  40.                 continue
  41.             } 
  42.         } 
  43.                          
  44.         else 
  45.         {  
  46.              CloseHandle(hProcess); 
  47.               continue;  
  48.         } 
  49.         //使目标进程调用GetModuleHandIe,获得DLL在进程中的句柄 
  50.         DWORD dwHandle,dwID; 
  51.         LPVOID pFunc= GetModuleHandleA; 
  52.         HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,lpBuf,0,&dwID); 
  53.         //等待GetModuleHandle运行完毕 
  54.         WaitForSingleObject(hThread,INFINITE); 
  55.         //获得GetModuleHandle的返回值 
  56.         GetExitCodeThread(hThread,&dwHandle); 
  57.         // 释放目标进程中申请的空间 
  58.         VirtualFreeEx( hProcess,lpBuf,dwSize,MEM_DECOMMIT); 
  59.         CloseHandle(hThread); 
  60.         //使目标进程调用FreeLibrary,卸载DLL 
  61.         pFunc=FreeLibrary; 
  62.         hThread= CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,(LPVOID)dwHandle,0,&dwID); 
  63.         //等待FreeLibrary卸载完毕 
  64.          WaitForSingleObject(hThread,INFINITE); 
  65.          CloseHandle(hThread); 
  66.         CloseHandle(hProcess); 
  67.     } 
  68.       if(hProcess!=NULL) 
  69.           CloseHandle(hProcess); 
  70.        return 0;  
  71. 原文地址:http://blog.csdn.net/yincheng01/article/details/7214394

抱歉!评论已关闭.