Почему ctypes WriteProcessMemory () не работает? - PullRequest
0 голосов
/ 21 декабря 2009

Я пытался заставить эту функцию работать в течение некоторого времени безуспешно.

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 () возвращает 87 (0x57), что равно ERROR_INVALID_PARAMETER. Для этой функции я скопировал ее прямо из Grey 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? Спасибо за всю помощь.

PS - Просто идея, как отладчик или какая-либо другая программа не порождают процесс и способны изменять память?

1 Ответ

0 голосов
/ 21 декабря 2009

Нет ничего, очевидно, не так с вызовом. Скорее всего, на 0x00050000 просто нет страниц, или страницы там не доступны для записи.

Почему бы вам не попробовать сделать VirtualQuery для байтов, в которые вы пытаетесь записать, и посмотреть, действительно ли оно доступно для записи? Большинство случайных адресов не являются.

...