【问题标题】:How do I get the base address of another process? (ASLR)如何获取另一个进程的基地址? (ASLR)
【发布时间】:2016-06-13 14:44:19
【问题描述】:

我需要获取 .exe 的基址地址,它每次启动时都有一个随机基址。我已经尝试过,但它似乎不起作用:

int Base = (DWORD)GetModuleHandle("Test.exe");

怎么了?

【问题讨论】:

  • 该方法在我的测试中是正确的。你能粘贴你的整个代码吗?还是您想获取另一个进程的基地址?
  • 为什么你认为调用GetModuleHandle 应该做你想做的事?
  • 不,它返回一个已加载模块的句柄。碰巧句柄的值也是模块在调用进程地址空间中加载的地址
  • 并不是说这些都可以带你去任何地方,但是模块的基地址和模块的入口点是不同的东西。如果你假设一个是另一个,你会很快死去。假设 32 位地址会造成更多的痛苦。
  • @PaulR: GetModuleHandle() 是一个仅限 Windows 的函数。 WriteProcessMemory() 是 Windows 跨进程边界写入数据的方式。如果调用进程没有请求的安全权限来打开指定进程的句柄,OpenProcess() 将失败,如果指定的HANDLE 对指定的进程没有足够的安全权限,ReadProcessMemory()WriteProcessMemory() 将失败过程。恶意软件会使用ReadProcessMemory() 来检查内存。如果恶意软件以足够的权限运行,则不会阻止它读取另一个进程的内存。

标签: c++ windows aslr


【解决方案1】:

您似乎正在尝试获取另一个进程的基地址。可悲的是,GetModuleHandle 仅适用于当前进程中的模块。为实现您的目标,您需要使用 PSAPI 或CreateToolhelp32Snapshot 来提取另一个进程的模块列表。并且基地址在列表中。

【讨论】:

  • @Customality,看到这个:stackoverflow.com/questions/14467229/…
  • 由于 OP 无论如何都会摆弄其他进程的内存,因此更直接的解决方案是注入一个 DLL(例如使用 CreateRemoteThread)。一旦你闯入别人的房子,你可以调用GetModuleHandle(NULL) 来检索用于创建进程的可执行映像的基地址。
【解决方案2】:

我需要获取 .exe 的基地址/入口点地址,它每次启动时都有一个随机基地址。该程序使用 ASLR。

...

我将使用它来编辑正确进程中的某些内存块

为了将数据写入另一个进程,您需要使用WriteProcessMemory(),这需要您为正在写入的进程打开一个HANDLE

您使用OpenProcess() 获得HANDLE,请求PROCESS_VM_OPERATIONPROCESS_VM_WRITE 权限。 OpenProcess() 将进程 ID 作为输入,您可以从以下位置获取:

请参阅 Process EnumerationEnumerating All Processes

您在任何时候都不需要确定正在写入的进程的基地址。让系统为您跟踪该信息。您所需要的只是打开进程的HANDLE

【讨论】:

  • 呃...您通常需要基地址来计算要读取或修改的静态变量或代码块的虚拟地址吗? (我假设你可以使用 Module32First/Module32Next 来做到这一点。)
  • @HarryJohnston:传递给ReadProcessMemory()WriteProcessMemory() 的地址是相对于指定HANDLE 表示的进程的基地址的虚拟地址。它与特定模块无关。所以,你仍然不需要知道进程的基地址,只需要知道进程内目标内存块的相对虚拟地址。您如何获得该地址是一个不同的问题。它可能是提前静态知道的。它可以通过处理其他内存块和跟随指针来动态确定。这是一个非常广泛的话题。
  • @HarryJohnston:对于静态变量,您可能知道它在模块中的固定偏移量,是的,您可以在进程中检索模块的基地址。由此,您可以确定进程内变量的虚拟地址。
  • 啊。我假设“进程的基地址”是指加载到进程中的主模块的基地址 - 我似乎很清楚这就是 OP 的意思,无论如何。听起来您是在谈论进程的整个虚拟地址空间的基地址,相对于一些更大的地址空间。我同意你不需要那个,事实上我认为甚至没有这样的事情 - AFAIK,地址空间的各个活动部分都是单独跟踪的 - 但无论如何。
  • @HarryJohnston:进程内只有一个地址空间,所有内存访问都与该地址空间相关。可能有多个模块,包括主模块,在该地址空间内运行。
猜你喜欢
  • 2019-06-26
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
相关资源
最近更新 更多