首页
社区
课程
招聘
[原创]逆向windows 7 64异常分发处理
发表于: 17小时前 412

[原创]逆向windows 7 64异常分发处理

17小时前
412

主要分析Windows 7 64位应用程产生异常和处理关键分析。

专业吹水。小水一篇。思路,思路,思路。
流程分析:

1
Nt!KiPageFault+0x422->nt!KiExceptionDispatch+0xc2->nt!KiDispatchException+0x450

主要代码逆向:

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
关键流程处理
Nt!KiPageFault:
fffff800`03eafd48 b904000010      mov     ecx,10000004h   ;**开始处理STATUS_ACCESS_VIOLATION
fffff800`03eafd4d 4c8b5550        mov     r10,qword ptr [rbp+50h]   ;
fffff800`03eafd51 4c0fb64daa      movzx   r9,byte ptr [rbp-56h]     ;rsp = rbp-50-30 是_KTRAP_FRAME
fffff800`03eafd56 4c8b85e8000000  mov     r8,qword ptr [rbp+0E8h]   ;产生异常的代码地址
fffff800`03eafd5d e81e220000      call    nt!KiExceptionDispatch (fffff800`03eb1f80) 调用异常分发
 
nt!KiExceptionDispatch+0xc2
fffff800`03eb2005 8908            mov     dword ptr [rax],ecx ;赋值_KEXCEPTION_FRAME->Return
fffff800`03eb2007 33c9            xor     ecx,ecx
fffff800`03eb2009 894804          mov     dword ptr [rax+4],ecx ;填充_EXCEPTION_RECORD 待商榷
fffff800`03eb200c 48894808        mov     qword ptr [rax+8],rcx
fffff800`03eb2010 4c894010        mov     qword ptr [rax+10h],r8
fffff800`03eb2014 895018          mov     dword ptr [rax+18h],edx
fffff800`03eb2017 4c894820        mov     qword ptr [rax+20h],r9
fffff800`03eb201b 4c895028        mov     qword ptr [rax+28h],r10
fffff800`03eb201f 4c895830        mov     qword ptr [rax+30h],r11
fffff800`03eb2023 448a8df0000000  mov     r9b,byte ptr [rbp+0F0h]
fffff800`03eb202a 4180e101        and     r9b,1                         ;ExceptionAddress 地址。
fffff800`03eb202e c644242001      mov     byte ptr [rsp+20h],1
fffff800`03eb2033 4c8d4580        lea     r8,[rbp-80h]     ;第三个参数为 _KTRAP_FRAME
fffff800`03eb2037 488bd4          mov     rdx,rsp          ;第二个参数可能为_KEXCEPTION_FRAME
fffff800`03eb203a 488bc8          mov     rcx,rax          ;第一个参数可能为:_EXCEPTION_RECORD
fffff800`03eb203d e8de880d00      call    nt!KiDispatchException (fffff800`03f8a920);分发异常,
fffff800`03eb2042 488d8c2400010000 lea     rcx,[rsp+100h]            ;恢复寄存器从_KEXCEPTION_FRAME结构
......
                                                                                                                  //恢复异常发生时的寄存器
fffff800`03eb21b0 0fae55ac        ldmxcsr dword ptr [rbp-54h]
fffff800`03eb21b4 0f2845f0        movaps  xmm0,xmmword ptr [rbp-10h]   rbp=_KTRAP_FRAME->Xmm1[+0x080]
fffff800`03eb21b8 0f284d00        movaps  xmm1,xmmword ptr [rbp]
fffff800`03eb21bc 0f285510        movaps  xmm2,xmmword ptr [rbp+10h]
fffff800`03eb21c0 0f285d20        movaps  xmm3,xmmword ptr [rbp+20h]
fffff800`03eb21c4 0f286530        movaps  xmm4,xmmword ptr [rbp+30h]
fffff800`03eb21c8 0f286d40        movaps  xmm5,xmmword ptr [rbp+40h]
fffff800`03eb21cc 4c8b5de0        mov     r11,qword ptr [rbp-20h]
fffff800`03eb21d0 4c8b55d8        mov     r10,qword ptr [rbp-28h]
fffff800`03eb21d4 4c8b4dd0        mov     r9,qword ptr [rbp-30h]
fffff800`03eb21d8 4c8b45c8        mov     r8,qword ptr [rbp-38h]
fffff800`03eb21dc 488b55c0        mov     rdx,qword ptr [rbp-40h]
fffff800`03eb21e0 488b4db8        mov     rcx,qword ptr [rbp-48h]
fffff800`03eb21e4 488b45b0        mov     rax,qword ptr [rbp-50h]
fffff800`03eb21e8 488be5          mov     rsp,rbp                 ;rbp=_KTRP_FRAME_->Xmm1[+0x080]
fffff800`03eb21eb 488badd8000000  mov     rbp,qword ptr [rbp+0D8h]
fffff800`03eb21f2 4881c4e8000000  add     rsp,0E8h                ;rsp 指向的内存: _KTRAP_FRAME->Rip[0x168= 0x080+0E8h]
fffff800`03eb21f9 48cf            iretq                                                     ;返回到发生异常的位置
fffff800`03eb21fb 0f1f440000      nop     dword ptr [rax+rax]
 
 
nt!KiDispatchException
 
fffff800`03f8ad22 4c897118        mov     qword ptr [rcx+18h],r14 ;开始填充应用层用到的处理异常事件结构。
fffff800`03f8ad26 488b86f8000000  mov     rax,qword ptr [rsi+0F8h]
fffff800`03f8ad2d 488901          mov     qword ptr [rcx],rax
fffff800`03f8ad30 488bd3          mov     rdx,rbx
fffff800`03f8ad33 488b4d58        mov     rcx,qword ptr [rbp+58h];参数一:nt!_EXCEPTION_RECORD64
fffff800`03f8ad37 e83c0df1ff      call    nt!KeCopyExceptionRecord (fffff800`03e9ba78);
fffff800`03f8ad3c 488364242800    and     qword ptr [rsp+28h],0
fffff800`03f8ad42 488b4510        mov     rax,qword ptr [rbp+10h]
fffff800`03f8ad46 4889442420      mov     qword ptr [rsp+20h],rax
fffff800`03f8ad4b 458bcd          mov     r9d,r13d
fffff800`03f8ad4e 4c8d4530        lea     r8,[rbp+30h]
fffff800`03f8ad52 488b5d68        mov     rbx,qword ptr [rbp+68h]
fffff800`03f8ad56 488bd3          mov     rdx,rbx
fffff800`03f8ad59 b101            mov     cl,1                  
fffff800`03f8ad5b e8285aedff      call    nt!RtlpCopyExtendedContext (fffff800`03e60788)
fffff800`03f8ad60 894518          mov     dword ptr [rbp+18h],eax
fffff800`03f8ad63 488bcb          mov     rcx,rbx
fffff800`03f8ad66 488d5530        lea     rdx,[rbp+30h]
fffff800`03f8ad6a 41b818000000    mov     r8d,18h
fffff800`03f8ad70 e81b6df0ff      call    nt!memmove (fffff800`03e91a90)
fffff800`03f8ad75 4d89bc2480010000 mov     qword ptr [r12+180h],r15 ; 因为上面将发生Exception时的运行状态保存在应用层栈中
fffff800`03f8ad7d fa              cli                                                               ; 因此改变了RSP值 _KTRAP_FRAME->Rsp
fffff800`03f8ad7e b833000000      mov     eax,33h
fffff800`03f8ad83 664189842470010000 mov   word ptr [r12+170h],ax
fffff800`03f8ad8c 488b05652a1200  mov     rax,qword ptr [nt!KeUserExceptionDispatcher (fffff800`040ad7f8)];此全局变量保存了用户层处理异常事件的地址(ntdll!KiUserExceptionDispatch)
fffff800`03f8ad93 4989842468010000 mov     qword ptr [r12+168h],rax                                                                             ;会返回到此地址进一步处理异常事件。
fffff800`03f8ad9b 65488b042588010000 mov   rax,qword ptr gs:[188h]                                                                              ;目前猜测IRETQ指令做返回到应用层工作。(intel 3C 文档 或者https://www.felixcloutier.com/x86/iret:iretd:iretq)
fffff800`03f8ada4 488b4870        mov     rcx,qword ptr [rax+70h]                                                                                   ;只要改变[r12+168h]:RIP的值就能改变异常处理流程。此时必须[r12+180h]:RSP值因为此值已经不同于应用层发生异常事件时的值。
fffff800`03f8ada8 488b9100010000  mov     rdx,qword ptr [rcx+100h]                                                                             
fffff800`03f8adaf 4885d2          test    rdx,rdx
fffff800`03f8adb2 7415            je      nt!KiDispatchException+0x4a9 (fffff800`03f8adc9)
fffff800`03f8adb4 498b842468010000 mov     rax,qword ptr [r12+168h]
fffff800`03f8adbc 4989442458      mov     qword ptr [r12+58h],rax
fffff800`03f8adc1 4989942468010000 mov     qword ptr [r12+168h],rdx

练习题:

1
2
3
4
int *p = NULL;
*p = 4
//发生异常用windbg 捕获修改弹出Messagebox
MessageBoxA(NULL, L"windbg jmp  指令执行");

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 16小时前 被NoHeart编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//