Files
BeneficialCode 5b599e243d Analyze the code.
2023-10-29 13:47:46 +08:00

362 lines
6.9 KiB
C

#pragma once
#include "SysMon.h"
#include "kDbgCore.h"
extern "C"
NTSTATUS ObCreateObject(
_In_opt_ KPROCESSOR_MODE ObjectAttributesAccessMode,
_In_ POBJECT_TYPE Type,
_In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
_In_ KPROCESSOR_MODE AccessMode,
_Inout_opt_ PVOID ParseContext,
_In_ ULONG ObjectSize,
_In_opt_ ULONG PagedPoolCharge,
_In_opt_ ULONG NonPagedPoolCharge,
_Out_ PVOID * Object
);
extern "C"
NTSTATUS
PsReferenceProcessFilePointer(
_In_ PEPROCESS Process,
_Out_ PFILE_OBJECT* FileObject
);
extern "C"{
NTSYSAPI NTSTATUS NTAPI ZwFlushInstructionCache(_In_ HANDLE ProcessHandle,
_In_ PVOID BaseAddress,
_In_ ULONG NumberOfBytesToFlush
);
}
extern "C"
NTSTATUS ObDuplicateObject(
_In_ PEPROCESS SourceProcess,
_In_ HANDLE SourceHandle,
_In_opt_ PEPROCESS TargetProcess,
_Out_opt_ PHANDLE TargetHandle,
_In_ ACCESS_MASK DesiredAccess,
_In_ ULONG HandleAttributes,
_In_ ULONG Options,
_In_ KPROCESSOR_MODE PreviousMode
);
using PPsGetNextProcessThread = PETHREAD(NTAPI*) (
_In_ PEPROCESS Process,
_In_ PETHREAD Thread
);
using PPsSuspendThread = NTSTATUS(NTAPI*) (
_In_ PETHREAD Thread,
_Out_opt_ PULONG PreviousSuspendCount
);
using PDbgkpSectionToFileHandle = HANDLE(NTAPI*) (
_In_ PVOID SectionObject
);
using PPsResumeThread = NTSTATUS(NTAPI*) (
_In_ PETHREAD Thread,
_Out_opt_ PULONG PreviousSuspendCount
);
using PMmGetFileNameForAddress = NTSTATUS(NTAPI*) (
_In_ PVOID ProcessVa,
_Out_ PUNICODE_STRING FileName
);
using PDbgkpSuspendProcess = BOOLEAN(NTAPI*)();
using PKeThawAllThreads = VOID(NTAPI*)();
using PDbgkpResumeProcess = VOID(NTAPI*) (
_In_ PEPROCESS Process
);
using PPsQuerySystemDllInfo = PPS_SYSTEM_DLL_INFO(NTAPI*)(_In_ ULONG Type);
using PObFastReferenceObject = PVOID(NTAPI*) (
_In_ PEX_FAST_REF FastRef
);
using PObFastDereferenceObject = VOID(NTAPI*)(
_In_ PEX_FAST_REF FastRef,
_In_ PVOID Object
);
using PExfAcquirePushLockShared = PVOID(NTAPI*)(
_Inout_ PEX_PUSH_LOCK PushLock
);
using PExfReleasePushLockShared = PVOID(NTAPI*)(
_Inout_ PEX_PUSH_LOCK PushLock
);
using PObFastReferenceObjectLocked = PVOID(NTAPI*)(
_In_ PEX_FAST_REF FastRef
);
using PPsGetNextProcess = PEPROCESS (NTAPI*)(
_In_ PEPROCESS Process
);
// 创建调试对象
NTSTATUS
NTAPI
NewNtCreateDebugObject(
_Out_ PHANDLE DebugObjectHandle,
_In_ ACCESS_MASK DesiredAccess,
_In_ POBJECT_ATTRIBUTES ObjectAttributes,
_In_ ULONG Flags
);
// 与一个已经运行的进程建立调试会话
NTSTATUS
NewNtDebugActiveProcess(
_In_ HANDLE ProcessHandle,
_In_ HANDLE DebugObjectHandle
);
// 将一个调试对象附加到被调试进程中
NTSTATUS
DbgkpSetProcessDebugObject(
_In_ PEPROCESS Process,
_In_ PDEBUG_OBJECT DebugObject,
_In_ NTSTATUS MsgStatus,
_In_ PETHREAD LastThread
);
/**
* Emulation System
*
*/
// 向调试子系统发送虚假的进程创建消息
NTSTATUS DbgkpPostFakeProcessCreateMessages(
_In_ PEPROCESS Process,
_In_ PDEBUG_OBJECT DebugObject,
_In_ PETHREAD* pLastThread
);
// 向调试子系统发送虚假的线程创建消息
NTSTATUS DbgkpPostFakeThreadMessages(
PEPROCESS Process,
PDEBUG_OBJECT DebugObject,
PETHREAD StartThread,
PETHREAD* pFirstThread,
PETHREAD* pLastThread
);
// 向调试子系统发送虚假的模块加载消息
NTSTATUS DbgkpPostModuleMessages(
_In_ PEPROCESS Process,
_In_ PETHREAD Thread,
_In_ PDEBUG_OBJECT DebugObject
);
//PVOID ObFastReferenceObjectLocked(
// _In_ PEX_FAST_REF FastRef
//);
//
//PVOID ObFastDereferenceObject(
// _In_ PEX_FAST_REF FastRef,
// _In_ PVOID Object
//);
/**
* Event Collection Routine
*
*/
// 采集线程创建事件
VOID NewDbgkCreateThread(
PETHREAD Thread
);
// 线程退出消息
VOID NewDbgkExitThread(
NTSTATUS ExitStatus
);
// 进程退出消息
VOID NewDbgkExitProcess(
NTSTATUS ExitStatus
);
// 模块加载
VOID NewDbgkMapViewOfSection(
_In_ PEPROCESS Process,
_In_ PVOID SectionObject,
_In_ PVOID BaseAddress
);
// 模块卸载
VOID NewDbgkUnMapViewOfSection(
_In_ PEPROCESS Process,
_In_ PVOID BaseAddress
);
// 向一个调试对象的消息队列中追加调试事件
NTSTATUS DbgkpQueueMessage(
_In_ PEPROCESS Process,
_In_ PETHREAD Thread,
_Inout_ PDBGKM_APIMSG ApiMsg,
_In_ ULONG Flags,
_In_ PDEBUG_OBJECT TargetDebugObject
);
// 等待调试事件
NTSTATUS NewNtWaitForDebugEvent(
_In_ HANDLE DebugObjectHandle,
_In_ BOOLEAN Alertable,
_In_opt_ PLARGE_INTEGER Timeout,
_Out_ PDBGUI_WAIT_STATE_CHANGE WaitStateChange
);
// 回复调试事件,恢复被调试进程
NTSTATUS NewNtDebugContinue(
_In_ HANDLE DebugObjectHandle,
_In_ PCLIENT_ID AppClientId,
_In_ NTSTATUS ContinueStatus
);
// 分离调试会话
NTSTATUS NewNtRemoveProcessDebug(
_In_ HANDLE ProcessHandle,
_In_ HANDLE DebugObjectHandle
);
// 发送调试事件
NTSTATUS DbgkpSendApiMessage(
UCHAR Flags,
PDBGKM_APIMSG ApiMsg
);
//PSYSTEM_DLL_INFO PsQuerySystemDllInfo(
// ULONG index
//);
VOID ExAcquirePushLockShared(_In_ PEX_PUSH_LOCK_S PushLock);
VOID ExReleasePushLockShared(_In_ PEX_PUSH_LOCK_S PushLock);
LOGICAL ExFastRefDereference(
_Inout_ PEX_FAST_REF FastRef,
_In_ PVOID Object
);
EX_FAST_REF
ExFastReference(
_Inout_ PEX_FAST_REF FastRef
);
LOGICAL
ExFastRefAddAdditionalReferenceCounts(
_Inout_ PEX_FAST_REF FastRef,
_In_ PVOID Object,
_In_ ULONG RefsToAdd
);
// 取得Section对应的文件句柄
VOID DbgkSendSystemDllMessages(
PETHREAD Thread,
PDEBUG_OBJECT DebugObject,
PDBGKM_APIMSG ApiMsg
);
// 向当前进程的异常端口发送异常的第二轮处理机会
// 恢复被调试进程的执行
VOID DbgkpResumeProcess(
_In_opt_ PEPROCESS Process
);
// 向调试子系统发送异常消息
BOOLEAN NewDbgkForwardException(
_In_ PEXCEPTION_RECORD ExceptionRecord,
_In_ BOOLEAN DebugException,
_In_ BOOLEAN SecondChance
);
// 唤醒等待调试器回复的线程
// 释放调试事件
VOID DbgkpFreeDebugEvent(
_In_ PDEBUG_EVENT DebugEvent
);
// 设置进程环境块的BeingDebugged
VOID DbgkpMarkProcessPeb(
_In_ PEPROCESS Process
);
// 将内核模式的结构体转换为用户模式的结构体
//NTSTATUS MmGetFileNameForAddress(
// _In_ PVOID ProcessVa,
// _Out_ PUNICODE_STRING FileName
//);
NTSTATUS NewDbgkClearProcessDebugObject(
_In_ PEPROCESS Process,
_In_ PDEBUG_OBJECT SourceDebugObject
);
// 设置调试对象的属性
NTSTATUS NewNtSetInformationDebugObject(
_In_ HANDLE DebugObjectHandle,
_In_ DEBUG_OBJECT_INFORMATION_CLASS DebugObjectInformationClass,
_In_ PVOID DebugInformation,
_In_ ULONG DebugInformationLength,
_Out_opt_ PULONG ReturnLength
);
// 查询调试信息输出的过滤级别
// 设置调试信息输出的过滤级别
NTSTATUS NtSetDebugFilterState(
_In_ ULONG ComponentId,
_In_ ULONG Level,
_In_ BOOLEAN State
);
// 访问指定进程中的调试对象
NTSTATUS DbgkOpenProcessObject(
_In_ PEPROCESS Process,
_In_ PACCESS_STATE AccessState,
_In_ ACCESS_MASK DesiredAccess
);
// 打开进程,线程对象,增加引用计数
// 关闭调试对象
VOID DbgkpCloseObject(
_In_ PEPROCESS Process,
_In_ PVOID Object,
_In_ ACCESS_MASK GrantedAccess,
_In_ ULONG_PTR ProcessHandleCount,
_In_ ULONG_PTR SystemHandleCount
);
// 拷贝调试对象
NTSTATUS NewDbgkCopyProcessDebugPort(
_In_ PEPROCESS TargetProcess,
_In_ PEPROCESS SourceProcess,
_In_ PDEBUG_OBJECT DebugObject,
_Out_ PBOOLEAN bFlag
);
VOID DbgkpDeleteObject(_In_ PDEBUG_OBJECT DebugObject);