1

C/C++ ブートストラップ dll またはアセンブリで記述されたコード ケーブを使用せずに、VB/C# を使用してマネージド DLL をリモート プロセスに挿入する方法。

4

1 に答える 1

1

関数をネイティブ コードとしてエクスポートするには、DLL エクスポートが必要です。

古典的なメカニズム:

以下は、従来の dll インジェクションの手順です。

  • C/C++ DLL の作成
  • リモート プロセスへの Dll パスの書き込み
  • Dll パスとしての引数とともに LoadLibraryA へのリモート スレッドを作成します。
  • Dll エントリ ポイントはこの段階で呼び出されます

参考:コードプロジェクト記事

コードケイブの方法:

この方法では、C/C++ Dll をスキップできますが、アセンブリの基本的な知識が必要です

  • 実行時にバイト配列として code-cave を作成し、他のプロセスに書き込むか、アセンブリ プロシージャ (c のような関数) を記述し、.net アセンブリをロードするバイナリ コードとしてコンパイルします。
  • コードを他のプロセスに書き込む
  • リモート スレッドを作成すると、.net アセンブリを読み込むことができます

参考:コード例 [元のリンクが期限切れらしいのでGoogleキャッシュ版]

現代的な方法:

この方法はとても使いやすく、C/C++ やアセンブリの知識は必要ありません。手順は次のとおりです。

  • ライブラリを現在のプロセスにロードし、呼び出したいプロシージャ アドレスを取得します。引数が 1 つのプロシージャで動作します。
  • 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 に答える