Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo modificar los datos de una determinada dirección de memoria en Python

Cómo modificar los datos de una determinada dirección de memoria en Python

Utilice el módulo ctypes para llamar a la función WriteProcessMemory para modificar la dirección de memoria especificada del programa después de crear el proceso del programa.

BOOL WriteProcessMemory(

HANDLE hProcess,

LPVOID lpBaseAddress,

LPCVOID lpBuffer,

SIZE_T nSize,

SIZE_T* ? lpNumberOfBytesWritten

);

El significado de sus parámetros es el siguiente.

- hProcess: Handle del proceso a escribir en memoria.

- lpBaseAddress: La dirección inicial que se escribirá en la memoria.

- lpBuffer: La dirección del valor a escribir.

- nSize: El tamaño del valor a escribir.

- lpNumberOfBytesWritten?: El tamaño real escrito.

El código de muestra de Python es el siguiente: from?ctypes?import?*

#?Definition_PROCESS_INFORMATION estructura

clase?_PROCESS_INFORMATION(Estructura):?

_fields_? =?[('hProcess',?c_void_p), ('hThread',?c_void_p), ('dwProcessId',?c_ulong), ('dwThreadId',?c_ulong)]

#?Definition_STARTUPINFO estructura

clase?_STARTUPINFO(Estructura):

_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?#?Definir NORMAL_PRIORITY_CLASS

kernel32?=?windll.LoadLibrary("kernel32.dll")#?Cargar kernel32.dll

CreateProcess?=? .CreateProcessA?#?Obtener la dirección de la función CreateProcess

ReadProcessMemory?=?kernel32.ReadProcessMemory?#?Obtener la dirección de la función ReadProcessMemory

WriteProcessMemory?=?kernel32.WriteProcessMemory #?Obtener la dirección de la función WriteProcessMemory

TerminateProcess?=?kernel32.TerminateProcess

#?Estructura de declaración

ProcessInfo?=?_PROCESS_INFORMATION()

StartupInfo? =?_STARTUPINFO()

archivo?=?ModifyMe.exe'#?El archivo a modificar

dirección?=?0x0040103c#?La dirección de memoria a ser modificado

buffer?=?c_char_p("_")?#?Dirección de buffer

bytesRead?=?c_ulong(0)?#?Número de bytes leídos

bufferSize ?=?len(buffer.value)?#?Buffer Size

#?Crear proceso

if?CreateProcess(

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

#?Lea el contenido que se dirección de memoria modificada para determinar si es el archivo a modificar

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

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

buffer.value?=?\x75'?#?Modifica el valor en el buffer y escríbelo en la memoria

#?Modificar memoria

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

¿Imprimir?' '?

else:

imprimir?'¡Error al escribir en la memoria! '

otro:

¿imprimir?

otro:

¿imprimir? '¡Se abrió un archivo incorrecto! '

imprimir? TerminateProcess(ProcessInfo.hProcess,0)#? Si no es el archivo a modificar, finalizar el proceso

de lo contrario:

imprimir? ?' leer ¡Error de recuperación de memoria! '

else:

¿imprimir?

else:

¿imprimir? '¡No se puede crear el proceso! '

si no:

¿imprimir?