11

如何获取进程的起始地址/基地址?例如 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 的基地址。

这是我的意思的图片:

内存地址

4

3 回答 3

2

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

于 2012-10-24T09:01:20.347 回答
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

我无法让 attach() 工作并使用负载代替。Pydbg 有很多功能,例如 read_proccess_memory、write_process_memory 等。

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

于 2012-10-24T14:05:06.107 回答
1

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

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

例子:

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

如果需要AddressOfEntryPointor BaseOfCode,则必须使用遵循 PE 规范的ctypes调用来定位偏移量,或者只使用来学习偏移量。ReadProcessMemorydumpbin /headers solitaire.exe

于 2012-10-28T02:07:15.033 回答