當前位置:編程學習大全網 - 源碼下載 - python怎麽修改某個內存地址的數據

python怎麽修改某個內存地址的數據

使用ctypes模塊調用WriteProcessMemory函數,在創建程序進程後,就可以修改該程序指定內存地址。WriteProcessMemory的函數原型如下所示。

BOOL WriteProcessMemory(

HANDLE hProcess,

LPVOID lpBaseAddress,

LPCVOID lpBuffer,

SIZE_T nSize,

SIZE_T* ? lpNumberOfBytesWritten

);

其參數含義如下。

· hProcess:要寫內存的進程句柄。

· lpBaseAddress:要寫的內存起始地址。

· lpBuffer:寫入值的地址。

· nSize:寫入值的大小。

· lpNumberOfBytesWritten? :實際寫入的大小。

python代碼示例如下:

from?ctypes?import?*

#?定義_PROCESS_INFORMATION結構體

class?_PROCESS_INFORMATION(Structure):?

_fields_?=?[('hProcess',?c_void_p),

('hThread',?c_void_p),

('dwProcessId',?c_ulong),

('dwThreadId',?c_ulong)]

#?定義_STARTUPINFO結構體

class?_STARTUPINFO(Structure):

_fields_?=?[('cb',c_ulong),

('lpReserved',?c_char_p),

('lpDesktop',?c_char_p),

('lpTitle',?c_char_p),

('dwX',?c_ulong),

('dwY',?c_ulong),

('dwXSize',?c_ulong),

('dwYSize',?c_ulong),

('dwXCountChars',?c_ulong),

('dwYCountChars',?c_ulong),

('dwFillAttribute',?c_ulong),

('dwFlags',?c_ulong),

('wShowWindow',?c_ushort),

('cbReserved2',?c_ushort),

('lpReserved2',?c_char_p),

('hStdInput',?c_ulong),

('hStdOutput',?c_ulong),

('hStdError',?c_ulong)]

NORMAL_PRIORITY_CLASS?=?0x00000020?#?定義NORMAL_PRIORITY_CLASS

kernel32?=?windll.LoadLibrary("kernel32.dll")#?加載kernel32.dll

CreateProcess?=?kernel32.CreateProcessA?#?獲得CreateProcess函數地址

ReadProcessMemory?=?kernel32.ReadProcessMemory?#?獲得ReadProcessMemory函數地址

WriteProcessMemory?=?kernel32.WriteProcessMemory#?獲得WriteProcessMemory函數地址

TerminateProcess?=?kernel32.TerminateProcess

#?聲明結構體

ProcessInfo?=?_PROCESS_INFORMATION()

StartupInfo?=?_STARTUPINFO()

file?=?'ModifyMe.exe'#?要進行修改的文件

address?=?0x0040103c#?要修改的內存地址

buffer?=?c_char_p("_")?#?緩沖區地址

bytesRead?=?c_ulong(0)?#?讀入的字節數

bufferSize?=?len(buffer.value)?#?緩沖區大小

#?創建進程

if?CreateProcess(file,?0,?0,?0,?0,?NORMAL_PRIORITY_CLASS,?0,?0,?byref(StartupInfo),?byref(ProcessInfo)):

#?讀取要修改的內存地址,以判斷是否是要修改的文件

if?ReadProcessMemory(ProcessInfo.hProcess,?address,?buffer,?bufferSize,?byref(bytesRead)):

if?buffer.value?==?'\x74':

buffer.value?=?'\x75'?#?修改緩沖區內的值,將其寫入內存

#?修改內存

if?WriteProcessMemory(ProcessInfo.hProcess,?address,?buffer,?bufferSize,?byref(bytesRead)):

print?'成功改寫內存!'

else:

print?'寫內存錯誤!'

else:

print?'打開了錯誤的文件!'

TerminateProcess(ProcessInfo.hProcess,0)#?如果不是要修改的文件,則終止進程

else:

print?'讀內存錯誤!'

else:

print?'不能創建進程!'

  • 上一篇:代理服務器如何處理HTTPS流量
  • 下一篇:COSO委員會於2004年頒布了《企業風險管理框架》(ERM),其基本內容有哪些?
  • copyright 2024編程學習大全網