La fonction ReadProcessMemory de kernel32.dll semble renvoyer Unicode.Python ctypes.create_string_buffer Problème
kernel32 = ctypes.windll.kernel32
PROCESS_QUERY_INFORMATION = 0x0400
PROCESS_VM_READ = 0x0010
pid = int(raw_input("Enter PID: "))
hproc = kernel32.OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_VM_READ, False, pid)
lpbaseaddr = 16799644
read_buff = ctypes.create_string_buffer(4)
bytread = ctypes.c_ulong(0)
kernel32.ReadProcessMemory(hproc, lpbaseaddr, read_buff,
4, ctypes.byref(bytread))
print read_buff.raw #i also tried read_buff.value
Je sais la valeur à cette adresse est 80 parce que je triche moteur pour le rendre 80. La ligne print read_buff
retourne P
. Si je fais la valeur de cette adresse 81 avec le moteur de triche et exécute mon programme il renvoie la valeur Q
. J'ai été déconner et unichr(80)
renvoie P
et unichr(81)
renvoie Q
. Il y a évidemment un problème avec create_string_buff
. Devrais-je utiliser un tampon d'octets ou un tampon d'entiers et comment ferais-je cela? L'utilisation de unichr()
fonctionne pour quelques valeurs mais indique que la valeur d'adresse est 800
, unichr(800)
ne fonctionnera évidemment pas. Je cherche read_buff
retourner 50
ou 60
ou 800
, etc.
merci beaucoup marque cela a fonctionné parfaitement, c'est exactement la réponse que je cherchais un :) tho dernière question, la read_buff = ctypes.c_uint() sera que tenir une variable de taille ? contrairement à la chaîne de caractères tampon où je devais spécifier 4 octets de long etc .. merci encore pour la réponse rapide – james
ok une dernière question .. dire que je voulais retourner cette chaîne d'octets. par exemple "\ x80 \ x00 \ x00 \ x00". quel pointeur utiliserais-je alors? – james
Non, 'c_uint' a une taille de 4 octets,' ctypes.sizeof' renvoie la taille. 'print repr (read_buff.raw)' affichera la chaîne au format échappé. –