【问题标题】:How can you access memory of another process and call its functions?如何访问另一个进程的内存并调用它的函数?
【发布时间】:2010-10-24 04:47:53
【问题描述】:

我想学习如何读取其他进程的内存,并让我的程序调用其他进程的函数,以及我自己的参数和东西不能做什么。我用谷歌搜索了它,似乎您需要使用 ReadProcessMemory 之类的东西,但我找不到任何好的教程来解释如何使用它们。谁能指出我正确的方向来学习这样的东西?我想在 Windows(7 位和 64 位,如果重要的话)上用 C++(或 java,如果可能的话)来做。

另外,我知道这听起来很主观,可能会被用于恶意目的,但我保证不会出于任何有害原因使用由此获得的任何知识。我纯粹想学习这个是为了好玩,并自学一些新东西。

【问题讨论】:

  • 您究竟想用 ReadProcessMemory 做什么?你的问题不够具体。
  • 嗯,我有点想找人推荐一个关于如何使用 ReadProcessMemory 之类的东西的教程。我现在真的没有什么特别的想法。我基本上想做的是学会“破解”我自己的程序。我想做一个程序,要求用户输入上面的字符串以继续。然后我想制作一个“机器人”,它将读取进程内存以查看字符串是什么,然后自行输入。我只想玩这样的东西,但我不知道从哪里开始。

标签: c++ windows


【解决方案1】:

你不能直接调用其他进程中的函数,因为你的进程和其他进程有不同的地址空间。解决此问题的一种方法是在进程中创建一个远程线程(使用 CreateRemoteThread 或 RtlCreateUserThread),但这仅允许您将一个参数传递给函数。您可以尝试创建一个远程线程,将参数写入其堆栈并使用 SetThreadContext 更改其寄存器。另一种方法是注入您自己的调用该函数的 DLL。

另一个问题是定位要调用的函数。您可能需要为未导出所需功能的 EXE 或 DLL 加载符号。

有关 Windows 内部的一般问题,请尝试在 Sysinternals Forums 上提问。

编辑:在事先不知道图像文件中指令和数据的布局的情况下,您所说的(读取进程检查用户输入的字符串)很难在程序中完成。例如,如果您有一个crackme 程序,您可以使用像IDA Pro 这样的静态分析工具,或者在调试器下运行该程序。无论哪种方式,这些事情通常都需要人工输入,而且很难自动完成。

【讨论】:

    【解决方案2】:

    Processes 在设计和定义上是相互隔离的。它们有单独的地址空间。

    操作系统保持它的 进程分离并分配 他们需要的资源,以便他们 不太可能干扰每个 其他...

    他们可以当然进行交流,但前提是他们选择通过某种形式的inter-process communication 进行交流。

    然而,threads,有时被称为轻量级进程,共享它们的地址空间并且可以读取彼此的数据结构。

    不清楚,你的意思是什么

    调用其他进程函数

    一个函数f()可以编译成多个进程的可执行代码。进程 A 和进程 B 可以在各自的上下文中独立调用 f()

    否则,进程 A 可以“通信”到进程 B 以执行某些操作,例如可以在 B 中的函数 g() 中实现。B 可以在其上下文中执行它并将结果“通信”回 A。

    【讨论】:

      【解决方案3】:

      我看不出这个有什么好处,但无论如何。至少有两种方法可以让另一个进程调用某些东西:

      1)CreateRemoteThread(),将在进程中创建一个线程。

      2) QueueUserAPC() 将使该进程中的现有线程调用回调函数。

      如果禁用了 ASLR,那么调用不带参数的函数就足够了。否则,您还需要 VirtualQueryEx()ReadProcessMemory()WriteProcessMemory()

      是的,这不是在 java 中要做的事情:)

      【讨论】:

      • 如果线程没有执行警报等待,则不会执行用户 APC。大多数线程都没有。
      • @wj32 对,但如果你有另一个进程,那么你可以让它们成为警报。
      • 但是,从 OP 的目标来看,这将是作弊 :) 当然,应该可以在 NtTestAlert 创建一个远程线程,以便该线程在恢复后立即执行 APC。跨度>
      猜你喜欢
      • 2016-08-11
      • 1970-01-01
      • 2012-06-14
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      相关资源
      最近更新 更多