2012-12-25 48 views
3

香港专业教育学院的baseaddress得到了下面的代码:找到一个正在运行的进程

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我尝试使用下面的代码:

BaseAddress = win32api.GetModuleHandle(None) 

它所做的就是一遍又一遍地给相同的十六进制值再次,即使我肯定知道我的BaseAddress已经改变。从展示什么进出口寻找(其中左边部分是baseaddress)链接线

截图: CE BaseAddress

+0

曾经找出回答你的问题?我正在寻找答案。 –

+1

@DreamLane没有,还没有找到任何东西。决定改用c#来代替。这样的耻辱,因为我爱蟒蛇。 – Willy

+0

我一直在辩论改用C++或C#。 Python虽然对于原型设计来说太棒了... –

回答

0

一些好的代码使用见How to enumerate modules in python 64bit。你正在寻找'modBaseAddr'。

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

你也使用pymem( '过时' 的项目,但仍然有效),用下面的代码(您想modBaseAddr):

for m in self.listModules(): 
    if m.szModule==szModule: 
     print m.szModule, m.szExePath, m.modBaseAddr 
+0

使用pymem它可以实现base_address = pymem.process.base_address(pid),但是您链接到的MODULEENTRY32类不起作用 - 每次运行它时都会返回一个不同的modeBaseAddr,这是不对的。 –

+0

此示例中的代码使用了什么? –

0

我没有管理为python 3.5 32位和64位寻找解决方案。

对于32位I使用psutil和pymem(如已经建议在这个问题上)。:

import psutil 
import pymem 

my_pid = None 
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),它不使用已经运行的进程。

所以我发现这个次优解,因为这将返回的可能性整个列表:

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...