Python – 如何获得一个进程的开始/基地址?

我如何获得进程的开始/基地址? 每个示例Solitaire.exe(solitaire.exe + BAFA8)

#-*- coding: utf-8 -*- import ctypes, win32ui, win32process PROCESS_ALL_ACCESS = 0x1F0FFF HWND = win32ui.FindWindow(None,u"Solitär").GetSafeHwnd() PID = win32process.GetWindowThreadProcessId(HWND)[1] PROCESS = ctypes.windll.kernel32.OpenProcess(PROCESS_ALL_ACCESS,False,PID) print PID, HWND,PROCESS 

我想计算一个内存地址,为此我需要solitaire.exe的基地址。

这里是我的意思的图片:

内存地址

我认为GetmoduleeHandle返回的句柄实际上是给定模块的基地址。 你通过传递NULL来得到exe的句柄。

安装pydbg

来源: https : //github.com/OpenRCE/pydbg

非官方的二进制文件在这里: http : //www.lfd.uci.edu/~gohlke/pythonlibs/#pydbg

 from pydbg import * from pydbg.defines import * import struct dbg = pydbg() path_exe = "C:\\windows\\system32\\calc.exe" dbg.load(path_exe, "-u amir") dbg.debug_event_loop() parameter_addr = dbg.context.Esp #(+ 0x8) print 'ESP (address) ',parameter_addr #attach not working under Win7 for me #pid = raw_input("Enter PID:") #print 'PID entered %i'%int(pid) #dbg.attach(int(pid)) #attaching to running process not working 

你可能想看看PaiMei,虽然现在不太活跃https://github.com/OpenRCE/paimei

我不能让attach()来工作,而是使用加载。 Pydbg具有许多功能,例如read_proccess_memory,write_process_memory等。

请注意,不能随意更改内存,因为操作系统会保护进程中其他进程的内存(保护模式)。 在x86处理器之前,有一些允许所有的处理器以实模式运行,即每个程序都能够完全访问内存。 非恶意软件通常(总是?)不读/写其他进程的内存。

GetmoduleeHandle的HMDOULE值是加载模块的基地址,可能是您计算偏移所需的地址。

如果不是,那么该地址就是模块(DLL / EXE)的头部的开始,可以使用Visual Studio附带的dumpbin实用程序来显示它,或者您可以使用Microsoft PE和COFF规范自己解释它以确定AddressOfEntryPointBaseOfCode作为基地址的偏移量。 如果模块的基址不是您所需要的,则这两个中的一个是另一个选项。

例:

 >>> BaseAddress = win32api.GetmoduleeHandle(None) + 0xBAFA8 >>> print '{:08X}'.format(BaseAddress) 1D0BAFA8 

如果需要AddressOfEntryPointBaseOfCode则必须使用ctypes在PE规范之后调用ReadProcessMemory来查找偏移量,或者使用dumpbin /headers solitaire.exe来了解偏移量。