gpt4 book ai didi

gcc - 在 GCC 中转储寄存器的值

转载 作者:行者123 更新时间:2023-12-01 11:10:38 25 4
gpt4 key购买 nike

我需要使用 GCC 获取寄存器中的值。

类似的东西:

EAX=00000002  EBX=00000001  ECX=00000005  EDX=BFFC94C0ESI=8184C544  EDI=00000000  EBP=0063FF78  ESP=0063FE3CCF=0  SF=0  ZF=0  OF=0

获取 32 位寄存器很容易,但我不确定获取标志的最简单方法是什么。

在本书的示例中:http://kipirvine.com/asm/

他们通过获取整个 EFLAGS 寄存器并移动有问题的位来做到这一点。我还考虑过使用 Jcc 和 CMOVcc 来实现。

关于如何做到这一点还有其他建议吗?一些要验证的测试用例也会很有用。

最佳答案

不需要使用汇编程序来获取寄存器。

你可以只使用 setjmp。这会将所有寄存器写入 jmp_buf 类型的结构中。它甚至可以跨平台工作,除了 jmp_buf 本身对于每个架构都是不同的。

但是,调用 setjmp(以及调用您的汇编代码)会更改某些寄存器,因此您不能真正信任它们。

有一种获取真实快照的方法,但这有点困难并且高度依赖于操作系统:

  1. 为非法操作码扩展安装异常处理程序。处理程序可以是真正的中断、信号处理程序或操作系统异常处理程序(C++ 中的 try/except block 将不起作用)。

  2. 在您的代码中发出非法操作码。

这里的技巧是,非法操作码没有寄存器副作用。异常处理程序可以从堆栈或异常信息结构中复制寄存器。

同样的技巧可能适用于断点中断、强制溢出、陷阱等。通常有不止一种方法可以从一段代码中引发中断。


关于 EFLAGS:您可以通过堆栈操作获取它们:

  PUSHFD
POP EAX
, eax now contains the EFLAG data

关于gcc - 在 GCC 中转储寄存器的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/275771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com