首页
社区
课程
招聘
[原创] DbgkSendSystemDllMessages的实现
2022-11-20 10:32 7145

[原创] DbgkSendSystemDllMessages的实现

2022-11-20 10:32
7145

WINX64重建调试体系
最近在学习重构WIN10的调试体系,顺便熟悉一下X64汇编,上面那个链接是关于WIN7的,给了我很大的启发(COPY),但是其中有一个函数也就是DbgkSendSystemDllMessages,贴主并没有实现,虽然说没有实现的必要,但是我有强迫症,搜索了国内国外的资料发现没有能够让我COPY的,所以我就自己逆了一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
VOID hkDbgkSendSystemDllMessages(
    PETHREAD        Thread,
    PDEBUG_OBJECT    DebugObject,
    PDBGKM_APIMSG    ApiMsg
    )
{
    PMYEPROCESS Process;
    DBGKM_LOAD_DLL* LoadDllInfo;
    PSYSTEM_DLL_INFO SystemDllInfo;
    PTEB teb;
    BOOLEAN Flags;
    KAPC_STATE ApcState;
    PIMAGE_NT_HEADERS NtHeaders;
    PMYETHREAD CurrentThread;
    OBJECT_ATTRIBUTES ObjectAttributes;
    IO_STATUS_BLOCK IoStatusBlock;
    NTSTATUS status;
    if (Thread)
    {
        Process = (PMYEPROCESS)Thread->Process;
    }
    else
    {
        Process = (PMYEPROCESS)PsGetCurrentThread()->ApcState.Process;
    }
    LoadDllInfo = &ApiMsg->u.LoadDll;
    for (int i = 0; i < 6; ++i)
    {
        SystemDllInfo = (PSYSTEM_DLL_INFO)pPsQuerySystemDllInfo(i);
 
        if (!SystemDllInfo)
        {
            continue;
        }
        if (i > 0)
        {
            if (!SystemDllInfo->Flags ||
                !Process->WoW64Process ||
                i != (unsigned int)pPsWow64GetProcessNtdllType((PEPROCESS)Process))
            {
                continue;
            }
        }
 
        memset(LoadDllInfo, 0, sizeof(DBGKM_LOAD_DLL));
        teb = NULL;
        LoadDllInfo->BaseOfDll = SystemDllInfo->pDllBase;
 
        if (Thread && i)
        {
            //只有第一次循环不会附加到进程
            Flags = TRUE;
            KeStackAttachProcess((PEPROCESS)Process, &ApcState);
        }
        else
        {
            Flags = FALSE;
        }
 
        __try
        {
            NtHeaders = RtlImageNtHeader(LoadDllInfo->BaseOfDll);
            if (NtHeaders)
            {
                LoadDllInfo->DebugInfoFileOffset = NtHeaders->FileHeader.PointerToSymbolTable;
                LoadDllInfo->DebugInfoSize = NtHeaders->FileHeader.NumberOfSymbols;
            }
            if (!Thread)
            {
                CurrentThread = (PMYETHREAD)PsGetCurrentThread();
 
                if (CurrentThread->Tcb.SystemThread != 0 || CurrentThread->Tcb.ApcStateIndex == 1)
                {
                    teb = NULL;
                }
                else {
                    teb = (PTEB)CurrentThread->Tcb.Teb;
                }
                if (teb)
                {
                    RtlStringCbCopyW(teb->StaticUnicodeBuffer, sizeof(teb->StaticUnicodeBuffer), (NTSTRSAFE_PCWSTR)SystemDllInfo->StaticUnicodeBuffer);
                    teb->NtTib.ArbitraryUserPointer = (UINT64)teb->StaticUnicodeBuffer;
                    LoadDllInfo->NamePointer = &teb->NtTib.ArbitraryUserPointer;
 
                }
            }
        }
        __except(EXCEPTION_EXECUTE_HANDLER){
 
            LoadDllInfo->DebugInfoFileOffset = 0;
            LoadDllInfo->DebugInfoSize = 0;
            LoadDllInfo->NamePointer = NULL;
        }
 
        if (Flags)
        {
            KeUnstackDetachProcess(&ApcState);
        }
 
        ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
        ObjectAttributes.RootDirectory = NULL;
        ObjectAttributes.ObjectName = SystemDllInfo->szDllFullName;
        ObjectAttributes.Attributes = OBJ_FORCE_ACCESS_CHECK | OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE;
        ObjectAttributes.SecurityDescriptor = NULL;
        ObjectAttributes.SecurityQualityOfService = NULL;
 
        status = ZwOpenFile(
            &LoadDllInfo->FileHandle,
            GENERIC_READ | SYNCHRONIZE,
            &ObjectAttributes,
            &IoStatusBlock,
            FILE_SHARE_VALID_FLAGS,
            FILE_SYNCHRONOUS_IO_NONALERT
        );
 
        if (!NT_SUCCESS(status))
        {
            LoadDllInfo->FileHandle = NULL;
        }
        ApiMsg->h.u1.Length = 0x500028;
        ApiMsg->h.u2.ZeroInit = 0x8;
        ApiMsg->ApiNumber = DbgKmLoadDllApi;
        if (Thread)
        {
            status = pDbgkpQueueMessage((PEPROCESS)Process, Thread, ApiMsg, DEBUG_EVENT_NOWAIT, DebugObject);
            if (!NT_SUCCESS(status) && LoadDllInfo->FileHandle)
            {
                ObCloseHandle(LoadDllInfo->FileHandle, KernelMode);
            }
        }
        else
        {
            pDbgkpSendApiMessage((PEPROCESS)Process, DEBUG_EVENT_NOWAIT | DEBUG_EVENT_READ, ApiMsg);
            if (LoadDllInfo->FileHandle)
                ObCloseHandle(LoadDllInfo->FileHandle, KernelMode);
            __try
            {
                if (teb)
                    teb->NtTib.ArbitraryUserPointer = NULL;
            }
            __except (EXCEPTION_EXECUTE_HANDLER)
            {
 
            }
        }
    }
}

再次感谢tmflxw大佬,前人栽树后人乘凉,我们都是站在巨人的肩膀上


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞1
打赏
分享
最新回复 (1)
雪    币: 3654
活跃值: (3828)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 2022-11-21 08:56
2
0
感谢分享
游客
登录 | 注册 方可回帖
返回