【问题标题】:How to issue 0x2D interrupt in C code on 64-bit Windows?如何在 64 位 Windows 上以 C 代码发出 0x2D 中断?
【发布时间】:2018-09-03 14:44:12
【问题描述】:

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

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

__asm
{
    int 2dh
}

但我需要一个适用的解决方案:

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

【问题讨论】:

  • 我的意思是中断 0x2D
  • 用户“对这个网站太诚实”有一个坏习惯,即假装不知道人们的意思以取笑他们。我很遗憾你不得不经历这种情况。
  • 将单独的 asm 文件添加到项目并使用 ml64 /c /Cp /Zi $(InputFileName) -> $(InputName).obj 进行编译。你也可以调用 DbgPrompt 内部调用 int 2d 与 eax==2

标签: c windows x86 x86-64 interrupt


【解决方案1】:

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

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

_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。

INT 2D 还需要 A 寄存器中的操作码; known values of this opcode 范围从 0 到 5,而且我没有任何运气找到关于他们实际做什么的文档。示例代码任意选择将 A 设置为 0。(您不需要保存和恢复它,因为 A 在所有 Windows 调用约定中都被调用破坏了。)如果您想将操作码作为参数传递,您可以这样做:

_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 位模式下编译时无害,我认为。)

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

【讨论】:

  • ml[64] 的“样板”将是 _TEXT segment 'CODE' somefunc proc mov eax,* int 2dh int 3 ret somefunc endp _TEXT ENDS END
  • @RbMm 你能做一个编辑吗?我不知道在哪里放置换行符。
  • @RbMm mov eax,1int 3 的用途是什么?我没有看到任何需要 OP 问题的人。
  • EAX 应该设置 - x64 的确切 RAX 必须是 - 如果说 RAX==0x8000000000000001 - 将是例外,尽管 EAX1 这里跨度>
  • @zwol:如果您希望调用者提供 EAX 值(即 void int2d(uint32_t code),请使用 mov eax, ecx(对于 Windows x64 调用约定,或 32 位 __fastcall)。这将零扩展到 RAX..
猜你喜欢
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2011-06-02
  • 1970-01-01
相关资源
最近更新 更多