2012-10-24 121 views
8

如何获取进程的开始/基地址?按照实施例Solitaire.exe(solitaire.exe + BAFA8)Python - 如何获取进程的开始/基地址?

#-*- 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的基地址。

这里是我的意思图片:

memory address

+0

我不知道你的意思其实是:程序入口的内存地址或exe文件的文件路径? – Al2O3

+0

@Rubby:程序入口的内存地址。但我不知道如何。与win32api.GetModuleHandle(无)的东西?当我发现地址,我必须添加一个静态偏移量(0xBAFA8)==>来获得一个新的地址... – Seppo

回答

2

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

1

安装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

我无法得到tach()工作并使用加载代替。 Pydbg具有许多功能,如read_proccess_memory,write_process_memory等。

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

1

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

如果不是,该地址是模块(DLL/EXE)的头,可与dumpbin实用工具随Visual Studio中显示的开始,也可以使用Microsoft PE and COFF Specification确定AddressOfEntryPoint自己把它解释和BaseOfCode作为基地址的偏移量。如果模块的基址不是您需要的,则可以选择其中一个。

例子:

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

如果需要AddressOfEntryPointBaseOfCode,你将不得不使用​​调用ReadProcessMemory的PE规格定位偏差,或者只是使用dumpbin /headers solitaire.exe学习的偏移量以下。

+0

嗨,我现在使用EnumProcessModules(http://msdn.microsoft.com/en-us/库/ ms682633.aspx)。但现在的问题是,我只能得到32位句柄... – Seppo

+0

您的进程是32位进程吗?你需要64位才能获得64位句柄。 –

+0

嗨,我的过程是一个64位的过程。 – Seppo