好的,我对C++ Dll Injection的第3步有疑问,即:
使用CreateRemoteThread()。您可以将其指向
LoadLibrary()
作为入口点,将步骤1和2中的文件路径指定为参数。说实话,这有点笨拙,但是如果你注射了一个DLL,你就已经非常hacky了。另一种技术是使用步骤1和步骤1。 2将一些机器代码加载到远程过程中并将其指向。
所以我的问题是:在使用VirtualAllocEx
分配内存并使用WriteProcessMemory
编写代码后,如何调用CreateRemoteThread
- 我的意思是什么第四和第五个参数?
我的代码:
AllocatedMem = VirtualAllocEx(Proc, IntPtr.Zero, code.Length,
AllocationType.Reserve | AllocationType.Commit, MemoryProtection.ReadWrite);
WriteProcessMemory(Proc, AllocatedMem, code, code.Length, IntPtr.Zero);
CreateRemoteThread(Proc, IntPtr.Zero, 0, AllocatedMem,
IntPtr.Zero, 0, IntPtr.Zero);
答案 0 :(得分:0)
HANDLE WINAPI CreateRemoteThread(
_In_ HANDLE hProcess,
_In_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_ LPDWORD lpThreadId
);
因此,您的第4个参数应该是指向LoadLibrary
的指针,以及要运行的第5个代码。
<强>更新强>
示例:
LoadLibAddy = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
CreateRemoteThread(
Proc,
IntPtr.Zero,
0,
LoadLibAddy,
AllocatedMem,
0,
IntPtr.Zero
);
注意:您需要调整其他函数,并且“代码”应该是您的本机DLL的路径。
答案 1 :(得分:0)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682437(v=vs.85).aspx
HANDLE WINAPI CreateRemoteThread(
_In_ HANDLE hProcess,
_In_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_ LPDWORD lpThreadId
);
hProcess ia处理应该创建线程的进程。
lpThreadAttributes可以为NULL以指定“use default”
dwStackSize可以为零以指定“使用默认值”
lpStartAddress是地址 IN THE FOREIGN PROCESS ,其中线程将开始执行
lpParameter是在外部进程中传递给ThreadMain的参数(即在外部进程中,假定使用WINAPI调用约定调用lpStartAddress,并将lpParameter作为唯一参数)。
dwCreationFlags可以为零。
lpThreadId应该是指向DWORD的指针,如果成功则接收线程id。
如果将lpStartAddress设置为LoadLibraryW的地址并将lpParameter设置为指针 IN FOR FOREIGN PROCESS 到L“foo.dll”,那么当线程在外部进程中启动时它会立即调用外部进程中的LoadLibraryW(L“foo.dll”),允许您从DllMain内部运行代码。