Я пытаюсь выполнить DLL-инъекцию, используя Ctypes Python. Я добавляю Olly к процессу, который я пытаюсь ввести, и поток, который я пытаюсь создать, дает ошибку: «ERROR_INVALID_PARAMETER 00000057». Я занимался некоторыми исследованиями, и я обнаружил, что, поскольку ошибка говорит о том, что один из моих параметров плох, когда я вызываю CreateRemoteThread. Я не могу понять, какой параметр является плохим, поскольку все значения, которые я посылаю, кажутся действительными. Я установил условную точку останова Олли при вызове LoadLibrary, и имя DLL и (полный) путь верны. Я также не вижу, как моя пользовательская dll загружается в пространство памяти процесса (в Olly). Мне интересно, связано ли это с тем, что моя dll и path являются unicode, когда я отправляю их в качестве параметра. Хотя условная точка останова на LoadLibrary говорит правильное имя и путь. Я также устанавливаю argtype, и, насколько я понимаю, ошибка будет выбрана, если это был неправильный тип, и попытался бы преобразовать его в правильный тип, когда это возможно.Ошибка_Invalid_Parameter Ошибка 57 при вызове CreateRemoteThread с Python 3.2 CTypes
import sys
from ctypes import *
from ctypes import wintypes
import ctypes
BYTE = c_ubyte
WORD = c_ushort
DWORD = c_ulong
LPBYTE = POINTER(c_ubyte)
LPTSTR = POINTER(c_char)
HANDLE = c_void_p
PVOID = c_void_p
LPVOID = c_void_p
UNIT_PTR = c_ulong
SIZE_T = c_ulong
LPTHREAD_START_ROUTINE = c_void_p
class SECURITY_ATTRIBUTES(ctypes.Structure):
_fields_ = [("nLength", DWORD),
("lpSecurityDescriptor", LPVOID),
("bInheritHandle", wintypes.BOOL)]
LPSECURITY_ATTRIBUTES = POINTER(SECURITY_ATTRIBUTES)
kernel32.CreateRemoteThread.retype = wintypes.HANDLE
kernel32.CreateRemoteThread.argtypes = [wintypes.HANDLE, LPSECURITY_ATTRIBUTES, ctypes.c_size_t, LPTHREAD_START_ROUTINE, wintypes.LPVOID, wintypes.DWORD, wintypes.LPDWORD]
pid = sys.argv[1]
dll_path = sys.argv[2] #'myDLL.dll'
dll_len = len(dll_path) * 2 #Multiplied by 2 so it would take into account the unicode characters
h_process = kernel32.OpenProcess(PROCESS_ALL_ACCESS, False, int(pid))
arg_address = kernel32.VirtualAllocEx(h_process, 0, dll_len, VIRTUAL_MEM, PAGE_READWRITE)
written = c_ubyte(0)
bSuccess = kernel32.WriteProcessMemory(h_process, arg_address, dll_path, dll_len, byref(written))
h_kernel32 = kernel32.GetModuleHandleW('kernel32.dll')
h_loadlib = kernel32.GetProcAddress(h_kernel32, b"LoadLibraryW")
thread_id = c_ulong(0)
h_thread = kernel32.CreateRemoteThread(h_process, #404
None,
0,
h_loadlib, #0x770a0000
arg_address, #0x770eef42
0,
byref(thread_id))
h_threadError = GetLastError() #This says ERROR 0 - Operation completed Successfully
h_dllToHook = kernel32.GetModuleHandleW('myDLL.dll') #h_dllToHook returns '0'
error = GetLastError() #This says ERORR 0 - Operation completed Successfully
Еще одна странная вещь заключается в том, что исполняемый файл я впрыскивается консольное приложение и печатает некоторый материал. DLL, в которую я вставляю, имеет экспортированную функцию, вызываемую из DLLMAIN, которая также печатает материал. Когда я проверяю консоль, она выглядит так, как будто она успешно запускается, когда материал в вложенной DLL также был распечатан. Также, когда я устанавливаю условную точку останова на CreateRemoteThread, она никогда не попадает. Итак, мои вопросы: если он успешно впрыскивается, так как кажется, 1) почему я не могу получить дескриптор вложенной DLL с использованием GetModuleHandleW и 2) почему не Ollydbg показывает, что вложенная DLL не отображается в процесс 'памяти. Я перешагиваю свой код и ломаю, так что это не похоже на то, что поток работает и выходит. Я изучаю какое-то время, поэтому любая помощь очень ценится! Благодарю.