2009-12-21 6 views
0

나는이 기능이 지금 당장 운이 좋으면 노력하고있다.ctypes WriteProcessMemory()가 실패하는 이유는 무엇입니까?

def write_memory(self, address, data): 
    PROCESS_ALL_ACCESS = 0x001F0FFF 
    count = c_ulong(0) 
    length = len(data) 
    c_data = c_char_p(data[count.value:]) 
    null = c_int(0) 
    windll.kernel32.SetLastError(10000) 
    if not windll.kernel32.WriteProcessMemory(self.h_process, address, c_data, length, byref(count)): 
     print "Failed to write memory." 
     print "Error Code: ", windll.kernel32.GetLastError() 
    else: 
     return True 

GetLastError()는 (의 0x57) ERROR_INVALID_PARAMETER 어느 반환 87이다. 이 함수의 경우 저스틴 세이츠의 Gray Hat Python에서 바로 복사했습니다. 내가 뭘 잘못하고 있는지, ReadProcessMemory() 잘 작동하고 적절한 값을 반환합니다.

주소의 경우 현재 임의의 위치 (0x00050000)를 선택하고 "\ x61"과 같은 데이터를 전후로 변경없이 전달합니다.

느낌이 있습니다. 간단한 오류입니다. 도움을 위해 미리 감사드립니다. Nav.


당신이 맞았을 때 특권이었습니다. 나는 아직도 내가 원하는 것을 알아낼 수 없다. 내 발사 프로세스 코드는 다음과 같습니다.

class SECURITY_ATTRIBUTES(Structure): 
    _fields_ = [("Length", DWORD), 
       ("SecDescriptor", LPVOID), 
       ("InheritHandle", BOOL)] 

def launch(self, path_to_exe): 
    CREATE_NEW_CONSOLE = 0x0000010 

    startupinfo = STARTUPINFO() 
    process_information = PROCESS_INFORMATION() 
    security_attributes = SECURITY_ATTRIBUTES() 

    startupinfo.dwFlags = 0x1 
    startupinfo.wShowWindow = 0x0 


    startupinfo.cb = sizeof(startupinfo) 
    security_attributes.Length = sizeof(security_attributes) 
    security_attributes.SecDescriptior = None 
    security_attributes.InheritHandle = True 



    if windll.kernel32.CreateProcessA(path_to_exe, 
           None, 
           byref(security_attributes), 
           byref(security_attributes), 
           True, 
           CREATE_NEW_CONSOLE, 
           None, 
           None, 
           byref(startupinfo), 
           byref(process_information)): 

     self.pid = process_information.dwProcessId 
    else: 
     print "Couldnt launch: %d" %path_to_exe 
     print windll.kernel32.GetLastError() 

다른 방법으로 프로세스를 만들어야합니까? SecDescriptor 구조체에 무엇을 넣어야합니까? MSDN은 DACL과 ACE에 대해별로 도움이되지 않습니까? 지금까지 모든 도움에 감사드립니다.

추신 : 디버거 또는 다른 프로그램이 프로세스를 생성하지 않고 메모리를 변경할 수있는 방법은 무엇입니까?

+0

sys.getrefcount()를 사용하여 c_char_p()가 데이터에 대한 내부 참조를 유지한다는 것을 보여주기 때문에 Win32 루틴을 호출하기 전에 임시 문자열에 대한 대답을 삭제했습니다. –

+0

감사합니다. 처음에는 도움이 되었습니까? 다른 아이디어가 있습니까? – Navanax

+0

어떤 버전의 Windows입니까? 이 중 일부는 WinXP SP2로 변경되었습니다. –

답변

0

분명히 잘못된 것은 없습니다. 대부분 0x00050000에 페이지가 없거나 쓰기 가능한 페이지가 없습니다.

쓰기를 시도하는 바이트에 VirtualQuery을 시도하고 실제로 쓰기가 가능한지 확인하지 않는 이유는 무엇입니까? 대부분의 임의의 주소는 그렇지 않습니다.

+0

방금 ​​VirtualQuery 용 함수를 추가했으며 0을 반환했습니다. 이는 실패했음을 의미합니다. GetLastError()는 ERROR_NOACCESS 또는 메모리 위치에 대한 잘못된 액세스 인 998을 반환합니다. – Navanax

+0

장소에 글을 쓸 수 있도록하기 위해해야 ​​할 일이 있습니까? PROCESS_ALL_ACCESS로 프로세스 핸들을 여는 것으로 충분하다고 생각했습니다. 내가 잘못? – Navanax

+0

메모리가없는 곳은 쓸 수 없습니다. 하지만 ERROR_NOACCESS를 얻는다면 이것이 특권 일 수 있음을 의미합니다. PROCESS_ALL_ACCESS로 프로세스를 여는 것은 프로세스 자체가 외부 프로세스가 프로세스에 쓰는 것을 허용하지 않는다면 좋은 일이 아닙니다. 이것이 CHILD 프로세스 (작성한 CHILD 프로세스) 인 경우, 작성한 때 자신에게 쓰기 권한을 부여 할 수 있습니다. –

관련 문제