0

これがばかげた質問である場合はお詫びします。私は Visual Studio にあまり詳しくありません。また、新しいバージョンについてもまったく詳しくありません。

Visual Studio 2019 で、おおよそこのチュートリアルに従って、EasyHook を使用して Windows アプリケーションから TextOutA への呼び出しをフックしようとしています。 C++ を使用しています。残念ながら、C# は EasyHook の C++ よりもはるかにサポート/文書化されています。)

チュートリアルに従って、コンソール アプリケーションとクラス ライブラリを同じソリューション内の 2 つのプロジェクトとして使用しています。Visual Studio ソリューションをコンパイルするのはやや困難でした。.csproj ファイルを .NET Framework 4.8 に手動で編集する必要があり (この質問に従って)、それを機能させるには多少の調整が必要でした。でも今は、いじりすぎたのではないかと心配しています。

何が起こるか: コードはエラーや警告なしでコンパイルされ、一見正常に実行されます。ただし、DLL では何も呼び出されないようです。そのコードは実行されていないように見え、Run() のブレークポイントにヒットすることはなく、Run() コードを完全に削除してもコンパイルされます。

これは、これまでのところ、コンソール アプリのコードです (ファイル名は編集されています。このコードには他の問題がある可能性がありますが、実行して確認する必要があります)。

    static void Main(string[] args)
        {
            string injectionLibrary = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "[name of DLL].dll");

            Console.WriteLine(injectionLibrary);

            try
            {
                Int32 processID = 0;
                Process[] process = Process.GetProcessesByName("[process name]");
                Console.Write(process[0]);
                processID = process[0].Id;

                EasyHook.RemoteHooking.Inject(
                        processID,          // ID of process to inject into
                        injectionLibrary,   // 32-bit library to inject (if target is 32-bit)
                        injectionLibrary,   // 64-bit library to inject (if target is 64-bit)
                        null         // the parameters to pass into injected library
                                            // ...
                    );
                Console.WriteLine("Injected, supposedly.");
            }
            catch (Exception e)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("There was an error while injecting into target: ");
                Console.ResetColor();
                Console.WriteLine(e.ToString());
            }

            Console.ReadKey();
        }
    }
}

そして、これがクラス ライブラリです。

namespace [DLL name]
{
    public class MySimpleEntryPoint : EasyHook.IEntryPoint
    {
        public MySimpleEntryPoint(EasyHook.RemoteHooking.IContext context)
        {
        }
        public void Run(EasyHook.RemoteHooking.IContext context)
        {
            Console.Write("Test");
            var textOutHook = EasyHook.LocalHook.Create(
                EasyHook.LocalHook.GetProcAddress("Gdi32.dll", "TextOutA"),
                new TextOutDelegate(TextOut_Hook),
                this);

            textOutHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });

        }

        [UnmanagedFunctionPointer(CallingConvention.StdCall,
                CharSet = CharSet.Unicode,
                SetLastError = true)]
        delegate bool TextOutDelegate(IntPtr orig_handle, int x_value, int y_value, string output_string, int color);

        [DllImport("gdi32.dll", CharSet = CharSet.Unicode, EntryPoint = "TextOutA", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
        static extern bool TextOutA(IntPtr orig_handle, int x_value, int y_value, string lpString, int color);
        bool TextOut_Hook(IntPtr orig_handle, int x_value, int y_value, string output_string, int color)
        {
            // We aren't going to call the original at all... YET
            Console.Write("...intercepted...");
            return false;
        }
    }
}

プロセスのコンソール出力は期待どおりであり、パスの出力も同様です: C:\Users[自分のユーザー名]\source\repos[プロジェクト名]\build\net48\ [DLL 名].dll --これは実際にdllが出力される場所です。しかし、上記のように、Run() では実際には何も呼び出されていないようで、TextOutA は確かに抑制されていません。

私が試したこと:

  • .dll とクラス ライブラリ プロジェクトの両方を (個別に) コンソール アプリへの参照として追加する
  • .dll と実行可能ファイルの両方を同じフォルダーに出力するように設定する
  • パスを取得すると思われるコード行を微調整する
  • このコードを基本的に、私が見つけることができる同等の EasyHook プロジェクトと比較すると、明らかに問題があるようには見えません
  • フックではなく、コンソール アプリ内から GetProcAddress を呼び出します。期待どおりに動作するので、問題はないようです

どんな助けでも大歓迎です。

4

1 に答える 1