我一直试图让这个功能工作一段时间而没有运气。
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。 对于这个函数,我直接从Justin Seitz的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结构中添加什么?关于DACL和ACE的MSDN不是很有用吗? 感谢目前为止的所有帮助。
PS - 只是一个想法,调试器或其他程序如何不产生进程并且能够改变内存?
答案 0 :(得分:0)
电话没有明显的错误。很可能在0x00050000处没有任何页面或者页面不可写。
为什么不尝试对要写入的字节执行VirtualQuery
并查看它是否实际可写?大多数随机地址都不是。