首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >64位Windows下如何在C代码中发出0x2D中断?

64位Windows下如何在C代码中发出0x2D中断?
EN

Stack Overflow用户
提问于 2018-09-03 22:44:12
回答 1查看 446关注 0票数 0

我正在寻找一种从C代码发出中断0x2D的方法,就像使用__debugbreak()发出INT3一样

在x86上,我可以使用内联程序集

代码语言:javascript
复制
__asm
{
    int 2dh
}

但我需要一个有效的解决方案:

  • x64和be Visual Studio特定(最低要求)
  • x86和x64,独立于编译器(最佳解决方案)
EN

回答 1

Stack Overflow用户

发布于 2018-09-03 22:59:09

由于x64 Visual Studio根本不支持内联程序集(我听说的最后一次),您最好的独立于编译器的解决方案是编写一个定义函数的.asm文件,让我们称其为int_2d,它只是发出这个中断,然后返回。您可以将.asm文件编译为一个目标文件,将该目标文件与应用程序的其余部分链接起来,然后您可以在一个头文件中编写extern void int_2d(void);,并在需要发出中断时正常地从C调用它。

对于the assembler that ships with x64 Visual Studio.asm文件应如下所示:

代码语言:javascript
复制
_TEXT segment 'CODE'

int_2d proc 
    xor eax,eax 
    int 2dh 
    nop
    ret 
int_2d endp 

_TEXT ENDS 
END

int 2dh之后的nop是必需的,因为根据所使用的操作码以及进程是否附加了调试器,INT 2D处理程序可能会也可能不会导致跳过紧跟在int指令之后的一个字节的代码(而不是一条指令)。所以你需要在那里放一个单字节的NOP。

Int2D还期望在A寄存器中有一个操作码;known values of this opcode的范围从0到5,我没有幸运地找到关于它们实际作用的文档。示例代码任意选择将A设置为0。(您不需要保存和恢复它,因为在所有Windows调用约定中,A都是被调用的。)如果你想把操作码作为参数传递,你可以这样做:

代码语言:javascript
复制
_TEXT segment 'CODE'

int_2d proc 
    mov eax, ecx
    int 2dh 
    nop
    ret 
int_2d endp 

_TEXT ENDS 
END

但是您必须在C端将该函数声明为__fastcall void int_2d(uint32_t op); ( __fastcall是不必要的,但在64位模式下编译时是无害的)。

不幸的是,我不知道如何为需要与尽可能多的不同窗口工具链一起工作的.asm文件编写“样板”(除了实际的汇编指令之外的所有东西)。例如,以上内容可能不会被NASM接受。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52151962

复制
相关文章

相似问题

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