Dll注入 - 在另一个进程中编写本机代码

时间:2012-08-16 18:16:28

标签: c++ .net interop dll-injection

好的,我对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);

2 个答案:

答案 0 :(得分:0)

来自MSDN Documentation

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内部运行代码。