以下のようなコードにて、Directory.Exists("hoge")の処理を実行したときに、
System.IO.Direcoty.Exists()ではなく、Injection.DirecotryExists()が実行されるようにしたいです。
Main()内のInjection.MethodInjection()にブレークポイントを設定し、デバッグモードでステップ実行を行っていくと、
期待通り、Injection.DirectoryExists()が実行されるのですが、
ブレークポイントを設定しないままデバッグ実行、もしくはデバッグ無しで実行した場合は、
System.IO.Direcoty.Exists()が実行されてしまいます。
ソースコードは同一にも関わらず、実行方法(ステップ実行かそうでないか)によって処理結果が異なっている状況です。
どなたか解決方法をご存じであれば教えていただきたく、よろしくお願いいたしますm(_ _)m
なお恥ずかしながら、私自身ポインタに詳しくなく、Injection.MethodInjection()も
何処かの海外サイト(stack overflow等)からコピペした処理なので、何をやっているか詳しく把握できているわけではありません。。
環境は以下の通りです。
Visual Studio 2019 Professional ver 16.9.1
.NET Core 3.0 のコンソールアプリケーションです。
C#
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Console.WriteLine("Hello World!"); 6 7 // Directory.Exists()を書き換え 8 { 9 // Directory.Exists()のMethodInfo 10 MethodInfo original = typeof(Directory).GetMethod("Exists"); 11 12 // 自作メソッドのMethodInfo 13 MethodInfo injection = typeof(Injection).GetMethod("DirectoryExists"); 14 15 // Directory.Exists()の書き換え 16 Injection.MethodInjection(original, injection); 17 } 18 19 // ★ここで、ライブラリ関数でなく自作メソッドを呼び出したい★ 20 Directory.Exists("hoge"); 21 } 22 } 23 24 class Injection 25 { 26 private const int BIT_32 = 4; 27 private const int BIT_64 = 8; 28 29 // 自作メソッド 30 public static void DirectoryExists() 31 { 32 Console.WriteLine("DirectoryExists\n"); 33 } 34 35 public static void MethodInjection(MethodInfo original, MethodInfo injection) 36 { 37 RuntimeHelpers.PrepareMethod(original.MethodHandle); 38 RuntimeHelpers.PrepareMethod(injection.MethodHandle); 39 unsafe 40 { 41 switch (IntPtr.Size) 42 { 43 case BIT_64: 44 long* target = (long*)original.MethodHandle.Value.ToPointer()+1; 45 long* source = (long*)injection.MethodHandle.Value.ToPointer()+1; 46 47 if(*target != *source) 48 { 49 // ★ポインタが指すアドレスの中の値を書き換え? 50 *target = *source; 51 } 52 break; 53 default: 54 break; 55 } 56 } 57 } 58 }
回答2件
あなたの回答
tips
プレビュー