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

时间:2018-09-03 14:44:12

标签: c windows x86 x86-64 interrupt

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

在x86上,我可以使用内联汇编

__asm
{
    int 2dh
}

但是我需要一个适用于以下情况的解决方案:

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

1 个答案:

答案 0 :(得分:3)

由于x64 Visual Studio根本不支持内联汇编(无论如何,我还是听说过),所以最好的独立于编译器的解决方案是编写定义函数的.asm文件,我们将其称为{{1 }},仅发出此中断,然后返回。您将int_2d文件编译为目标文件,将该目标文件与应用程序的其余部分链接,然后可以在头文件中写入.asm,并在需要发布时从C正常调用它。中断。

对于the assembler that ships with x64 Visual Studioextern void int_2d(void);文件应如下所示:

.asm

_TEXT segment 'CODE' int_2d proc xor eax,eax int 2dh nop ret int_2d endp _TEXT ENDS END 之后的nop是必要的,因为INT 2D处理程序可能会或可能不会导致一个个字节,这取决于所使用的操作码以及该进程是否附加了调试器。 int 2dh指令后立即跳过代码(不是一条指令)。因此,您需要在其中放置一个一字节的NOP。

INT 2D也期望在A寄存器中有一个操作码。 known values of this opcode的范围是0到5,而且我没有运气找到有关其实际功能的文档。该示例代码任意选择将A设置为0。(您不需要保存和还原它,因为在所有Windows调用约定中A都被调用了。)如果要将操作码作为参数传递,则可以可以这样:

int

但是您必须然后在C端将函数声明为_TEXT segment 'CODE' int_2d proc mov eax, ecx int 2dh nop ret int_2d endp _TEXT ENDS END (我认为__fastcall void int_2d(uint32_t op);是不必要的,但在以64位模式进行编译时无害。)

不幸的是,我不知道如何为__fastcall文件编写“样板”(除了实际的汇编指令之外的所有东西),该文件需要使用尽可能多的Windows工具链。例如,以上可能对于NASM是不可接受的。