如何使用 VB/C# 在远程进程中注入托管 dll,而不使用任何 C/C++ 引导 dll 或任何用程序集编写的代码洞穴。
问问题
2515 次
1 回答
1
将函数导出为本机代码需要DLL导出
经典机制:
以下是经典dll注入的过程:
- 创建 C/C++ Dll
- 将 Dll 路径写入远程进程
- 创建远程线程到 LoadLibraryA 以及作为 Dll 路径的参数
- 此阶段将调用 Dll 入口点
参考:代码项目文章
编解码方法:
使用此方法,您可以跳过 C/C++ Dll,但需要具备基本的汇编知识
- 在运行时以字节数组的形式创建代码洞穴并写入其他进程,或编写汇编程序(类似 c 的函数)并将其编译为二进制代码,这将加载 .net 汇编
- 将您的代码写入其他进程
- 创建远程线程并且可以加载您的 .net 程序集
参考:示例代码 [原始链接似乎已过期,因此谷歌缓存版本]
现代方式:
此方法非常易于使用,不需要 C/C++ 或汇编知识,以下是过程
- 在当前进程中加载您的库并获取您要调用的程序地址,它将与带有一个参数的程序一起使用
- 使用 LoadLibrary 和参数作为托管 dll 路径在目标进程中调用创建远程线程。这不会执行您的代码,而只会在目标进程中加载您的库
- 等待线程退出然后得到返回码,这是你的库模块句柄
- 现在在远程进程中的过程地址处创建远程线程,完成后,您的过程将被调用。
例子:
这是你的dll代码
Public Module Library
<DllExport>
Public Function Entry(Argument As String)
MessageBox.Show("Injected With Argument: " + Argument)
Return 0 'Success
End Function
End Module
这是示例注入代码,它只是原型,TODO:实现本机函数并将它们用于下面使用的扩展方法
Public Module Program
Public Sub Inject(Proc As Process, dll As String)
Dim K32 = GetModuleHandle("kernel32")
Dim LLA_Proc = GetProcAddress(K32, "LoadLibraryA")
'TODO: extension method of process WriteMemory(Byte())
Dim lns = Proc.WriteMemory(Encoding.ASCII.GetBytes("C:\FAKE-PATH\Inject.dll"))
'TODO: extension method of process RemoteCallWait(IntPtr, Arg)
Dim z = Proc.RemoteCallWait(LLA_Proc, lns) 'Calls method and waits for exit and returns exit code
'Z should not be zero, otherwise injection is incomplete
Dim XPTR = GetPtr("C:\FAKE-PATH\Inject.dll", "Entry")
''TODO: extension method of process WriteMemory(Byte())
Dim Loc = Proc.WriteMemory(Encoding.Default.GetBytes("hello world"))
'TODO: extension method of process RemoteCallWait(IntPtr, Arg)
z = Proc.RemoteCallWait(XPTR, Loc)
'Z should be 0 now
End Sub
Private Function GetPtr(LibraryName As String, FuncName As String) As IntPtr
Return CULng(GetProcAddress(LoadLibrary(LibraryName), FuncName))
End Function
End Module
于 2015-10-23T15:30:50.273 回答