昔からお世話になってるライブラリ
Codeer さんで開発されているFriendly
というライブラリ。
最近またお世話になったので紹介も込めて。
Friendlyって?
本家で紹介されてるので一言でいうと、変態ツール。
今回はこのライブラリを使ってDLLインジェクションを簡単に実現してみた。
環境
- VS2022
- .NET6
構成
プロジェクト | 用途 |
---|---|
Friendly_DLLInjection | DLLを注入したい対象exe |
InjectorApp | DLLを注入するためのテストexe |
InjectTarget | 注入したいdll |
それぞれのプロジェクトに依存関係はない。
説明
InjectTarget
namespace InjectTarget { public class InjectTarget { public static void ShowMyself() { MessageBox.Show($"{Path.GetFileName(Application.ExecutablePath)}"); } } }
誰がロードしてるのかを確認するためのテストコード。
今回やるのはこれだけ。
Friendly_DLLInjection
public partial class Form1 : Form { private void Form1_Load(object sender, EventArgs e) { AppDomain.CurrentDomain.AssemblyLoad += CurrentDomain_AssemblyLoad; } private void CurrentDomain_AssemblyLoad(object? sender, AssemblyLoadEventArgs args) { textBox1.Text += args.LoadedAssembly.FullName + Environment.NewLine; } }
こちらも動作確認用。
DLLがロードされたらそれを表示するだけ。
InjectorApp
Codeer.Friendly.Windows(2.16.0)のnugetパッケージを追加
private void _buttonInject_Click(object sender, EventArgs e) { //インジェクション対象のアプリを起動 var p = Process.Start(@"C:\Users\ABC\source\repos\Friendly_DLLInjection\Friendly_DLLInjection\bin\Debug\net6.0-windows\Friendly_DLLInjection.exe"); //起動したアプリをFriendlyでアタッチ var app = new WindowsAppFriend(p); //インジェクションしたいDLLをロード var asm = Assembly.LoadFrom(@"C:\Users\ABC\source\repos\Friendly_DLLInjection\InjectTarget\bin\Debug\net6.0-windows\InjectTarget.dll"); //インジェクション対象アプリにDLLを注入 WindowsAppExpander.LoadAssembly(app, asm); //対象アプリ内で、ロードさせたDLLのメソッドを呼び出す app.Type("InjectTarget.InjectTarget").ShowMyself(); }
メイン。だけどこれだけ。すごい。
実行してみる
ソース
おしまい
楽ちん