python怎么修改某个内存地址的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python怎么修改某个内存地址的数据相关的知识,希望对你有一定的参考价值。

rt
Python 2.5
详细点,到底从哪下载模块,然后的代码呢,假设我要把0x12345678的值改成123呢

使用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 \'不能创建进程!\'
参考技术A 把变量的内存地址赋值给另一个变量,这一点可以使用python的内建方法id()来进行测试,对于你给的例子:

我们假设'QH'这个字符串在内存中的地址是a,'LJQ'在内存中的地址是b

you='QH' #让you变量指向a地址
me=you #让me变量和you变量一样指向a地址
you='LJQ' #修改you变量,让它指向到b地址
print you #可想而知you指向的是b地址,所以它的值为'LJQ'
print me #me指向的是a地址,所以它的值为'QH'
输出:
LJQ
QH

可以使用ID来加强对python的赋值机制的理解

>>> a = 'asdf'
>>> id(a)
872552384
>>> b = a
>>> id(b)
872552384
>>> a = 'haha'
>>> id(a)
872552672
>>> id(b)
872552384
>>> a
'haha'
>>> b
'asdf'
参考技术B 强烈同意j88r,对
python怎么修改某个内存地址的数据
问题的答案
参考技术C 必须借助外部的C扩展,否则PYTHON无法完成 参考技术D 可以ctypes模块来改。

以上是关于python怎么修改某个内存地址的数据的主要内容,如果未能解决你的问题,请参考以下文章

python全栈_004_Python3基本数据类型

python:深拷贝,浅拷贝,内存管理

vs2010查看内存地址的方法

Python—语法进阶

使用gdb进行写操作

python可变类型和不可变类型