1

如何使用 VB/C# 在远程进程中注入托管 dll,而不使用任何 C/C++ 引导 dll 或任何用程序集编写的代码洞穴。

4

1 回答 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 回答