2012-10-24 6 views
8

プロセスの開始/ベースアドレスを取得するにはどうすればよいですか?例Solitaire.exe(solitaire.exe + BAFA8)Python - プロセスの開始/ベースアドレスを取得するには?

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

あたりのIは、メモリアドレスを計算したいと思い、この方法のために、私はsolitaire.exeのベースアドレスが必要になります。

は、ここで私が言いたいの絵です:

memory address

+0

私はあなたが実際に何を意味するか分からない:プログラムのエントリのメモリアドレスまたはexeファイルのファイルパス? – Al2O3

+0

@Rubby:プログラムのエントリのメモリアドレス。しかし、私はどのように知りません。 win32api.GetModuleHandle(None)を使用していますか?アドレスを見つけたら、新しいアドレスを取得するために静的オフセット(0xBAFA8)==>を追加する必要があります... – Seppo

答えて

2

私はGetModuleHandleによって返されたハンドルは、実際に与えられたモジュールのベースアドレスだと思います。 NULLを渡すことによって、exeのハンドルを取得します。

1

pydbg

出典インストールします。それは今https://github.com/OpenRCE/paimei

非常にアクティブではないのですが、あなたは、PaiMeiを見てしたい場合があります 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 

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

非公式バイナリを

私は到着できませんでした作業のためにtach()を使用し、代わりに負荷を使用しました。 Pydbgにはread_proccess_memory、write_process_memoryなどの多くの機能があります。

オペレーティングシステムがプロセス(保護モード)から他のプロセスのメモリを保護するため、メモリをランダムに変更することはできません。 x86プロセッサの前には、全てのプロセッサがリアルモードで動作することが可能なもの、すなわちすべてのプログラマのためのメモリのフルアクセスが存在するものがあった。非悪意のあるソフトウェアは通常(常に?)他のプロセスのメモリを読み書きしません。

1

GetModuleHandleのHMDOULE値は、ロードされたモジュールのベースアドレスであり、おそらくオフセットを計算するために必要なアドレスです。

ない場合は、そのアドレスは、Visual Studioに付属しているdumpbinユーティリティを使用して表示することができるモジュール(DLL/EXE)のヘッダの開始であるか、AddressOfEntryPointを決定するためにMicrosoft PE and COFF Specificationを使用して、それを自分で解釈することができますベースアドレスからのオフセットとしてBaseOfCodeを含む。モジュールのベースアドレスが必要なものでない場合、これらの2つのうちの1つが別のオプションです。

例:AddressOfEntryPointまたはBaseOfCodeが必要な場合

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

、あなたはオフセットを探し、あるいは単にオフセットを学ぶためにdumpbin /headers solitaire.exeを使用するPEの仕様以下ReadProcessMemoryを呼び出すために​​を使用する必要があります。

+0

こんにちは、私は今EnumProcessModules(http://msdn.microsoft.com/en-us/)を使用していますライブラリ/ms682633.aspx)。しかし、今問題は、私は32ビットのハンドルしか得られないということです... – Seppo

+0

あなたのプロセスは32ビットプロセスですか? 64ビットのハンドルを取得するには、64ビットにする必要があります。 –

+0

こんにちは、私のプロセスは64ビットプロセスです。 – Seppo