2012-12-25 46 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...