首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用masm64设置异常?

如何使用masm64设置异常?
EN

Stack Overflow用户
提问于 2022-10-15 06:25:39
回答 1查看 46关注 0票数 0

如何使用masm64访问异常链?

使用masm32,我得到了第一个查看fs的异常:

但是,当我签入Windbg :仍然指向x64中的第一个异常时,我认为它不是。

我想在x64中设置一个异常,就像在x86中一样。这是可行的(也许看看gs注册)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-17 19:34:14

如果这是与编码相关的,则使用

代码语言:javascript
复制
ml64seh PROC FRAME:ExceptionFilter 

这会将异常处理程序添加到.PDATA节RUNTIME_FUNCTION中。

如果这是在引发异常时如何在windbg中找到此异常处理程序的话。

使用!exchain命令

或者如果您想在执行特定函数之前找到它,请使用.fnent命令。

x64 seh的示例并在windbg中找到它,如下所示

代码语言:javascript
复制
;assemble and link with 
;ml64 /Zi ml64seh.asm /link /debug /entry:ml64seh /subsystem:console

.data
safeplace DWORD ?

.code

ExceptionFilter PROC 
    jmp Handler 
ExceptionFilter ENDP

PUBLIC ml64seh

ml64seh PROC FRAME:ExceptionFilter
.ENDPROLOG
    mov rax, 0
    mov [rax], rax ;access violation
    jmp exit
Handler::
    lea rax, safeplace
    mov [r8+078h], rax ; replacing rax in exception handler so access is possible
    mov rax, 0
    ret
Exit:
    ret 
ml64seh ENDP
 
END

在风车里不停车就跑

代码语言:javascript
复制
:\>cdb -g ml64seh.exe
(2aa0.3024): Access violation - code c0000005 (first chance)
ml64seh!ml64seh+0x7:
00007ff7`0e3b1029 488900          mov     qword ptr [rax],rax ds:00000000`00000000=????????????????
0:000>

它崩溃并中断,现在定位异常处理程序。

代码语言:javascript
复制
0:000> .fnent .
Debugger function entry 0000020b`e36c47a8 for:
(00007ff7`0e3b1022)   ml64seh!ml64seh+0x7   |  (00007ff7`0e3b32b0)   ml64seh!$xdatasym

BeginAddress      = 00000000`00001022
EndAddress        = 00000000`00001042
UnwindInfoAddress = 00000000`000032b0

Unwind info at 00007ff7`0e3b32b0, c bytes
  version 1, flags 3, prolog 0, codes 0
  handler routine: ml64seh!ILT+0(ExceptionFilter) (00007ff7`0e3b1005), data 0 <<<<<<<<<
  
  
0:000> !exchain
3 stack frames, scanning for handlers...
Frame 0x00: ml64seh!ml64seh+0x7 (00007ff7`0e3b1029)
  ehandler ml64seh!ILT+0(ExceptionFilter) (00007ff7`0e3b1005) <<<<<<<<<<<<
Frame 0x02: ntdll!RtlUserThreadStart+0x21 (00007ffe`213c26a1)
  ehandler ntdll!_C_specific_handler (00007ffe`213fc720)
0:000>

让我们看看是否返回到处理程序并返回到重新访问错误位置。

代码语言:javascript
复制
0:000> bp . 
0:000> bp 00007ff7`0e3b1005
0:000> bl
 0 e 00007ff7`0e3b1029     0001 (0001)  0:**** ml64seh!ml64seh+0x7
 1 e 00007ff7`0e3b1005     0001 (0001)  0:**** ml64seh!ILT+0(ExceptionFilter)
 
 
0:000> g
Breakpoint 1 hit
ml64seh!ILT+0(ExceptionFilter):
00007ff7`0e3b1005 e916000000      jmp     ml64seh!ExceptionFilter (00007ff7`0e3b1020)


0:000> g
Breakpoint 0 hit
ml64seh!ml64seh+0x7:  is accessible now
00007ff7`0e3b1029 488900          mov     qword ptr [rax],rax ds:00007ff7`0e3b4000=0000000000000000 
0:000>

顺便说一句,您可以使用dumpbin或linker使用-unwindinfo开关在特定的二进制文件中吐出所有的unwindinfos。

代码语言:javascript
复制
:\>dumpbin /unwindinfo ml64seh.exe
Microsoft (R) COFF/PE Dumper Version 14.29.30146.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file ml64seh.exe

File Type: EXECUTABLE IMAGE

Function Table (1)

           Begin    End      Info      Function Name

  00000000 00001022 00001042 000032B0  ml64seh
    Unwind version: 1
    Unwind flags: EHANDLER UHANDLER
    Size of prologue: 0x00
    Count of codes: 0
    Handler: 00001005 @ILT+0(ExceptionFilter)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74077197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档