如何访问另一个进程的内存并调用其函数?

时间:2010-10-24 04:47:54

标签: c++ windows

我想学习如何阅读其他进程内存并让我的程序调用其他进程函数,而不是我自己的参数和东西。我用谷歌搜索它,似乎你需要使用像ReadProcessMemory这样的东西,但我找不到任何好的教程来解释如何使用它们。谁能指出我正确的方向来学习这样的事情?我希望在Windows上使用C ++(或java,如果可能的话)(7和64位,如果这很重要的话)。

另外,我知道这听起来很主观,可以用于恶意目的,但我保证不会因为任何有害的原因而使用从中获得的任何知识。我纯粹想要学习这个以获得乐趣,并自学一些新东西。

3 个答案:

答案 0 :(得分:6)

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

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

有关Windows内部的一般问题,请尝试询问Sysinternals Forums

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

答案 1 :(得分:1)

Processes,根据设计和定义,彼此隔离。他们有独立的地址空间。

  

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

他们可以肯定进行沟通,但只有他们选择通过某种形式的inter-process communication进行沟通。

但是,threads(有时称为轻量级进程)共享其地址空间并可以读取彼此的数据结构。

不确定,你的意思是什么

  

调用其他进程函数

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

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

答案 2 :(得分:0)

我无法看到任何有益的用途,但无论如何。至少有两种方法可以让另一个进程调用:

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

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

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

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