2012-10-24 9 views
8

Jak uzyskać adres początkowy/podstawowy procesu? Na przykład Solitaire.exe (solitaire.exe + BAFA8)Python - Jak uzyskać adres początkowy/bazowy procesu?

#-*- 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 

Chciałbym obliczyć adres pamięci i ten sposób muszę adres bazowy solitaire.exe.

Oto obraz tego, co mam na myśli:

memory address

+0

Nie wiem, co masz na myśli: adres pamięci wejścia programu lub ścieżki pliku pliku exe? – Al2O3

+0

@Rubby: adres pamięci wpisu programu. Ale nie wiem jak. coś z win32api.GetModuleHandle (None)? Kiedy dowiedziałem się, że muszę dodać adres statyczny (0xBAFA8) ==>, aby uzyskać nowy adres ... – Seppo

Odpowiedz

2

myślę uchwyt zwrócony przez GetModuleHandle jest faktycznie adres bazowy danego modułu. Dostajesz uchwyt exe, przekazując NULL.

1

Install pydbg

Źródło: https://github.com/OpenRCE/pydbg

Nieoficjalne binarne tutaj: 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 

Czasami warto spojrzeć na PaiMei, choć nie jest bardzo aktywny w tej chwili https://github.com/OpenRCE/paimei

Nie mogłem uzyskać tach() do pracy i zamiast tego użył obciążenia. Pydbg ma wiele funkcji, takich jak read_proccess_memory, write_process_memory itp.

Należy pamiętać, że nie można losowo zmieniać pamięci, ponieważ system operacyjny chroni pamięć innych procesów przed procesem (tryb chroniony). Przed procesorami x86 były pewne, które pozwalały wszystkim procesorom działać w trybie rzeczywistym, tj. Pełny dostęp do pamięci dla każdego programu. Niezłośliwe oprogramowanie zwykle (zawsze?) Nie odczytuje/nie zapisuje pamięci innych procesów.

1

Wartość HMDOULE z GetModuleHandle jest adresem bazowym załadowanego modułu i prawdopodobnie jest to adres potrzebny do obliczenia przesunięcia.

Jeśli nie, że adres jest początek nagłówka modułu (DLL/EXE), które mogą być wyświetlane za pomocą narzędzia dumpbin że pochodzi z Visual Studio lub można to interpretować siebie używając Microsoft PE and COFF Specification określić AddressOfEntryPoint i BaseOfCode jako przesunięcia z adresu bazowego. Jeśli adres bazowy modułu nie jest tym, czego potrzebujesz, jedna z tych dwóch opcji jest inna.

Przykład:

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

If AddressOfEntryPoint lub BaseOfCode jest potrzebne, będziesz musiał użyć ctypes zadzwonić ReadProcessMemory zgodnie ze specyfikacją PE zlokalizowania przesunięć, lub po prostu wykorzystać dumpbin /headers solitaire.exe nauczyć przesunięć.

+0

Witam, używam teraz EnumProcessModules (http://msdn.microsoft.com/en-us/ library/ms682633.aspx). Ale problem polega na tym, że mam tylko 32-bitowe uchwyty ... – Seppo

+0

Czy proces jest procesem 32-bitowym? Aby uzyskać 64-bitowe uchwyty, musisz być 64-bitowy. –

+0

Witam, mój proces jest procesem 64-bitowym. – Seppo