如何获取流程的起始/基址?每个示例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的基地址。
这是我的意思:
答案 0 :(得分:2)
我认为GetModuleHandle返回的句柄实际上是给定模块的基址。通过传递NULL来获取exe的句柄。
答案 1 :(得分: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处理器之前,有一些允许所有处理器以实模式运行,即每个程序完全访问内存。非恶意软件通常(总是?)不会读/写其他进程的内存。
答案 2 :(得分:1)
GetModuleHandle的HMDOULE值是加载模块的基地址,可能是计算偏移量所需的地址。
如果没有,该地址是模块头(DLL / EXE)的开头,可以使用Visual Studio附带的dumpbin
实用程序显示,或者您可以使用{{ 3}}确定AddressOfEntryPoint
和BaseOfCode
作为基址的偏移量。如果模块的基地址不是您所需要的,则这两个中的一个是另一个选项。
示例:
>>> BaseAddress = win32api.GetModuleHandle(None) + 0xBAFA8
>>> print '{:08X}'.format(BaseAddress)
1D0BAFA8
如果需要AddressOfEntryPoint
或BaseOfCode
,则必须使用ctypes
根据PE规范调用ReadProcessMemory
来查找偏移量,或者只是使用dumpbin /headers solitaire.exe
来学习抵消。