mirror of
https://github.com/BeneficialCode/WinArk.git
synced 2026-10-18 05:36:10 +08:00
362 lines
6.9 KiB
C
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); |