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):? p >
_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?