How do I get the base address of another process? (ASLR)
我需要获取一个 .exe 的基地址地址,它每次启动时都有一个随机基地址。我试过这个,但它似乎不起作用:
1
| int Base = (DWORD)GetModuleHandle("Test.exe"); |
怎么了?
- 该方法在我的测试中是正确的。你能粘贴你的整个代码吗?或者您是否正在尝试获取另一个进程的基地址?
-
为什么你认为调用 GetModuleHandle 应该做你想做的事?
-
@CaptainObvlious 因为 (DWORD)GetModuleHandle(0); 返回当前进程的基地址。
-
不,它返回一个已加载模块的句柄。恰巧句柄的值也是模块在调用进程地址空间中加载的地址。
-
并不是说这些都可以带你到任何地方,但是模块的基地址和模块的入口点是不同的东西。如果你假设一个是另一个,你会很快死去。假设 32 位地址会造成更多的痛苦。
-
@PaulR,一个进程可以使用 WriteProcessMemory() 修改另一个进程中的内存内容。
-
@PaulR: GetModuleHandle() 是一个仅限 Windows 的函数。 WriteProcessMemory() 是 Windows 跨进程边界写入数据的方式。如果调用进程没有请求的安全权限来打开指定进程的句柄,OpenProcess() 将失败,如果指定的 HANDLE 对指定的进程没有足够的安全权限,ReadProcessMemory() 和 WriteProcessMemory() 将失败过程。恶意软件会使用 ReadProcessMemory() 来检查内存。如果恶意软件以足够的权限运行,没有什么能阻止它读取另一个进程的内存。
您似乎正在尝试获取另一个进程的基地址。可悲的是, GetModuleHandle 仅适用于当前进程中的模块。为了实现您的目标,您需要使用 PSAPI 或 CreateToolhelp32Snapshot 来提取另一个进程的模块列表。并且基地址在列表中。
- @Customality,看到这个:stackoverflow.com/questions/14467229/...
-
由于 OP 无论如何都会摆弄其他进程的内存,因此更直接的解决方案是注入一个 DLL(例如使用 CreateRemoteThread)。一旦你闯入别人的房子,你可以调用 GetModuleHandle(NULL) 来检索用于创建进程的可执行映像的基地址。
I need to get the base address/entry point address of a .exe which has a random base address everytime its started. The program uses ASLR.
...
I will use it to edit certain chunks of memory inside the correct process
为了将数据写入另一个进程,您需要使用WriteProcessMemory(),这需要您为正在写入的进程打开一个HANDLE。
您使用 OpenProcess() 获得 HANDLE,请求 PROCESS_VM_OPERATION 和 PROCESS_VM_WRITE 权限。 OpenProcess() 将进程 ID 作为输入,您可以从以下位置获取:
-
CreateToolhelp32Snapshot()/Process32First()/Process32Next()
-
EnumProcesses()。
-
WTSEnumerateProcesses()
请参阅进程枚举和枚举所有进程。
您在任何时候都不需要确定正在写入的进程的基地址。让系统为您跟踪该信息。您所需要的只是对进程打开 HANDLE。
-
呃……当然你通常需要基地址来计算你想要读取或修改的静态变量或代码块的虚拟地址? (我假设您可以使用 Module32First/Module32Next 来完成。)
-
@HarryJohnston:传递给 ReadProcessMemory() 和 WriteProcessMemory() 的地址是相对于指定 HANDLE 表示的进程的基地址的虚拟地址。它与特定模块无关。所以,你仍然不需要知道进程的基地址,只需要知道进程内目标内存块的相对虚拟地址。您如何获得该地址是一个不同的问题。它可能是提前静态知道的。它可以通过处理其他内存块和跟随指针来动态这是一个非常广泛的话题。
-
@HarryJohnston:对于静态变量,您可能知道它在模块中的固定偏移量,是的,您可以在进程中检索模块的基地址。由此,您可以确定进程中变量的虚拟地址。
-
啊。我假设"进程的基地址"是指加载到进程中的主模块的基地址 - 我似乎很清楚这就是 OP 的意思,无论如何。听起来您是在谈论进程的整个虚拟地址空间的基地址,相对于一些更大的地址空间。我同意你不需要那个,事实上我认为甚至没有这样的事情 - AFAIK,地址空间的各个活动部分都是单独跟踪的 - 但无论如何。
-
@HarryJohnston:进程中只有一个地址空间,所有内存访问都与该地址空间相关。可能有多个模块,包括主模块,在该地址空间内运行。
-
是的。我只是不确定如何有意义地定义"进程的基地址",而不是"加载到进程中的主模块的基地址"的简写。 :-)