2009-09-23 5 views
0

Windows 2000 시스템의 실제 메모리에 액세스하려고합니다 (메모리 덤프 도구없이이를 수행하려고 시도하고 있습니다). 내 이해가 CreateFile 함수를 사용하여 핸들을 만들려면이 작업을 수행해야합니다. 나는 이것을 통해 나를 도와주기 위해 win32dd의 이전 버전을 사용했다. 웹의 다른 문서에서 "\ Device \ PhysicalMemory"또는 "\\. \ PhysicalMemory"중 하나를 사용합니다. 불행히도, 각각에 대해 동일한 오류가 발생합니다.Python CreateFile이 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.') 

사실, 반환 된 오류 번호는 각 실행 \\ 다릅니다. \ PhysicalMemory의 == 3 \ 장치 \의 PhysicalMemory의 == pywin32, win32file, CreateFile에, pyhandle 및 pywintypes 2. 검토가 발생하지 않았다 다른 리턴 값에 대한 정보.

여기 내 코드입니다. Windows 2000에서이 작업을 수행하기 위해 py2exe를 사용하고 있습니다 (예, 성공적으로 컴파일합니다). DeviceIoControl에 문제가있을 수도 있지만 지금은 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() 

은 내가 Windows에서 사용자 모드 땅에서 물리적 메모리 개체로 접근이 가능하다고 생각하지 않는다, 장면 전환

답변

0

을 주셔서 감사합니다. win32dd link에서 알 수 있듯이 커널 모드에서 수행해야합니다.

+0

여기에서 사용하는 방법 (이전에 작업 한 상태)은 usermode에서 실제 메모리 액세스를 허용하므로 모든 XPSP2 이전에 정상적으로 작동해야합니다. 당신은 정확하고, 다른 모든 것은 XPSP2 이상이며, 커널 모드가 필요하며 파이썬을 사용하는 것이 가능하지 않을 가능성이 큽니다. 고마워요, Cutawa – Cutaway

+0

아, 조금 더 파고 옳습니다. 이 작업을 수행하려면 최소한 관리자 권한으로 실행해야합니다. 아마도 그것이 문제입니다. – zdan

+0

"관리자"권한이 필요하다고 생각하지 않지만 잘못되었을 수 있습니다. 내 테스트 상자에서이 사용자로 실행 중입니다. – Cutaway