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