J'essaie d'accéder à la mémoire physique d'un système Windows 2000 (en essayant de le faire sans outil de vidage de la mémoire). Ma compréhension est que j'ai besoin de le faire en utilisant la fonction CreateFile pour créer un handle. J'ai utilisé une ancienne version de win32dd pour m'aider à traverser cela. D'autres documents sur le Web me permettent d'utiliser "\ Device \ PhysicalMemory" ou "\\. \ PhysicalMemory". Malheureusement, j'ai la même erreur pour chacun.Python CreateFile ne peut pas trouver PhysicalMemory
Traceback (most recent call last):
File "testHandles.py", line 101, in (module)
File "testHandles.py", line 72, in createFileHandle
pywintypes.error: (3, 'CreateFile', 'The system cannot find the path specified.')
En fait, le numéro d'erreur retourné est différent pour chaque série \\. \ PhysicalMemory == 3 et \ Device \ PhysicalMemory == 2. Examen des pywin32, win32file, CreateFile, pyhandle et pywintypes n'a pas produit informations sur les différentes valeurs de retour.
Voici mon code. J'utilise py2exe pour que cela fonctionne sur Windows 2000 (et oui il compile avec succès). Je me rends compte que je pourrais aussi avoir un problème avec DeviceIoControl mais maintenant je me concentre sur CreateFile.
# testHandles.py
import ctypes
import socket
import struct
import sys
import win32file
import pywintypes
def createFileHandle():
outLoc = pywintypes.Unicode("C:\\Documents and Settings\\Administrator\\My Documents\\pymemdump_dotPM.dd")
handleLoc = pywintypes.Unicode("\\\\.\\PhysicalMemory")
#handleLoc = pywintypes.Unicode("\\Device\\PhysicalMemory")
placeHolder = 0
BytesReturned = 0
# Device = CreateFile(L"\\\\.\\win32dd", GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
# CreateFile(fileName, desiredAccess , shareMode , attributes , creationDisposition , flagsAndAttributes , hTemplateFile)
#hMemHandle = win32file.CreateFile(handleLoc, GENERIC_ALL, SHARE_READ, None, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, None)
hMemHandle = win32file.CreateFile(handleLoc, win32file.GENERIC_READ, win32file.FILE_SHARE_READ, None, win32file.OPEN_EXISTING, win32file.FILE_ATTRIBUTE_NORMAL, None)
print "hMemHandle: %s" % hMemHandle
if (hMemHandle == NO_ERROR):
print "Could not build hMemHandle"
sys.exit()
# We send destination path to the driver.
#if (!DeviceIoControl(hMemHandle, 0x19880922, outLoc, (ULONG)(wcslen(outLoc) + 1) * sizeof(TCHAR), NULL, 0, &BytesReturned, NULL))
if (ctypes.windll.Kernel32.DeviceIoControl(hMemHandle, 0x19880922, outLoc, 5, NULL, 0, BytesReturned, NULL)):
print "Error: DeviceIoControl(), Cannot send IOCTL.\n"
else:
print "[win32dd] Physical memory dumped. You can now check %s.\n" % outLoc
# Dump memory
createFileHandle()
Merci, Cutaway
La méthode que j'utilise ici (une fois en fonctionnement) devrait convenir à tout ce qui est pré-XPSP2 car elle permet l'accès à la mémoire physique à partir du mode usager. Vous avez raison, tout le reste XPSP2 et supérieur, nécessitera le mode noyau et n'est probablement pas possible en utilisant Python. Merci, Cutawa – Cutaway
Ah, un peu plus creuser et vous semblez être correct. Bien que je m'attendrais à ce que vous ayez à tout le moins besoin d'être administrateur pour que cela fonctionne. C'est peut-être le problème. – zdan
Je ne crois pas que le privilège "Administrateur" soit nécessaire mais je peux me tromper. Je cours en tant que cet utilisateur sur ma boîte de test. – Cutaway