Python の Ctypes を使用して DLL インジェクションを実行しようとしています。挿入しようとしているプロセスに Olly をアタッチすると、作成しようとしているスレッドで "ERROR_INVALID_PARAMETER 00000057" というエラーが発生します。私はいくつかの調査を行ってきましたが、CreateRemoteThread を呼び出すと、パラメーターの 1 つが正しくないというエラーが表示されることがわかりました。送信したすべての値が有効に見えるため、どのパラメーターが悪いのかわかりません。LoadLibrary の呼び出しに Olly 条件付きブレーク ポイントを設定しましたが、dll 名と (完全な) パスは正しいです。また、(Olly の) プロセスのメモリ空間にロードされたカスタム dll も表示されません。パラメータとして送信したときに、dllとパスがユニコードであるという事実と関係があるのでしょうか。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
もう 1 つの奇妙な点は、挿入した実行可能ファイルがコンソール アプリケーションであり、いくつかの内容を出力するという事実です。私が注入しているdllには、DLLMAINから呼び出されるエクスポートされた関数も含まれています。コンソールを確認すると、インジェクトされた DLL 内のものも出力されたので、正常に実行されたようです。また、CreateRemoteThread に条件付きログ ブレークポイントを設定すると、ヒットすることはありません。したがって、私の質問は、1) GetModuleHandleW を使用して挿入された DLL へのハンドルを取得できない理由と、2) 挿入された DLL がプロセスにマップされていないことを Ollydbg が示していない理由です。 'メモリ空間。コードをステップ実行して中断しているため、スレッドが実行されて終了しているようではありません。私' しばらく研究していたので、どんな助けでも大歓迎です!ありがとう。