Я пытался заставить эту функцию работать в течение некоторого времени безуспешно.
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 - Просто идея, как отладчик или какая-либо другая программа не порождают процесс и способны изменять память?