2010-10-29 6 views
2

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.

Répondre

5

Il ne revient pas Unicode, mais quatre octets comme une chaîne (probablement « \ x80 \ x00 \ x00 \ x00 ») passer un pointeur vers un entier non un tampon de chaîne:

read_buff = ctypes.c_uint() 
kernel32.ReadProcessMemory(hproc, lpbaseaddr, ctypes.byref(read_buff), 
          ctypes.sizeof(read_buff), ctypes.byref(bytread)) 
print read_buff.value 
+0

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

+0

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

+0

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é. –