Вопрос по windows, ctypes, process, pywin32, python – Python - Как получить начальный / базовый адрес процесса?

8

Как получить начальный / базовый адрес процесса? Например, 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.

Вот's картина того, что я имею в виду:

@Rubby: адрес памяти записи программы. Но я нене знаю как. что-то с win32api.GetModuleHandle (нет)? Когда я узнал адрес, я должен добавить статическое смещение (0xBAFA8) ==> чтобы получить новый адрес ... Seppo
Я нене знаете, что вы на самом деле имеете в виду: адрес памяти записи программы или путь к файлу exe? Al2O3

Ваш Ответ

3   ответа
2

GetModuleHandle фактически является базовым адресом данного модуля. Вы получаете дескриптор exe, передавая NULL.

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

Я не могt заставить attach () работать и использовать load вместо этого. Pydbg имеет множество функций, таких как read_proccess_memory, write_process_memory и т. Д.

Обратите внимание, что вы можете• случайным образом меняйте память, потому что операционная система защищает память других процессов от вашего процесса (защищенный режим). До появления процессоров x86 были некоторые, которые позволяли всем процессорам работать в реальном режиме, то есть полный доступ к памяти для каждой программы. Нервредное программное обеспечение обычно (всегда?) Нечитать / писать другие процессы объем памяти.

1

GetModuleHandle является базовым адресом загруженного модуля и, вероятно, является адресом, который необходим для вычисления смещения.

Если нет, то этот адрес является началом заголовка модуля (DLL / EXE), который можно отобразить с помощьюdumpbin Утилита, которая поставляется с Visual Studio, или вы можете интерпретировать ее самостоятельно, используяСпецификация Microsoft PE и COFF определитьAddressOfEntryPoint а такжеBaseOfCode как смещения от базового адреса. Если базовый адрес модуля неТо, что вам нужно, один из этих двух вариантов.

Пример:

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

ЕслиAddressOfEntryPoint или жеBaseOfCode нужен, тыпридется использоватьctypes звонитьReadProcessMemory следуя спецификации PE, чтобы найти смещения, или просто использоватьdumpbin /headers solitaire.exe чтобы узнать смещения.

Привет, я использую сейчас EnumProcessModules (msdn.microsoft.com/en-us/library/ms682633.aspx). Но проблема в том, что теперь я получаю только 32-битные дескрипторы ... Seppo
Привет, мой процесс 64-битный процесс. Seppo
Является ли ваш процесс 32-битным процессом? Вы'Чтобы получить 64-битные дескрипторы, нужно быть 64-битным. Mark Tolonen

Похожие вопросы