Salut tout le monde
Le titre n'est peut-être pas assez évocateur, il fallait faire court...
Je suis en train de programmer un truc qui traite des valeurs récupérées dans une autre application en train de tourner, du memory dump.
Je suis parvenu à trouver sur le net une fonction qui récupère avec succès les valeurs qui m'intéressent:
La fonction renvoie un objet ctypes.c_char_array4 (car dans size je mets 4), que je décode en binaire avec read_process_mem(pid, address, size).value, puis convertis en float avec struct.pack('f', valeur_binaire)[0].
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 import ctypes import ctypes.wintypes kernel32 = ctypes.wintypes.windll.kernel32 # Various access flag definitions: class Access: DELETE = 0x00010000 READ_CONTROL= 0x00020000 SYNCHRONIZE = 0x00100000 WRITE_DAC = 0x00040000 WRITE_OWNER = 0x00080000 PROCESS_VM_WRITE = 0x0020 PROCESS_VM_READ = 0x0010 PROCESS_VM_OPERATION = 0x0008 PROCESS_TERMINATE = 0x0001 PROCESS_SUSPEND_RESUME = 0x0800 PROCESS_SET_QUOTA = 0x0100 PROCESS_SET_INFORMATION = 0x0200 PROCESS_QUERY_LIMITED_INFORMATION = 0x1000 PROCESS_QUERY_INFORMATION = 0x0400 PROCESS_DUP_HANDLE = 0x0040 PROCESS_CREATE_THREAD = 0x0002 PROCESS_CREATE_PROCESS = 0x0080 def read_process_mem(pid, address, size): "Read memory of the specified process ID." buf = ctypes.create_string_buffer(size) gotBytes = ctypes.c_ulong(0) h = kernel32.OpenProcess(Access.PROCESS_VM_READ, False, pid) try: if kernel32.ReadProcessMemory(h, address, buf, size, ctypes.byref(gotBytes)): return buf else: raise Exception("Failed to access process memory.") finally: kernel32.CloseHandle(h)
Cela fonctionne en général mais pour des valeurs attendues telles que 0, 1 ainsi que quelques autres valeurs entre les deux à intervalles réguliers, la valeur binaire retournée est b'' uniquement, faisant planter le reste de mon programme.
Je voudrais savoir s'il existe une alternative relativement simple pour convertir ce genre d'objet en float, sachant que je ne comprends quasiment rien au module ctypes, le niveau étant très élevé pour moi, un simple programmeur du dimanche.
merci d'avance
Partager