2012-10-24 6 views
8

Come ottengo l'indirizzo di partenza/base di un processo? Per esempio Solitaire.exe (solitaire.exe + BAFA8)Python - Come ottenere l'indirizzo di partenza/base di un processo?

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

Vorrei calcolare un indirizzo di memoria e per questo modo ho bisogno di l'indirizzo di base di solitaire.exe.

Ecco una foto di quello che voglio dire:

memory address

+0

Non so cosa intendi in realtà: l'indirizzo di memoria della voce del programma o il percorso del file exe? – Al2O3

+0

@Rubby: l'indirizzo di memoria della voce del programma. Ma non so come. qualcosa con win32api.GetModuleHandle (nessuno)? Quando ho trovato l'indirizzo devo aggiungere un offset statico (0xBAFA8) ==> per ottenere un nuovo indirizzo ... – Seppo

risposta

2

Credo che l'handle restituito da GetModuleHandle è in realtà l'indirizzo di base del modulo dato. Ottieni il comando dell'exe passando NULL.

1

Installare pydbg

Fonte: https://github.com/OpenRCE/pydbg

binari non ufficiali qui: 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 

Si potrebbe desiderare di avere uno sguardo a PaiMei, anche se non è molto attivo in questo momento https://github.com/OpenRCE/paimei

Non ho potuto ottenere a tach() per lavorare e utilizzare invece il carico. Pydbg ha un sacco di funzionalità, come read_proccess_memory, write_process_memory, ecc.

Nota che non è possibile cambiare a caso la memoria, perché un sistema operativo protegge la memoria di altri processi dal processo (modalità protetta). Prima dei processori x86 ce n'erano alcuni che permettevano a tutti i processori di funzionare in modalità reale, cioè l'accesso completo alla memoria per ogni programma. Il software non dannoso solitamente (sempre?) Non legge/scrive memoria di altri processi.

1

Il valore HMDOULE di GetModuleHandle è l'indirizzo di base del modulo caricato ed è probabilmente l'indirizzo che è necessario calcolare l'offset.

In caso contrario, tale indirizzo è l'inizio dell'intestazione del modulo (DLL/EXE), che possono essere visualizzati con l'utilità dumpbin fornito con Visual Studio o si può interpretare da soli utilizzando il Microsoft PE and COFF Specification per determinare il AddressOfEntryPoint e BaseOfCode come offset dall'indirizzo di base. Se l'indirizzo di base del modulo non è quello che ti serve, una di queste due è un'altra opzione.

Esempio:

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

Se è necessario il AddressOfEntryPoint o BaseOfCode, dovrete usare ctypes per chiamare ReadProcessMemory seguendo le specifiche PE per individuare gli offset, o semplicemente usare dumpbin /headers solitaire.exe per imparare gli offset.

+0

Ciao, sto usando ora EnumProcessModules (http://msdn.microsoft.com/en-us/ biblioteca/ms682633.aspx). Ma il problema ora è che ottengo solo maniglie a 32 bit ... – Seppo

+0

Il processo è un processo a 32 bit? Avrai bisogno di essere 64-bit per ottenere gli handle a 64-bit. –

+0

Ciao, il mio processo è un processo a 64 bit. – Seppo