我正在尝试使用 Python 的 Ctypes 执行 DLL 注入。我将 Olly 附加到我尝试注入的进程,并且我尝试创建的线程给出了错误“ERROR_INVALID_PARAMETER 00000057”。我一直在做一些研究,我发现当我调用 CreateRemoteThread 时,错误表明我的参数之一是错误的。我似乎无法弄清楚哪个参数不好,因为我发送的所有值似乎都是有效的。我在调用 LoadLibrary 时设置了一个 Olly 条件断点,并且 dll 名称和(完整)路径是正确的。我也没有看到我的自定义 dll 加载到进程的内存空间中(在 Olly 中)。我想知道这是否与当我将它们作为参数发送时我的 dll 和路径是 unicode 的事实有关。尽管 LoadLibrary 上的条件断点说明了正确的名称和路径。我还设置了 argtype,据我了解,如果它是错误的类型,则会引发错误,并且它会在可能的情况下尝试将其转换为正确的类型。
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)为什么我不能使用 GetModuleHandleW 获得注入的 DLL 的句柄和 2)为什么 Ollydbg 没有显示注入的 DLL 没有映射到进程中'内存空间。我正在单步执行我的代码并中断,所以它不像线程正在运行和退出。我' 已经研究了一段时间,非常感谢任何帮助!谢谢。