Finding the baseaddress of a running process
我得到了以下代码:
1
2 3 4 5 6 7 8 9 10 11 |
import subprocess
from ctypes import * #-Part where I get the PID and declare all variables-# OpenProcess = windll.kernel32.OpenProcess processHandle = OpenProcess(PROCESS_ALL_ACCESS, False, PID) ReadProcessMemory(processHandle, address, buffer, bufferSize, byref(bytesRead)) |
所有这一切都完美无缺,但由于某些进程使用所谓的 BaseAddress 或 StartAddress。在我的情况下,这个 BaseAddress 的大小不时是随机的。
正如这里所建议的,我尝试使用以下代码:
1
|
BaseAddress = win32api.GetModuleHandle(None)
|
它所做的只是一遍又一遍地给出相同的十六进制值,即使我确定我的 BaseAddress 已经改变了。
来自链接线程的屏幕截图显示了我正在寻找的内容(左侧部分是基地址):
- 有没有想过你的问题的答案?我自己在寻找答案。
- @DreamLane 不,仍然没有找到任何东西。决定改用c#。真可惜,因为我喜欢Python。
- 我也一直在争论改用 C 还是 C#。 Python对于原型设计来说很棒……
我确实设法找到了适用于 python 3.5 32 位和 64 位的解决方案。
对于 32 位,我使用了 psutil 和 pymem(正如在这个问题上已经建议的那样)。:
1
2 3 4 5 6 7 8 9 10 11 12 13 |
import psutil
import pymem my_pid = None base_address = pymem.process.base_address(pid) |
对于 64 位 pymem 无法正常工作。我找到了使用 win32api.GetModuleHandle(fileName) 的建议,但它需要 win32api.LoadLibrary(fileName) 未使用已在运行的进程。
因此我找到了这个次优的解决方案,因为它返回了一个完整的可能性列表:
1
2 3 4 5 6 7 8 9 10 |
import win32process
import win32api # first get pid, see the 32-bit solution PROCESS_ALL_ACCESS = 0x1F0FFF |
- 第一个片段中 pid 来自哪里?
请参阅 How to enumerate modules in python 64bit 以获得一些可以使用的好代码。您正在寻找 \\’modBaseAddr\\’。
有关 tagMODULEENTRY32 的更多信息,请参阅 http://msdn.microsoft.com/en-us/library/windows/desktop/ms684225(v=vs.85).aspx
您也可以使用 pymem(\\’obsolete\\’ 项目,但仍然有效)和以下代码(您需要 modBaseAddr):
1
2 3 |
for m in self.listModules():
if m.szModule==szModule: print m.szModule, m.szExePath, m.modBaseAddr |
- 使用 pymem 它可以执行 base_address = pymem.process.base_address(pid) 但您链接到的 MODULEENTRY32 类不起作用 – 每次运行它时它都会返回不同的 modeBaseAddr 并且它是错误的。
来源:https://www.codenong.com/14027459/