【问题标题】:How can you read/write asm registers from an .exe using C++?如何使用 C++ 从 .exe 读取/写入 asm 寄存器?
【发布时间】:2015-12-01 19:54:21
【问题描述】:

我想修改某个程序中的寄存器的值。 唯一的问题是,我不知道如何访问它。如果有办法,我如何读/写它? (首选语言 C++)

【问题讨论】:

  • 抱歉,这对我来说毫无意义。
  • 寄存器在运行程序时(在某些进程中)有变化的值。所以你的问题毫无意义;您不能修改程序中的寄存器。但是当程序运行时,它确实会修改寄存器和内存。
  • 正如 SoapBox 所说,您想要做的通常由调试器完成。只有通过在特定位置(如断点)停止特定线程、执行寄存器(上下文)更改然后恢复线程来执行此操作才有意义。我只在 Windows 上做过类似的事情,相关的 API 甚至不允许您更改线程的上下文而不以某种方式停止它。

标签: c++ assembly executable


【解决方案1】:

如果您想在程序运行时修改某个特定的寄存器,您可以使用调试器来执行此操作,例如OllyDbg

如果您想在程序未运行时修改代码,以便将来运行程序时它的行为有所不同,您可以使用反汇编程序(例如IDA)查看程序集。但是您还需要一些可以根据您的修改重新组装程序的东西,例如NAsm

您还可以在两个程序都在运行时使用 Windows 中的 OpenProcess() 函数将一个程序附加到另一个程序。然后,您可以读取和写入任意值到另一个进程,包括修改它的代码。设置和正常工作是一件非常棘手的事情......这就是调试器的工作方式,这通常是非常复杂的软件。最好使用现有的而不是尝试编写自己的!

【讨论】:

  • 您的答案是针对 Windows 的(我认为它不能回答 OP 的原始问题)。在 Linux 上情况会有所不同。
  • 没有什么不同,无论是什么(保护模式)操作系统,您都必须作为调试器来执行此操作。只是程序名称不同(例如,gdb 用于 Linux)。
【解决方案2】:

据我正确理解,您想编写一个程序:

  • 在某个地址(断点)停止另一个正在运行的程序
  • 等到断点到达
  • 读取某个寄存器的当前值
  • 将另一个值写入该寄存器
  • 断点后继续执行程序

不使用断点绝对没有意义,因为汇编寄存器在程序的不同部分用于完全不同的目的。所以修改汇编寄存器只有在其他程序停在特定位置时才有意义。

在 Windows 下,Win32 代码(不是 .NET 代码),你可以按以下方式进行:

  • 使用 CreateProcessDEBUG_PROCESS 启动另一个 .EXE 文件(也许 - 更安全的方法 - CREATE_SUSPENDED)标志设置或...
  • ...使用DebugActiveProcess 调试已经运行的进程。
  • 使用ReadProcessMemoryWriteProcessMemory将断点地址处的汇编指令(正确的是:字节而不是指令)替换为0xCCint3)。
  • 如果您使用CREATE_SUSPENDED 使用ResumeThread 来实际启动另一个.EXE 文件
  • 调用WaitForDebugEventContinueDebugEvent 直到到达断点。您可以使用GetThreadContext 获取程序停止的位置。
  • int3 指令替换为使用WriteProcessMemory 的原始指令
  • 使用GetThreadContextSetThreadContext 修改寄存器。节点:在int3 指令之后,EIP 寄存器必须递减!
  • 使用ContinueDebugEvent 让程序继续运行
  • 不幸的是,您的程序必须等待观察到的 EXE 文件的进一步调试事件并处理它们(WaitForDebugEventContinueDebugEvent) - 即使您“只是”希望程序运行...

如果你想多次在这个断点处停止程序,它变得更加复杂:你必须在断点后每次继续时在EFlags寄存器中设置“跟踪”标志,这样就完成了一步;在这一步之后,您必须再次将原始汇编指令替换为 int3

我自己在几年前就这样做了,因为我为此编写了一些检查程序,其工作类似于 Linux 中的“strace”...

如果您使用的是 C++.NET(或 C#):有一个 .NET 程序集可以让您完成所有这些操作,但使用此程序集并不比 Win32 变体更容易。

如果您只想将其用于教育用途:

不幸的是,Windows 的调试 API 远不如 Linux 的调试 API (ptrace) 好用。如果您只是为了教育目的而这样做(并且您要检查的 EXE 文件是由您编写的),我会在 Linux 下而不是 Windows 下进行此练习。然而,即使在 Linux 下,这也不是一件容易的事……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-23
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多