首页
社区
课程
招聘
10
[原创]SEH分析笔记(X64篇)
发表于: 2011-11-4 20:02 26203

[原创]SEH分析笔记(X64篇)

2011-11-4 20:02
26203

SEH分析笔记(X64篇)
        v1.0.0
        boxcounter

        历史:
        v1.0.0, 2011-11-4:最初版本。

        [不介意转载,但请注明出处 www.boxcounter.com
        附件里有本文的原始稿,一样的内容,更好的高亮和排版。
        本文的部分代码可能会因为论坛的自动换行变得很乱,需要的朋友手动复制到自己的代码编辑器就可以正常显示了]

        在之前的《SEH分析笔记(X86篇)》中,我借助 wrk1.2 介绍了 x86 下 windows 系统内核中的 SEH 实现。这次我们来看看 x64 位 windows 系统内核中 SEH 的实现。
        本文需要大家熟悉 x64 位系统的一些特性,比如调用约定、Prolog 和 Epilog。可以通过这几篇文章熟悉一下:
        Overview of x64 Calling Conventions, MSDN
        The history of calling conventions, part 5: amd64 , The Old New Thing
        Everything You Need To Know To Start Programming 64-Bit Windows Systems, Matt Pietrek

        首先回顾一下前一篇文章。
        在 x86 windows 中,函数通过以下几个步骤来参与 SEH :
        1. 在自身的栈空间中分配并初始化一个 EXCEPTION_REGISTRATION(_RECORD) 结构体。
        2. 将该 EXCEPTION_REGISTRATION(_RECORD) 挂入当前线程的异常链表。

        当某函数触发异常时,系统首先会通过调用 KiDispatchException 来给内核调试器一个机会,如果内核调试器没有处理该异常,则该机会被转给 RtlDispatchException,这个函数就开始分发该异常。分发过程为:
        从当前线程的异常链表头开始遍历,对于每一个 SEH 注册信息(即 EXCEPTION_REGISTRATION(_RECORD)),调用其 Handler。根据 Handler 的返回值做相应的后续处理:
                1. 返回 ExceptionContinueExecution,表示 Handler 已经修复了异常触发点,从异常触发点继续执行。
                2. 返回 ExceptionContinueSearch,表示该 Handler 没有处理该异常,继续遍历异常链表。
                3. Handler 没有修复异常触发点,但是却能处理该异常(某个 __except 过滤代码返回 EXCEPTION_EXECUTE_HANDLER)。这种情况下,处理完该异常后就从异常解决代码(__except 代码块)继续执行,Handler 不会返回。
        以上是简略的 x86 SEH 流程,其中省略了很多细节,比如展开、错误处理、ExceptionNestedException 和 ExceptionCollidedUnwind 等等。

        之所以在这里重温这个流程,是因为 x64 中 SEH 的流程总体思路也是如此,只是细节上做了一些修改。但这并不表示熟悉 x86 SEH 就能很轻松的掌握 x64 SEH。

        本文分为四个部分:“异常注册”、“异常分发”、“展开、解决”和“ExceptionNestedException 和 ExceptionCollidedUnwind”。依然以 MSC 的增强版为分析对象。分析环境为:WDK 7600.16385.1,内置的 cl 的版本是15.00.30729.207,link 的版本是9.00.30729.207,测试虚拟机系统为 amd64 WinXP + wrk1.2。
       
        在讲述之前,需要先定义几个名词,以简化后续的讲述。

        RVA —— 熟悉 PE 格式的朋友都懂的,表示某个绝对地址相对于所在模块的基地址的偏移。
        EXCEPT_POINT —— 异常触发点。
        EXCEPT_FILTER —— __except 小括号内的异常过滤代码。
        EXCEPT_HANDLER —— __except 大括号内的异常解决代码。
        FINALLY_HANDLER —— __finally 大括号内的代码。

        以下面的伪码为例,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[font=Consolas][color=#000000]    [/color][color=#800080]1  [/color][color=#000000]__try
    [/color][color=#800080]2  [/color][color=#000080]{
    [/color][color=#800080]3      [/color][color=#000000]__try
    [/color][color=#800080]4      [/color][color=#000080]{
    [/color][color=#800080]5           [/color][color=#000080]*(([/color][color=#000000]ULONG[/color][color=#000080]*)[/color][color=#000000]NULL[/color][color=#000080]) = [/color][color=#800080]0[/color][color=#000080];
    [/color][color=#800080]6      [/color][color=#000080]}
    [/color][color=#800080]7      [/color][color=#000000]__except[/color][color=#000080](([/color][color=#000000]STATUS_INVALID_PARAMETER [/color][color=#000080]== [/color][color=#000000]GetExceptionCode[/color][color=#000080]()) ? [/color][color=#000000]EXCEPTION_CONTINUE_SEARCH [/color][color=#000080]: [/color][color=#000000]EXCEPTION_EXECUTE_HANDLER[/color][color=#000080])
    [/color][color=#800080]8      [/color][color=#000080]{
    [/color][color=#800080]9          [/color][color=#000080]...
    [/color][color=#800080]10     [/color][color=#000080]}
    [/color][color=#800080]11 [/color][color=#000080]}
    [/color][color=#800080]12 [/color][color=#000000]__finally
    [/color][color=#800080]13 [/color][color=#000080]{
    [/color][color=#800080]14     [/color][color=#000080]...
    [/color][color=#800080]15 [/color][color=#000080]{[/color][/font]
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
[font=Consolas][color=#000000]    [/color][color=#0000FF]typedef struct [/color][color=#000000]_RUNTIME_FUNCTION [/color][color=#000080]{
        [/color][color=#000000]ULONG BeginAddress[/color][color=#000080];
        [/color][color=#000000]ULONG EndAddress[/color][color=#000080];
        [/color][color=#000000]ULONG UnwindData[/color][color=#000080];
    } [/color][color=#000000]RUNTIME_FUNCTION[/color][color=#000080], *[/color][color=#000000]PRUNTIME_FUNCTION[/color][color=#000080];
 
    [/color][color=#0000FF]typedef enum [/color][color=#000000]_UNWIND_OP_CODES [/color][color=#000080]{
        [/color][color=#000000]UWOP_PUSH_NONVOL [/color][color=#000080]= [/color][color=#800080]0[/color][color=#000080],
        [/color][color=#000000]UWOP_ALLOC_LARGE[/color][color=#000080],       [/color][color=#008000]// 1
        [/color][color=#000000]UWOP_ALLOC_SMALL[/color][color=#000080],       [/color][color=#008000]// 2
        [/color][color=#000000]UWOP_SET_FPREG[/color][color=#000080],         [/color][color=#008000]// 3
        [/color][color=#000000]UWOP_SAVE_NONVOL[/color][color=#000080],       [/color][color=#008000]// 4
        [/color][color=#000000]UWOP_SAVE_NONVOL_FAR[/color][color=#000080],   [/color][color=#008000]// 5
        [/color][color=#000000]UWOP_SPARE_CODE1[/color][color=#000080],       [/color][color=#008000]// 6
        [/color][color=#000000]UWOP_SPARE_CODE2[/color][color=#000080],       [/color][color=#008000]// 7
        [/color][color=#000000]UWOP_SAVE_XMM128[/color][color=#000080],       [/color][color=#008000]// 8
        [/color][color=#000000]UWOP_SAVE_XMM128_FAR[/color][color=#000080],   [/color][color=#008000]// 9
        [/color][color=#000000]UWOP_PUSH_MACHFRAME     [/color][color=#008000]// 10
    [/color][color=#000080]} [/color][color=#000000]UNWIND_OP_CODES[/color][color=#000080], *[/color][color=#000000]PUNWIND_OP_CODES[/color][color=#000080];
 
    [/color][color=#0000FF]typedef union [/color][color=#000000]_UNWIND_CODE [/color][color=#000080]{
        [/color][color=#0000FF]struct [/color][color=#000080]{
            [/color][color=#000000]UCHAR CodeOffset[/color][color=#000080];
            [/color][color=#000000]UCHAR UnwindOp [/color][color=#000080]: [/color][color=#800080]4[/color][color=#000080];
            [/color][color=#000000]UCHAR OpInfo [/color][color=#000080]: [/color][color=#800080]4[/color][color=#000080];
        };
     
        [/color][color=#000000]USHORT FrameOffset[/color][color=#000080];
    } [/color][color=#000000]UNWIND_CODE[/color][color=#000080], *[/color][color=#000000]PUNWIND_CODE[/color][color=#000080];
     
    [/color][color=#0000FF]#define [/color][color=#000000]UNW_FLAG_NHANDLER [/color][color=#800080]0x0
    [/color][color=#0000FF]#define [/color][color=#000000]UNW_FLAG_EHANDLER [/color][color=#800080]0x1
    [/color][color=#0000FF]#define [/color][color=#000000]UNW_FLAG_UHANDLER [/color][color=#800080]0x2
    [/color][color=#0000FF]#define [/color][color=#000000]UNW_FLAG_CHAININFO [/color][color=#800080]0x4
 
    [/color][color=#0000FF]typedef struct [/color][color=#000000]_UNWIND_INFO [/color][color=#000080]{
        [/color][color=#000000]UCHAR Version [/color][color=#000080]: [/color][color=#800080]3[/color][color=#000080];
        [/color][color=#000000]UCHAR Flags [/color][color=#000080]: [/color][color=#800080]5[/color][color=#000080];
        [/color][color=#000000]UCHAR SizeOfProlog[/color][color=#000080];
        [/color][color=#000000]UCHAR CountOfCodes[/color][color=#000080];
        [/color][color=#000000]UCHAR FrameRegister [/color][color=#000080]: [/color][color=#800080]4[/color][color=#000080];
        [/color][color=#000000]UCHAR FrameOffset [/color][color=#000080]: [/color][color=#800080]4[/color][color=#000080];
        [/color][color=#000000]UNWIND_CODE UnwindCode[/color][color=#000080][[/color][color=#800080]1[/color][color=#000080]];
     
    [/color][color=#008000]//
    // The unwind codes are followed by an optional DWORD aligned field that
    // contains the exception handler address or a function table entry if
    // chained unwind information is specified. If an exception handler address
    // is specified, then it is followed by the language specified exception
    // handler data.
    //
    //  union {
    //      struct {
    //          ULONG ExceptionHandler;
    //          ULONG ExceptionData[];
    //      };
    //
    //      RUNTIME_FUNCTION FunctionEntry;
    //  };
    //
     
    [/color][color=#000080]} [/color][color=#000000]UNWIND_INFO[/color][color=#000080], *[/color][color=#000000]PUNWIND_INFO[/color][color=#000080];
 
    [/color][color=#0000FF]typedef struct [/color][color=#000000]_SCOPE_TABLE [/color][color=#000080]{
        [/color][color=#000000]ULONG Count[/color][color=#000080];
        [/color][color=#0000FF]struct
        [/color][color=#000080]{
            [/color][color=#000000]ULONG BeginAddress[/color][color=#000080];
            [/color][color=#000000]ULONG EndAddress[/color][color=#000080];
            [/color][color=#000000]ULONG HandlerAddress[/color][color=#000080];
            [/color][color=#000000]ULONG JumpTarget[/color][color=#000080];
        } [/color][color=#000000]ScopeRecord[/color][color=#000080][[/color][color=#800080]1[/color][color=#000080]];
    } [/color][color=#000000]SCOPE_TABLE[/color][color=#000080], *[/color][color=#000000]PSCOPE_TABLE[/color][color=#000080];[/color][/font]
1
2
3
4
5
6
7
8
VOID
KiDispatchException (
    IN PEXCEPTION_RECORD ExceptionRecord,
    IN PKEXCEPTION_FRAME ExceptionFrame,
    IN PKTRAP_FRAME TrapFrame,
    IN KPROCESSOR_MODE PreviousMode,
    IN BOOLEAN FirstChance
    );
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
[font=Consolas][color=#000000]    [/color][color=#0000FF]#define [/color][color=#000000]UNWIND_HISTORY_TABLE_SIZE [/color][color=#800080]12
     
    [/color][color=#0000FF]typedef struct [/color][color=#000000]_UNWIND_HISTORY_TABLE_ENTRY [/color][color=#000080]{
            [/color][color=#000000]ULONG64 ImageBase[/color][color=#000080];
            [/color][color=#000000]PRUNTIME_FUNCTION FunctionEntry[/color][color=#000080];
    } [/color][color=#000000]UNWIND_HISTORY_TABLE_ENTRY[/color][color=#000080], *[/color][color=#000000]PUNWIND_HISTORY_TABLE_ENTRY[/color][color=#000080];
     
    [/color][color=#0000FF]#define [/color][color=#000000]UNWIND_HISTORY_TABLE_NONE [/color][color=#800080]0
    [/color][color=#0000FF]#define [/color][color=#000000]UNWIND_HISTORY_TABLE_GLOBAL [/color][color=#800080]1
    [/color][color=#0000FF]#define [/color][color=#000000]UNWIND_HISTORY_TABLE_LOCAL [/color][color=#800080]2
     
    [/color][color=#0000FF]typedef struct [/color][color=#000000]_UNWIND_HISTORY_TABLE [/color][color=#000080]{
            [/color][color=#000000]ULONG Count[/color][color=#000080];
            [/color][color=#000000]UCHAR Search[/color][color=#000080];
            [/color][color=#000000]ULONG64 LowAddress[/color][color=#000080];
            [/color][color=#000000]ULONG64 HighAddress[/color][color=#000080];
            [/color][color=#000000]UNWIND_HISTORY_TABLE_ENTRY Entry[/color][color=#000080][[/color][color=#000000]UNWIND_HISTORY_TABLE_SIZE[/color][color=#000080]];
    } [/color][color=#000000]UNWIND_HISTORY_TABLE[/color][color=#000080], *[/color][color=#000000]PUNWIND_HISTORY_TABLE[/color][color=#000080];
 
    [/color][color=#000000]PRUNTIME_FUNCTION
    RtlLookupFunctionEntry [/color][color=#000080](
        [/color][color=#000000]IN ULONG64 ControlPc[/color][color=#000080],
        [/color][color=#000000]OUT PULONG64 ImageBase[/color][color=#000080],
        [/color][color=#000000]IN OUT PUNWIND_HISTORY_TABLE HistoryTable OPTIONAL
        [/color][color=#000080]);[/color][/font]
1
2
3
4
5
6
7
8
9
10
11
PEXCEPTION_ROUTINE
RtlVirtualUnwind (
    IN ULONG HandlerType,
    IN ULONG64 ImageBase,
    IN ULONG64 ControlPc,
    IN PRUNTIME_FUNCTION FunctionEntry,
    IN OUT PCONTEXT ContextRecord,
    OUT PVOID *HandlerData,
    OUT PULONG64 EstablisherFrame,
    IN OUT PKNONVOLATILE_CONTEXT_POINTERS ContextPointers OPTIONAL
    );
1
2
3
4
5
6
7
EXCEPTION_DISPOSITION
RtlpExecuteHandlerForException (
    IN PEXCEPTION_RECORD ExceptionRecord,
    IN PVOID EstablisherFrame,
    IN OUT PCONTEXT ContextRecord,
    IN OUT PVOID DispatcherContext
    );
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct _DISPATCHER_CONTEXT {
    ULONG64 ControlPc;
    ULONG64 ImageBase;
    PRUNTIME_FUNCTION FunctionEntry;
    ULONG64 EstablisherFrame;
    ULONG64 TargetIp;
    PCONTEXT ContextRecord;
    PEXCEPTION_ROUTINE LanguageHandler;
    PVOID HandlerData;
    PUNWIND_HISTORY_TABLE HistoryTable;
    ULONG ScopeIndex;
    ULONG Fill0;
} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
1
2
3
4
5
6
7
EXCEPTION_DISPOSITION
__C_specific_handler (
    IN PEXCEPTION_RECORD pExceptionRecord,
    IN PVOID pEstablisherFrame,
    IN OUT PCONTEXT pContext,
    IN OUT PVOID pDispatcherContext
    );
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
[font=Consolas][color=#000000]               kd[/color][color=#0A246A]> [/color][color=#000000]uf nt!__C_specific_handler
               nt!__C_specific_handler[/color][color=#0A246A]:
               [/color][color=#000000]fffff800`[/color][color=#800080]008a42d0 [/color][color=#0A246A]mov     qword ptr [[/color][color=#000000]rsp[/color][color=#0A246A]+[/color][color=#800080]10h[/color][color=#0A246A]],[/color][color=#000000]rdx [/color][color=#008000]; 在栈上保存 pEstablisherFrame
               [/color][color=#000000]fffff800`[/color][color=#800080]008a42d5 [/color][color=#0A246A]mov     [/color][color=#000000]rax[/color][color=#0A246A],[/color][color=#000000]rsp
               fffff800`[/color][color=#800080]008a42d8 [/color][color=#0A246A]sub     [/color][color=#000000]rsp[/color][color=#0A246A],[/color][color=#800080]88h
               [/color][color=#000000]fffff800`[/color][color=#800080]008a42df [/color][color=#0A246A]mov     qword ptr [[/color][color=#000000]rax[/color][color=#0A246A]-[/color][color=#800080]8[/color][color=#0A246A]],[/color][color=#000000]rbx
               fffff800`[/color][color=#800080]008a42e3 [/color][color=#0A246A]mov     qword ptr [[/color][color=#000000]rax[/color][color=#0A246A]-[/color][color=#800080]10h[/color][color=#0A246A]],[/color][color=#000000]rbp
               fffff800`[/color][color=#800080]008a42e7 [/color][color=#0A246A]mov     [/color][color=#000000]rbp[/color][color=#0A246A],qword ptr [[/color][color=#000000]r9[/color][color=#0A246A]]      [/color][color=#008000]; rbp = pDispatcherContext->ControlPc
               [/color][color=#000000]fffff800`[/color][color=#800080]008a42ea [/color][color=#0A246A]mov     qword ptr [[/color][color=#000000]rax[/color][color=#0A246A]-[/color][color=#800080]18h[/color][color=#0A246A]],[/color][color=#000000]rsi
               fffff800`[/color][color=#800080]008a42ee [/color][color=#0A246A]mov     qword ptr [[/color][color=#000000]rax[/color][color=#0A246A]-[/color][color=#800080]20h[/color][color=#0A246A]],[/color][color=#000000]rdi
               fffff800`[/color][color=#800080]008a42f2 [/color][color=#0A246A]mov     qword ptr [[/color][color=#000000]rax[/color][color=#0A246A]-[/color][color=#800080]28h[/color][color=#0A246A]],[/color][color=#000000]r12
               fffff800`[/color][color=#800080]008a42f6 [/color][color=#0A246A]mov     [/color][color=#000000]r12[/color][color=#0A246A],qword ptr [[/color][color=#000000]r9[/color][color=#0A246A]+[/color][color=#800080]38h[/color][color=#0A246A]]  [/color][color=#008000]; r12 = pDispatcherContext->HandlerData
               [/color][color=#000000]fffff800`[/color][color=#800080]008a42fa [/color][color=#0A246A]mov     qword ptr [[/color][color=#000000]rax[/color][color=#0A246A]-[/color][color=#800080]30h[/color][color=#0A246A]],[/color][color=#000000]r13
               fffff800`[/color][color=#800080]008a42fe [/color][color=#0A246A]mov     qword ptr [[/color][color=#000000]rax[/color][color=#0A246A]-[/color][color=#800080]38h[/color][color=#0A246A]],[/color][color=#000000]r14
               fffff800`[/color][color=#800080]008a4302 [/color][color=#0A246A]mov     [/color][color=#000000]r14[/color][color=#0A246A],qword ptr [[/color][color=#000000]r9[/color][color=#0A246A]+[/color][color=#800080]8[/color][color=#0A246A]]    [/color][color=#008000]; r14 = pDispatcherContext->ImageBase
               [/color][color=#000000]fffff800`[/color][color=#800080]008a4306 [/color][color=#0A246A]mov     qword ptr [[/color][color=#000000]rax[/color][color=#0A246A]-[/color][color=#800080]40h[/color][color=#0A246A]],[/color][color=#000000]r15
               fffff800`[/color][color=#800080]008a430a [/color][color=#0A246A]mov     [/color][color=#000000]r13[/color][color=#0A246A],[/color][color=#000000]r9                  [/color][color=#008000]; r13 = pDispatcherContext
               [/color][color=#000000]fffff800`[/color][color=#800080]008a430d [/color][color=#0A246A]sub     [/color][color=#000000]rbp[/color][color=#0A246A],[/color][color=#000000]r14                 [/color][color=#008000]; l_OffsetInFunc = pDispatcherContext->ControlPc - pDispatcherContext->ImageBase
               [/color][color=#000000]fffff800`[/color][color=#800080]008a4310 [/color][color=#0A246A]test    byte ptr [[/color][color=#000000]rcx[/color][color=#0A246A]+[/color][color=#800080]4[/color][color=#0A246A]],[/color][color=#800080]66h    [/color][color=#008000]; pExceptionRecord->ExceptionFlags, EXCEPTION_UNWIND (0x66)
               [/color][color=#000000]fffff800`[/color][color=#800080]008a4314 [/color][color=#0A246A]mov     [/color][color=#000000]rsi[/color][color=#0A246A],[/color][color=#000000]rdx                 [/color][color=#008000]; rsi = pEstablisherFrame
               [/color][color=#000000]fffff800`[/color][color=#800080]008a4317 [/color][color=#0A246A]mov     [/color][color=#000000]r15[/color][color=#0A246A],[/color][color=#000000]rcx                 [/color][color=#008000]; r15 = pExceptionRecord
[/color][color=#0A246A]<              [/color][color=#000000]fffff800`[/color][color=#800080]008a431a [/color][color=#0A246A]jne     [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0xf5 [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a43c5[/color][color=#0A246A])
:             
:              -------------------------------------------------------------------
:              [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x50[/color][color=#0A246A]:
:              [/color][color=#000000]fffff800`[/color][color=#800080]008a4320 [/color][color=#000000]movsxd  rdi[/color][color=#0A246A],dword ptr [[/color][color=#000000]r9[/color][color=#0A246A]+[/color][color=#800080]48h[/color][color=#0A246A]]  [/color][color=#008000]; l_ScopeIndex (rdi) = pDispatcherContext->ScopeIndex
[/color][color=#0A246A]:              [/color][color=#000000]fffff800`[/color][color=#800080]008a4324 [/color][color=#0A246A]mov     qword ptr [[/color][color=#000000]rax[/color][color=#0A246A]-[/color][color=#800080]58h[/color][color=#0A246A]],[/color][color=#000000]rcx [/color][color=#008000]; [rax-58h] = pExceptionRecord,供给 GetExceptionCode(Information) 使用
[/color][color=#0A246A]:              [/color][color=#000000]fffff800`[/color][color=#800080]008a4328 [/color][color=#0A246A]mov     qword ptr [[/color][color=#000000]rax[/color][color=#0A246A]-[/color][color=#800080]50h[/color][color=#0A246A]],[/color][color=#000000]r8  [/color][color=#008000]; [rax-50h] = pContext,供给 GetExceptionCode(Information) 使用
[/color][color=#0A246A]:              [/color][color=#000000]fffff800`[/color][color=#800080]008a432c [/color][color=#0A246A]cmp     [/color][color=#FF8000]edi[/color][color=#0A246A],dword ptr [[/color][color=#000000]r12[/color][color=#0A246A]]     [/color][color=#008000]; cmp l_ScopeIndex, pDispatcherContext->HandlerData->Count
[/color][color=#0A246A]:              [/color][color=#000000]fffff800`[/color][color=#800080]008a4330 [/color][color=#0A246A]mov     [/color][color=#000000]rax[/color][color=#0A246A],[/color][color=#000000]rdi                 [/color][color=#008000]; rax = l_ScopeIndex
[/color][color=#0A246A]:<             [/color][color=#000000]fffff800`[/color][color=#800080]008a4333 [/color][color=#0A246A]jae     [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x166 [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a4436[/color][color=#0A246A])
::            
::             [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x69[/color][color=#0A246A]:
::             [/color][color=#000000]fffff800`[/color][color=#800080]008a4339 [/color][color=#0A246A]add     [/color][color=#000000]rax[/color][color=#0A246A],[/color][color=#000000]rax             [/color][color=#008000]; 这里 *2,下面紧接着 *8,目的是跳过指定数目的 ScopeRecord(大小为16字节)
[/color][color=#0A246A]::             [/color][color=#000000]fffff800`[/color][color=#800080]008a433c [/color][color=#0A246A]lea     [/color][color=#000000]rbx[/color][color=#0A246A],[[/color][color=#000000]r12[/color][color=#0A246A]+[/color][color=#000000]rax[/color][color=#0A246A]*[/color][color=#800080]8[/color][color=#0A246A]+[/color][color=#800080]0Ch[/color][color=#0A246A]] [/color][color=#008000]; rbx = &(pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].HandlerAddress)
[/color][color=#0A246A]::            
::             [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x71[/color][color=#0A246A]:
::             [/color][color=#008000]; 检查 ControlPc 处于哪个 __try 保护域,之步骤一
[/color][color=#0A246A]::      >      [/color][color=#000000]fffff800`[/color][color=#800080]008a4341 [/color][color=#0A246A]mov     [/color][color=#FF8000]eax[/color][color=#0A246A],dword ptr [[/color][color=#000000]rbx[/color][color=#0A246A]-[/color][color=#800080]8[/color][color=#0A246A]] [/color][color=#008000]; eax = pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].BeginAddress
[/color][color=#0A246A]::      :      [/color][color=#000000]fffff800`[/color][color=#800080]008a4344 [/color][color=#0A246A]cmp     [/color][color=#000000]rbp[/color][color=#0A246A],[/color][color=#000000]rax               [/color][color=#008000]; cmp l_OffsetInFunc, pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].BeginAddress
[/color][color=#0A246A]::<     :      [/color][color=#000000]fffff800`[/color][color=#800080]008a4347 [/color][color=#0A246A]jb      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0xdd [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a43ad[/color][color=#0A246A])
:::     :     
:::     :      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x79[/color][color=#0A246A]:
:::     :      [/color][color=#008000]; 检查 ControlPc 处于哪个 __try 保护域,之步骤二
[/color][color=#0A246A]:::     :      [/color][color=#000000]fffff800`[/color][color=#800080]008a4349 [/color][color=#0A246A]mov     [/color][color=#FF8000]eax[/color][color=#0A246A],dword ptr [[/color][color=#000000]rbx[/color][color=#0A246A]-[/color][color=#800080]4[/color][color=#0A246A]] [/color][color=#008000]; eax = pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].EndAddress
[/color][color=#0A246A]:::     :      [/color][color=#000000]fffff800`[/color][color=#800080]008a434c [/color][color=#0A246A]cmp     [/color][color=#000000]rbp[/color][color=#0A246A],[/color][color=#000000]rax               [/color][color=#008000]; cmp l_OffsetInFunc, pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].EndAddress
[/color][color=#0A246A]:::<    :      [/color][color=#000000]fffff800`[/color][color=#800080]008a434f [/color][color=#0A246A]jae     [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0xdd [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a43ad[/color][color=#0A246A])
::::    :     
::::    :      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x81[/color][color=#0A246A]:
::::    :      [/color][color=#008000]; 判断是否是 __try/__finally(JumpTarget 为 NULL)。如果是,那么跳转到下一个 ScopeRecord 继续遍历。
[/color][color=#0A246A]::::    :      [/color][color=#000000]fffff800`[/color][color=#800080]008a4351 [/color][color=#0A246A]cmp     dword ptr [[/color][color=#000000]rbx[/color][color=#0A246A]+[/color][color=#800080]4[/color][color=#0A246A]],[/color][color=#800080]0 [/color][color=#008000]; cmp pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].JumpTarget, NULL
[/color][color=#0A246A]::::<   :      [/color][color=#000000]fffff800`[/color][color=#800080]008a4355 [/color][color=#0A246A]je      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0xdd [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a43ad[/color][color=#0A246A])
:::::   :     
:::::   :      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x87[/color][color=#0A246A]:
:::::   :      [/color][color=#008000]; 到这里,已经找到与异常地址最匹配的 __try/__except
[/color][color=#0A246A]:::::   :      [/color][color=#000000]fffff800`[/color][color=#800080]008a4357 [/color][color=#0A246A]mov     [/color][color=#FF8000]eax[/color][color=#0A246A],dword ptr [[/color][color=#000000]rbx[/color][color=#0A246A]] [/color][color=#008000]; eax = pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].HandlerAddress
[/color][color=#0A246A]:::::   :      [/color][color=#000000]fffff800`[/color][color=#800080]008a4359 [/color][color=#0A246A]cmp     [/color][color=#FF8000]eax[/color][color=#0A246A],[/color][color=#800080]1               [/color][color=#008000]; cmp pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].HandlerAddress, EXCEPTION_EXECUTE_HANDLER (0x1)
[/color][color=#0A246A]:::::<  :      [/color][color=#000000]fffff800`[/color][color=#800080]008a435c [/color][color=#0A246A]je      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0xa3 [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a4373[/color][color=#0A246A]) [/color][color=#008000]; 如果返回 EXCEPTION_EXECUTE_HANDLER 则跳转
[/color][color=#0A246A]::::::  :     
::::::  :      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x8e[/color][color=#0A246A]:
::::::  :      [/color][color=#008000]; 是 __try/__except,且过滤域并不是 EXCEPTION_EXECUTE_HANDLER,执行 HandlerAddress
[/color][color=#0A246A]::::::  :      [/color][color=#008000]; (注:HandlerAddress 指向的函数仍有可能会返回 EXCEPTION_EXECUTE_HANDLER)
[/color][color=#0A246A]::::::  :      [/color][color=#000000]fffff800`[/color][color=#800080]008a435e [/color][color=#0A246A]lea     [/color][color=#000000]rcx[/color][color=#0A246A],[[/color][color=#000000]rsp[/color][color=#0A246A]+[/color][color=#800080]30h[/color][color=#0A246A]]
::::::  :      [/color][color=#000000]fffff800`[/color][color=#800080]008a4363 [/color][color=#0A246A]add     [/color][color=#000000]rax[/color][color=#0A246A],[/color][color=#000000]r14 [/color][color=#008000]; rax = pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].HandlerAddress + pDispatcherContext->ImageBase
[/color][color=#0A246A]::::::  :      [/color][color=#000000]fffff800`[/color][color=#800080]008a4366 [/color][color=#0A246A]mov     [/color][color=#000000]rdx[/color][color=#0A246A],[/color][color=#000000]rsi [/color][color=#008000]; rdx = pEstablisherFrame
[/color][color=#0A246A]::::::  :      [/color][color=#000000]fffff800`[/color][color=#800080]008a4369 [/color][color=#0A246A]call    [/color][color=#000000]rax     [/color][color=#008000]; 调用 EXCEPT_FILTER
[/color][color=#0A246A]::::::  :      [/color][color=#000000]fffff800`[/color][color=#800080]008a436b [/color][color=#0A246A]test    [/color][color=#FF8000]eax[/color][color=#0A246A],[/color][color=#FF8000]eax
[/color][color=#0A246A]::::::< :      [/color][color=#000000]fffff800`[/color][color=#800080]008a436d [/color][color=#0A246A]js      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0xee [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a43be[/color][color=#0A246A]) [/color][color=#008000]; 返回 EXCEPTION_CONTINUE_EXECUTION (-1) 则跳转
[/color][color=#0A246A]::::::: :     
::::::: :      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x9f[/color][color=#0A246A]:
::::::: :      [/color][color=#000000]fffff800`[/color][color=#800080]008a436f [/color][color=#0A246A]test    [/color][color=#FF8000]eax[/color][color=#0A246A],[/color][color=#FF8000]eax
[/color][color=#0A246A]:::::::<:      [/color][color=#000000]fffff800`[/color][color=#800080]008a4371 [/color][color=#0A246A]jle     [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0xdd [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a43ad[/color][color=#0A246A]) [/color][color=#008000]; 返回 EXCEPTION_CONTINUE_SEARCH (0) 则跳转
[/color][color=#0A246A]:::::::::     
:::::::::      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0xa3[/color][color=#0A246A]:
:::::::::      [/color][color=#008000]; 返回的是 EXCEPTION_EXECUTE_HANDLER
[/color][color=#0A246A]:::::>:::      [/color][color=#000000]fffff800`[/color][color=#800080]008a4373 [/color][color=#0A246A]mov     [/color][color=#FF8000]ecx[/color][color=#0A246A],dword ptr [[/color][color=#000000]rbx[/color][color=#0A246A]+[/color][color=#800080]4[/color][color=#0A246A]] [/color][color=#008000]; ecx = pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].JumpTarget
[/color][color=#0A246A]::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a4376 [/color][color=#0A246A]mov     [/color][color=#000000]r8d[/color][color=#0A246A],[/color][color=#800080]1
[/color][color=#0A246A]::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a437c [/color][color=#0A246A]mov     [/color][color=#000000]rdx[/color][color=#0A246A],[/color][color=#000000]rsi [/color][color=#008000]; rdx = pEstablisherFrame
[/color][color=#0A246A]::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a437f [/color][color=#0A246A]add     [/color][color=#000000]rcx[/color][color=#0A246A],[/color][color=#000000]r14 [/color][color=#008000]; rcx = pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].JumpTarget + pDispatcherContext->ImageBase
[/color][color=#0A246A]::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a4382 [/color][color=#0A246A]call    [/color][color=#000000]nt!_NLG_Notify [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008b1460[/color][color=#0A246A])
::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a4387 [/color][color=#0A246A]mov     [/color][color=#000000]rax[/color][color=#0A246A],qword ptr [[/color][color=#000000]r13[/color][color=#0A246A]+[/color][color=#800080]40h[/color][color=#0A246A]] [/color][color=#008000]; rax = pDispatcherContext->HistoryTable
[/color][color=#0A246A]::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a438b [/color][color=#0A246A]mov     [/color][color=#FF8000]edx[/color][color=#0A246A],dword ptr [[/color][color=#000000]rbx[/color][color=#0A246A]+[/color][color=#800080]4[/color][color=#0A246A]]   [/color][color=#008000]; edx = pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].JumpTarget
[/color][color=#0A246A]::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a438e [/color][color=#000000]movsxd  r9[/color][color=#0A246A],dword ptr [[/color][color=#000000]r15[/color][color=#0A246A]]      [/color][color=#008000]; r9 = pExceptionRecord->ExceptionCode
[/color][color=#0A246A]::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a4391 [/color][color=#0A246A]mov     qword ptr [[/color][color=#000000]rsp[/color][color=#0A246A]+[/color][color=#800080]28h[/color][color=#0A246A]],[/color][color=#000000]rax [/color][color=#008000]; _ARG_6 = pDispatcherContext->HistoryTable
[/color][color=#0A246A]::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a4396 [/color][color=#0A246A]mov     [/color][color=#000000]rax[/color][color=#0A246A],qword ptr [[/color][color=#000000]r13[/color][color=#0A246A]+[/color][color=#800080]28h[/color][color=#0A246A]] [/color][color=#008000]; rax = pDispatcherContext->ContextRecord
[/color][color=#0A246A]::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a439a [/color][color=#0A246A]add     [/color][color=#000000]rdx[/color][color=#0A246A],[/color][color=#000000]r14 [/color][color=#008000]; rdx = pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].JumpTarget + pDispatcherContext->ImageBase
[/color][color=#0A246A]::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a439d [/color][color=#0A246A]mov     [/color][color=#000000]r8[/color][color=#0A246A],[/color][color=#000000]r15  [/color][color=#008000]; r8 = pExceptionRecord
[/color][color=#0A246A]::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a43a0 [/color][color=#0A246A]mov     [/color][color=#000000]rcx[/color][color=#0A246A],[/color][color=#000000]rsi [/color][color=#008000]; rcx = pEstablisherFrame
[/color][color=#0A246A]::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a43a3 [/color][color=#0A246A]mov     qword ptr [[/color][color=#000000]rsp[/color][color=#0A246A]+[/color][color=#800080]20h[/color][color=#0A246A]],[/color][color=#000000]rax [/color][color=#008000]; _ARG_5 = pDispatcherContext->ContextRecord
[/color][color=#0A246A]::::: :::      [/color][color=#000000]fffff800`[/color][color=#800080]008a43a8 [/color][color=#0A246A]call    [/color][color=#000000]nt!RtlUnwindEx [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]00891e80[/color][color=#0A246A]) [/color][color=#008000]; 这里不会返回
[/color][color=#0A246A]::::: :::      [/color][color=#008000]; RtlUnwindEx(pEstablisherFrame,
[/color][color=#0A246A]::::: :::      [/color][color=#008000];             pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].JumpTarget + pDispatcherContext->ImageBase
[/color][color=#0A246A]::::: :::      [/color][color=#008000];             pExceptionRecord,
[/color][color=#0A246A]::::: :::      [/color][color=#008000];             pExceptionRecord->ExceptionCode
[/color][color=#0A246A]::::: :::      [/color][color=#008000];             pDispatcherContext->ContextRecord,
[/color][color=#0A246A]::::: :::      [/color][color=#008000];             pDispatcherContext->HistoryTable)
[/color][color=#0A246A]::::: :::     
::::: :::      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0xdd[/color][color=#0A246A]:
::>>> :>:      [/color][color=#000000]fffff800`[/color][color=#800080]008a43ad [/color][color=#0A246A]inc     [/color][color=#FF8000]edi     [/color][color=#008000]; l_ScopeIndex += 1
[/color][color=#0A246A]::    : :      [/color][color=#000000]fffff800`[/color][color=#800080]008a43af [/color][color=#0A246A]add     [/color][color=#000000]rbx[/color][color=#0A246A],[/color][color=#800080]10h [/color][color=#008000]; 调整到下一个 ScopeRecord::HandlerAddress
[/color][color=#0A246A]::    : :      [/color][color=#000000]fffff800`[/color][color=#800080]008a43b3 [/color][color=#0A246A]cmp     [/color][color=#FF8000]edi[/color][color=#0A246A],dword ptr [[/color][color=#000000]r12[/color][color=#0A246A]] [/color][color=#008000]; cmp l_ScopeIndex, pDispatcherContext->HandlerData->Count
[/color][color=#0A246A]::    : <      [/color][color=#000000]fffff800`[/color][color=#800080]008a43b7 [/color][color=#0A246A]jb      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x71 [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a4341[/color][color=#0A246A])
::    :       
::    :        [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0xe9[/color][color=#0A246A]:
::    :        [/color][color=#008000]; pDispatcherContext->HandlerData 遍历完毕
[/color][color=#0A246A]::<   :        [/color][color=#000000]fffff800`[/color][color=#800080]008a43b9 [/color][color=#0A246A]jmp     [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x166 [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a4436[/color][color=#0A246A])
:::   :       
:::   :        [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0xee[/color][color=#0A246A]:
:::   >        [/color][color=#000000]fffff800`[/color][color=#800080]008a43be [/color][color=#0A246A]xor     [/color][color=#FF8000]eax[/color][color=#0A246A],[/color][color=#FF8000]eax [/color][color=#008000]; eax = ExceptionContinueExecution
[/color][color=#0A246A]:::<           [/color][color=#000000]fffff800`[/color][color=#800080]008a43c0 [/color][color=#0A246A]jmp     [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x16b [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a443b[/color][color=#0A246A])
::::          
::::           -------------------------------------------------------------------------------------
::::           [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0xf5[/color][color=#0A246A]:
::::           [/color][color=#008000]; 设置了 EXCEPTION_UNWIND,当前是展开过程
[/color][color=#0A246A]>:::           [/color][color=#000000]fffff800`[/color][color=#800080]008a43c5 [/color][color=#000000]movsxd  rdi[/color][color=#0A246A],dword ptr [[/color][color=#000000]r9[/color][color=#0A246A]+[/color][color=#800080]48h[/color][color=#0A246A]] [/color][color=#008000]; l_ScopeIndex (rdi) = pDispatcherContext->ScopeIndex
 [/color][color=#0A246A]:::           [/color][color=#000000]fffff800`[/color][color=#800080]008a43c9 [/color][color=#0A246A]mov     [/color][color=#000000]rsi[/color][color=#0A246A],qword ptr [[/color][color=#000000]r9[/color][color=#0A246A]+[/color][color=#800080]20h[/color][color=#0A246A]] [/color][color=#008000]; rsi = pDispatcherContext->TargetIp
 [/color][color=#0A246A]:::           [/color][color=#000000]fffff800`[/color][color=#800080]008a43cd [/color][color=#0A246A]sub     [/color][color=#000000]rsi[/color][color=#0A246A],[/color][color=#000000]r14                [/color][color=#008000]; rsi = pDispatcherContext->TargetIp - pDispatcherContext->ImageBase
 [/color][color=#0A246A]:::           [/color][color=#000000]fffff800`[/color][color=#800080]008a43d0 [/color][color=#0A246A]cmp     [/color][color=#FF8000]edi[/color][color=#0A246A],dword ptr [[/color][color=#000000]r12[/color][color=#0A246A]]    [/color][color=#008000]; cmp l_ScopeIndex, pDispatcherContext->HandlerData->Count
 [/color][color=#0A246A]:::           [/color][color=#000000]fffff800`[/color][color=#800080]008a43d4 [/color][color=#0A246A]mov     [/color][color=#000000]rax[/color][color=#0A246A],[/color][color=#000000]rdi                [/color][color=#008000]; rax = l_ScopeIndex
 [/color][color=#0A246A]:::<          [/color][color=#000000]fffff800`[/color][color=#800080]008a43d7 [/color][color=#0A246A]jae     [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x166 [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a4436[/color][color=#0A246A])
 ::::         
 ::::          [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x109[/color][color=#0A246A]:
 ::::          [/color][color=#000000]fffff800`[/color][color=#800080]008a43d9 [/color][color=#0A246A]add     [/color][color=#000000]rax[/color][color=#0A246A],[/color][color=#000000]rax [/color][color=#008000];
 [/color][color=#0A246A]::::          [/color][color=#000000]fffff800`[/color][color=#800080]008a43dc [/color][color=#0A246A]lea     [/color][color=#000000]rbx[/color][color=#0A246A],[[/color][color=#000000]r12[/color][color=#0A246A]+[/color][color=#000000]rax[/color][color=#0A246A]*[/color][color=#800080]8[/color][color=#0A246A]+[/color][color=#800080]8[/color][color=#0A246A]] [/color][color=#008000]; rbx = &(pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].EndAddress)
 [/color][color=#0A246A]::::         
 ::::          [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x111[/color][color=#0A246A]:
 ::::          [/color][color=#008000]; 检查 ControlPc 处于哪个 __try 保护域,之步骤一
 [/color][color=#0A246A]::::        > [/color][color=#000000]fffff800`[/color][color=#800080]008a43e1 [/color][color=#0A246A]mov     [/color][color=#FF8000]eax[/color][color=#0A246A],dword ptr [[/color][color=#000000]rbx[/color][color=#0A246A]-[/color][color=#800080]4[/color][color=#0A246A]] [/color][color=#008000]; eax = pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].BeginAddress
 [/color][color=#0A246A]::::        : [/color][color=#000000]fffff800`[/color][color=#800080]008a43e4 [/color][color=#0A246A]cmp     [/color][color=#000000]rbp[/color][color=#0A246A],[/color][color=#000000]rax [/color][color=#008000]; cmp l_OffsetInFunc, pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].BeginAddress
 [/color][color=#0A246A]::::<       : [/color][color=#000000]fffff800`[/color][color=#800080]008a43e7 [/color][color=#0A246A]jb      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x15a [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a442a[/color][color=#0A246A])
 :::::       :
 :::::       : [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x119[/color][color=#0A246A]:
 :::::       : [/color][color=#008000]; 检查 ControlPc 处于哪个 __try 保护域,之步骤二
 [/color][color=#0A246A]:::::       : [/color][color=#000000]fffff800`[/color][color=#800080]008a43e9 [/color][color=#0A246A]mov     [/color][color=#FF8000]ecx[/color][color=#0A246A],dword ptr [[/color][color=#000000]rbx[/color][color=#0A246A]] [/color][color=#008000]; ecx = pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].EndAddress
 [/color][color=#0A246A]:::::       : [/color][color=#000000]fffff800`[/color][color=#800080]008a43eb [/color][color=#0A246A]cmp     [/color][color=#000000]rbp[/color][color=#0A246A],[/color][color=#000000]rcx [/color][color=#008000]; cmp l_OffsetInFunc, pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].EndAddress
 [/color][color=#0A246A]:::::<      : [/color][color=#000000]fffff800`[/color][color=#800080]008a43ee [/color][color=#0A246A]jae     [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x15a [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a442a[/color][color=#0A246A])
 ::::::      :
 ::::::      : [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x120[/color][color=#0A246A]:
 ::::::      : [/color][color=#008000]; 到这里,已经找到与异常地址匹配的最内层(如果有多层) __try/__except
 [/color][color=#0A246A]::::::      : [/color][color=#000000]fffff800`[/color][color=#800080]008a43f0 [/color][color=#0A246A]cmp     [/color][color=#000000]rsi[/color][color=#0A246A],[/color][color=#000000]rax [/color][color=#008000]; cmp pDispatcherContext->TargetIp - pDispatcherContext->ImageBase, pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].BeginAddress
 [/color][color=#0A246A]::::::<     : [/color][color=#000000]fffff800`[/color][color=#800080]008a43f3 [/color][color=#0A246A]jb      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x131 [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a4401[/color][color=#0A246A])
 :::::::     :
 :::::::     : [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x125[/color][color=#0A246A]:
 :::::::     : [/color][color=#000000]fffff800`[/color][color=#800080]008a43f5 [/color][color=#0A246A]cmp     [/color][color=#000000]rsi[/color][color=#0A246A],[/color][color=#000000]rcx [/color][color=#008000]; cmp pDispatcherContext->TargetIp - pDispatcherContext->ImageBase, pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].EndAddress
 [/color][color=#0A246A]:::::::<    : [/color][color=#000000]fffff800`[/color][color=#800080]008a43f8 [/color][color=#0A246A]ja      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x131 [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a4401[/color][color=#0A246A])
 ::::::::    :
 ::::::::    : [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x12a[/color][color=#0A246A]:
 ::::::::    : [/color][color=#008000]; 如果标记了 EXCEPTION_TARGET_UNWIND,说明是最后一个需要局部展开的函数。但是该次局部展开只展开到 EXCEPT_HANDLER(不包含 EXCEPT_HANDLER),所以需要判断 TargetIp
 [/color][color=#0A246A]::::::::    : [/color][color=#000000]fffff800`[/color][color=#800080]008a43fa [/color][color=#0A246A]test    byte ptr [[/color][color=#000000]r15[/color][color=#0A246A]+[/color][color=#800080]4[/color][color=#0A246A]],[/color][color=#800080]20h [/color][color=#008000]; test pExceptionRecord->ExceptionFlags, EXCEPTION_TARGET_UNWIND (0x20)
 [/color][color=#0A246A]::::::::<   : [/color][color=#000000]fffff800`[/color][color=#800080]008a43ff [/color][color=#0A246A]jne     [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x166 [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a4436[/color][color=#0A246A])
 :::::::::   :
 :::::::::   : [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x131[/color][color=#0A246A]:
 ::::::>>:   : [/color][color=#000000]fffff800`[/color][color=#800080]008a4401 [/color][color=#0A246A]mov     [/color][color=#FF8000]eax[/color][color=#0A246A],dword ptr [[/color][color=#000000]rbx[/color][color=#0A246A]+[/color][color=#800080]8[/color][color=#0A246A]] [/color][color=#008000]; eax = pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].JumpTarget
 [/color][color=#0A246A]::::::  :   : [/color][color=#000000]fffff800`[/color][color=#800080]008a4404 [/color][color=#0A246A]test    [/color][color=#FF8000]eax[/color][color=#0A246A],[/color][color=#FF8000]eax [/color][color=#008000]; 判断 pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].JumpTarget 是否为 NULL,即是否是 __try/__finally
 [/color][color=#0A246A]::::::  :<  : [/color][color=#000000]fffff800`[/color][color=#800080]008a4406 [/color][color=#0A246A]je      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x13f [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a440f[/color][color=#0A246A]) [/color][color=#008000]; 如果是 __try/__finally 则跳转
 [/color][color=#0A246A]::::::  ::  :
 ::::::  ::  : [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x138[/color][color=#0A246A]:
 ::::::  ::  : [/color][color=#000000]fffff800`[/color][color=#800080]008a4408 [/color][color=#0A246A]cmp     [/color][color=#000000]rsi[/color][color=#0A246A],[/color][color=#000000]rax [/color][color=#008000]; cmp pDispatcherContext->TargetIp, pDispatcherContext->HandlerData->ScopeRecord[l_ScopeIndex].JumpTarget
 [/color][color=#0A246A]::::::  ::< : [/color][color=#000000]fffff800`[/color][color=#800080]008a440b [/color][color=#0A246A]je      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x166 [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a4436[/color][color=#0A246A])
 ::::::  ::: :
 ::::::  ::: : [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x13d[/color][color=#0A246A]:
 ::::::  :::<: [/color][color=#000000]fffff800`[/color][color=#800080]008a440d [/color][color=#0A246A]jmp     [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x15a [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a442a[/color][color=#0A246A])
 ::::::  :::::
 ::::::  ::::: [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x13f[/color][color=#0A246A]:
 ::::::  ::::: [/color][color=#008000]; 注意这里是先修改 pDispatcherContext->ScopeIndex,然后调用 EXCEPT_HANDLER。这样如果 EXCEPT_HANDLER 触发异常,后续展开就会跳过这个 EXCEPT_HANDLER。
 [/color][color=#0A246A]::::::  :>::: [/color][color=#000000]fffff800`[/color][color=#800080]008a440f [/color][color=#0A246A]mov     [/color][color=#000000]rdx[/color][color=#0A246A],qword ptr [[/color][color=#000000]rsp[/color][color=#0A246A]+[/color][color=#800080]98h[/color][color=#0A246A]]
 ::::::  : ::: [/color][color=#000000]fffff800`[/color][color=#800080]008a4417 [/color][color=#0A246A]lea     [/color][color=#FF8000]eax[/color][color=#0A246A],[[/color][color=#000000]rdi[/color][color=#0A246A]+[/color][color=#800080]1[/color][color=#0A246A]]             [/color][color=#008000]; eax = l_ScopeIndex + 1
 [/color][color=#0A246A]::::::  : ::: [/color][color=#000000]fffff800`[/color][color=#800080]008a441a [/color][color=#0A246A]mov     [/color][color=#FF8000]cl[/color][color=#0A246A],[/color][color=#800080]1
 [/color][color=#0A246A]::::::  : ::: [/color][color=#000000]fffff800`[/color][color=#800080]008a441c [/color][color=#0A246A]mov     dword ptr [[/color][color=#000000]r13[/color][color=#0A246A]+[/color][color=#800080]48h[/color][color=#0A246A]],[/color][color=#FF8000]eax [/color][color=#008000]; pDispatcherContext->ScopeIndex = eax
 [/color][color=#0A246A]::::::  : ::: [/color][color=#000000]fffff800`[/color][color=#800080]008a4420 [/color][color=#0A246A]mov     [/color][color=#000000]r8d[/color][color=#0A246A],dword ptr [[/color][color=#000000]rbx[/color][color=#0A246A]+[/color][color=#800080]4[/color][color=#0A246A]]   [/color][color=#008000]; r8d = pDispatcherContext->HandlerData->ScopeRecord[i].HandlerAddress
 [/color][color=#0A246A]::::::  : ::: [/color][color=#000000]fffff800`[/color][color=#800080]008a4424 [/color][color=#0A246A]add     [/color][color=#000000]r8[/color][color=#0A246A],[/color][color=#000000]r14                  [/color][color=#008000]; r8 = pDispatcherContext->HandlerData->ScopeRecord[i].HandlerAddress + pDispatcherContext->ImageBase
 [/color][color=#0A246A]::::::  : ::: [/color][color=#000000]fffff800`[/color][color=#800080]008a4427 [/color][color=#0A246A]call    [/color][color=#000000]r8                      [/color][color=#008000]; 调用 __finally 处理块,会返回(注:对于 __try/__finally,HandlerAddress 保存的是 __finally 代码块的 RVA)
 [/color][color=#0A246A]::::::  : :::
 ::::::  : ::: [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x15a[/color][color=#0A246A]:
 ::::>>  : :>: [/color][color=#000000]fffff800`[/color][color=#800080]008a442a [/color][color=#0A246A]inc     [/color][color=#FF8000]edi                 [/color][color=#008000]; l_ScopeIndex += 1
 [/color][color=#0A246A]::::    : : : [/color][color=#000000]fffff800`[/color][color=#800080]008a442c [/color][color=#0A246A]add     [/color][color=#000000]rbx[/color][color=#0A246A],[/color][color=#800080]10h             [/color][color=#008000]; 调整到下一个 ScopeRecord::HandlerAddress
 [/color][color=#0A246A]::::    : : : [/color][color=#000000]fffff800`[/color][color=#800080]008a4430 [/color][color=#0A246A]cmp     [/color][color=#FF8000]edi[/color][color=#0A246A],dword ptr [[/color][color=#000000]r12[/color][color=#0A246A]] [/color][color=#008000]; cmp l_ScopeIndex, pDispatcherContext->HandlerData->Count
 [/color][color=#0A246A]::::    : : < [/color][color=#000000]fffff800`[/color][color=#800080]008a4434 [/color][color=#0A246A]jb      [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x111 [/color][color=#0A246A]([/color][color=#000000]fffff800`[/color][color=#800080]008a43e1[/color][color=#0A246A])
 ::::    : :  
 ::::    : :   [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x166[/color][color=#0A246A]:
 >>:>    > >   [/color][color=#000000]fffff800`[/color][color=#800080]008a4436 [/color][color=#0A246A]mov     [/color][color=#FF8000]eax[/color][color=#0A246A],[/color][color=#800080]1 [/color][color=#008000]; eax = ExceptionContinueSearch (0n1)
   [/color][color=#0A246A]:          
   :           [/color][color=#000000]nt!__C_specific_handler[/color][color=#0A246A]+[/color][color=#800080]0x16b[/color][color=#0A246A]:
   >           [/color][color=#000000]fffff800`[/color][color=#800080]008a443b [/color][color=#0A246A]mov     [/color][color=#000000]r15[/color][color=#0A246A],qword ptr [[/color][color=#000000]rsp[/color][color=#0A246A]+[/color][color=#800080]48h[/color][color=#0A246A]]
               [/color][color=#000000]fffff800`[/color][color=#800080]008a4440 [/color][color=#0A246A]mov     [/color][color=#000000]r14[/color][color=#0A246A],qword ptr [[/color][color=#000000]rsp[/color][color=#0A246A]+[/color][color=#800080]50h[/color][color=#0A246A]]
               [/color][color=#000000]fffff800`[/color][color=#800080]008a4445 [/color][color=#0A246A]mov     [/color][color=#000000]r13[/color][color=#0A246A],qword ptr [[/color][color=#000000]rsp[/color][color=#0A246A]+[/color][color=#800080]58h[/color][color=#0A246A]]
               [/color][color=#000000]fffff800`[/color][color=#800080]008a444a [/color][color=#0A246A]mov     [/color][color=#000000]r12[/color][color=#0A246A],qword ptr [[/color][color=#000000]rsp[/color][color=#0A246A]+[/color][color=#800080]60h[/color][color=#0A246A]]
               [/color][color=#000000]fffff800`[/color][color=#800080]008a444f [/color][color=#0A246A]mov     [/color][color=#000000]rdi[/color][color=#0A246A],qword ptr [[/color][color=#000000]rsp[/color][color=#0A246A]+[/color][color=#800080]68h[/color][color=#0A246A]]
               [/color][color=#000000]fffff800`[/color][color=#800080]008a4454 [/color][color=#0A246A]mov     [/color][color=#000000]rsi[/color][color=#0A246A],qword ptr [[/color][color=#000000]rsp[/color][color=#0A246A]+[/color][color=#800080]70h[/color][color=#0A246A]]
               [/color][color=#000000]fffff800`[/color][color=#800080]008a4459 [/color][color=#0A246A]mov     [/color][color=#000000]rbp[/color][color=#0A246A],qword ptr [[/color][color=#000000]rsp[/color][color=#0A246A]+[/color][color=#800080]78h[/color][color=#0A246A]]
               [/color][color=#000000]fffff800`[/color][color=#800080]008a445e [/color][color=#0A246A]mov     [/color][color=#000000]rbx[/color][color=#0A246A],qword ptr [[/color][color=#000000]rsp[/color][color=#0A246A]+[/color][color=#800080]80h[/color][color=#0A246A]]
               [/color][color=#000000]fffff800`[/color][color=#800080]008a4466 [/color][color=#0A246A]add     [/color][color=#000000]rsp[/color][color=#0A246A],[/color][color=#800080]88h
               [/color][color=#000000]fffff800`[/color][color=#800080]008a446d [/color][color=#000000]ret[/color][/font]

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 10
支持
分享
赞赏记录
参与人
雪币
留言
时间
Youlor
看雪因你而更加精彩!
2024-6-2 01:12
伟叔叔
为你点赞~
2024-5-31 02:50
心游尘世外
为你点赞~
2024-3-14 01:02
飘零丶
为你点赞~
2024-3-4 04:31
QinBeast
为你点赞~
2024-2-12 00:00
shinratensei
为你点赞~
2024-1-25 00:43
zhczf
为你点赞~
2024-1-23 14:11
fatcateatrat
为你点赞~
2024-1-23 10:34
PLEBFE
为你点赞~
2023-3-7 00:49
hambaga
为你点赞~
2022-11-18 17:26
最新回复 (20)
雪    币: 58
活跃值: (1275)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错,好帖子,看不懂哈
2011-11-4 20:13
0
雪    币: 342
活跃值: (204)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
参考资料

        [1] wrk 源码
        [2] Improving Automated Analysis of Windows x64 Binaries, skape
        [3] Programming against the x64 exception handling support, Skywing
        [4] Exceptional Behavior - x64 Structured Exception Handling, The NT Insider
2011-11-4 20:51
0
雪    币: 5997
活跃值: (4324)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
4
标记一下,明天再学习。支持X64的文章
2011-11-4 20:57
0
雪    币: 55943
活跃值: (21560)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
精华鼓励一下
2011-11-4 21:38
0
雪    币: 202
活跃值: (543)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
6
LZ你太帅了!我要用千斤顶
2011-11-5 02:04
0
雪    币: 1693
活跃值: (817)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
严重支持,学习。。。
2011-11-5 02:12
0
雪    币: 367
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢了。转载.............
2011-11-5 18:29
0
雪    币: 5660
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个太好了啊,收藏学习了
2011-11-8 12:26
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
表示lz很有才啊!
2011-11-8 17:22
0
雪    币: 201
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
精华 绝对的精华
2011-11-8 21:43
0
雪    币: 349
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
厉害,学习学习。
2011-11-9 10:35
0
雪    币: 349
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习了。。。膜拜楼主
2011-11-10 22:08
0
雪    币: 3279
活跃值: (6032)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
膜拜楼主 。。。
2011-11-10 23:42
0
雪    币: 237
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
markkkkkkkk
2011-11-11 03:50
0
雪    币: 500
活跃值: (1085)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
mark一下
2011-11-15 14:46
0
雪    币: 697
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
mark一下
2019-3-5 15:58
0
雪    币: 3536
活跃值: (4433)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
相较于32位的seh异常处理,64位的还是变复杂了很多
2021-2-16 10:11
0
雪    币: 5071
活跃值: (5162)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
wc这什么玩意。。。
2021-3-11 13:38
0
雪    币: 5586
活跃值: (5106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
感谢分享!正好需要看看
2021-7-26 20:58
0
雪    币: 341
活跃值: (1020)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
看看前人的学习成果
2024-1-23 10:36
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册