2012-10-24 24 views
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 के आधार पता की जरूरत है।

यहाँ मैं क्या मतलब है की एक तस्वीर है:

memory address

+0

मैं नहीं जानता कि क्या आप वास्तव में मतलब है: कार्यक्रम या exe फ़ाइल के फ़ाइल पथ के प्रवेश की स्मृति पता? – Al2O3

+0

@Rubby: कार्यक्रम की प्रविष्टि का स्मृति पता। लेकिन मुझे नहीं पता कि कैसे। Win32api.GetModuleHandle (कोई नहीं) के साथ कुछ? जब मैं पता पता चला मैं एक स्थिर ऑफसेट (0xBAFA8) ==> एक नया पता पाने के लिए ... – Seppo

उत्तर

2

मुझे लगता है कि संभाल GetModuleHandle द्वारा दिया वास्तव में दिया मॉड्यूल के आधार पता है। आप नल पास करके exe के हैंडल मिलता है।

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

नहीं है अभी

मैं नहीं मिल सका काम करने के लिए tach() और इसके बजाय लोड का उपयोग किया। पीईडीबीजी में कार्यक्षमता का भार है, जैसे read_proccess_memory, write_process_memory आदि

ध्यान दें कि आप यादृच्छिक रूप से स्मृति को याद नहीं कर सकते हैं, क्योंकि एक ऑपरेटिंग सिस्टम आपकी प्रक्रिया (संरक्षित मोड) से अन्य प्रक्रियाओं की स्मृति की सुरक्षा करता है। X86 प्रोसेसर से पहले कुछ ऐसे थे जो सभी प्रोसेसर को वास्तविक मोड में चलाने की इजाजत देते थे, यानी प्रत्येक प्रोग्राम के लिए स्मृति की पूर्ण पहुंच। गैर-दुर्भावनापूर्ण सॉफ़्टवेयर आमतौर पर (हमेशा?) अन्य प्रक्रियाओं की स्मृति को पढ़/लिखता नहीं है।

1

GetModuleHandle की HMDOULE मूल्य लोड मॉड्यूल के आधार का पता है और शायद पता आप गणना करने के लिए ऑफसेट की जरूरत है।

यदि नहीं, तो उस पते मॉड्यूल (DLL/EXE) के शीर्षक है, जो dumpbin उपयोगिता है कि दृश्य स्टूडियो के साथ आता है के साथ प्रदर्शित किया जा सकता की शुरुआत है या आप इसे अपने आप को AddressOfEntryPoint निर्धारित करने के लिए Microsoft PE and COFF Specification का उपयोग कर व्याख्या कर सकते हैं और BaseOfCode आधार पते से ऑफसेट के रूप में। यदि मॉड्यूल का आधार पता आपको आवश्यक नहीं है, तो इनमें से एक दूसरा विकल्प है।

उदाहरण:

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

तो AddressOfEntryPoint या BaseOfCode की जरूरत है, तो आप ctypes उपयोग करने के लिए ऑफसेट का पता लगाने की है, या बस ऑफसेट जानने के लिए dumpbin /headers solitaire.exe का उपयोग पीई विनिर्देश निम्नलिखित ReadProcessMemory फोन करना होगा।

+0

हाय, मैं अब EnumProcessModules (उपयोग कर रहा हूँ http://msdn.microsoft.com/en-us/ जोड़ने के लिए पुस्तकालय/ms682633.aspx)। लेकिन समस्या यह है कि मैं केवल 32-बिट हैंडल मिलता है ... – Seppo

+0

अपनी प्रक्रिया एक 32-बिट प्रक्रिया है? 64-बिट हैंडल प्राप्त करने के लिए आपको 64-बिट होने की आवश्यकता होगी। –

+0

नमस्ते, मेरा प्रक्रिया एक 64-बिट प्रक्रिया है। – Seppo