首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >查找正在运行的进程的基地址

查找正在运行的进程的基地址
EN

Stack Overflow用户
提问于 2012-12-25 11:32:15
回答 2查看 4.5K关注 0票数 4

我得到了以下代码:

代码语言:javascript
复制
import subprocess
from ctypes import *

#-Part where I get the PID and declare all variables-#

OpenProcess = windll.kernel32.OpenProcess
ReadProcessMemory = windll.kernel32.ReadProcessMemory

processHandle = OpenProcess(PROCESS_ALL_ACCESS, False, PID)

ReadProcessMemory(processHandle, address, buffer, bufferSize, byref(bytesRead))

所有这些都工作得无懈可击,但因为一些进程使用了所谓的BaseAddressStartAddress。在我的例子中,这个BaseAddress的大小有时是随机的。按照here的建议,我尝试使用以下代码:

代码语言:javascript
复制
BaseAddress = win32api.GetModuleHandle(None)

它所做的就是一次又一次地给出相同的十六进制值,即使我确定我的BaseAddress已经改变了。

来自链接线程的屏幕截图显示了我正在寻找的内容(其中左侧部分是基地址):

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-10 16:36:08

我确实设法找到了python 3.5 32位和64位的解决方案。

对于32位,我使用了psutil和pymem (已经在这个问题上建议过了):

代码语言:javascript
复制
import psutil
import pymem

my_pid = None
pids = psutil.pids()
for pid in pids:
    ps = psutil.Process(pid)
    # find process by .exe name, but note that there might be more instances of solitaire.exe
    if "solitaire.exe" in ps.name():
        my_pid = ps.pid
        print( "%s running with pid: %d" % (ps.name(), ps.pid) )

base_address = pymem.process.base_address(pid)

对于64位,pymem不起作用。我找到了使用win32api.GetModuleHandle(fileName)的建议,但它需要win32api.LoadLibrary(fileName),它没有使用已经在运行的进程。

因此,我找到了这个次优解,因为它返回了一个完整的可能性列表:

代码语言:javascript
复制
import win32process
import win32api

# first get pid, see the 32-bit solution

PROCESS_ALL_ACCESS = 0x1F0FFF
processHandle = win32api.OpenProcess(PROCESS_ALL_ACCESS, False, my_pid)
modules = win32process.EnumProcessModules(processHandle)
processHandle.close()
base_addr = modules[0] # for me it worked to select the first item in list...
票数 5
EN

Stack Overflow用户

发布于 2013-07-29 08:44:28

有关使用的一些好代码,请参阅How to enumerate modules in python 64bit。您正在查找“modBaseAddr”。

有关tagMODULEENTRY32的更多信息,请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms684225(v=vs.85).aspx

你也可以用下面的代码(你想要的是modBaseAddr)来使用pymem (‘过时’项目,但仍然有效):

代码语言:javascript
复制
  for m in self.listModules():
    if m.szModule==szModule:
      print m.szModule, m.szExePath, m.modBaseAddr
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14027459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档