3

私は試験でカンニングをすることについて素晴らしい考えを持っています。私の学校では非常に古いIDE(Turbo Pascal、Turbo C ++、およびその他の80年代のものを考えてください)を使用しています。私がやりたいことはこれです:

  • プログラムをバックグラウンドで開始する

  • キーの押下をインターセプトし、画面に直接送信するのではなく、事前に構成されたテキストファイルから文字を読み取り、それを押されたキーとして送信したいと思います。このように、何を書いても、そのファイルのテキストが画面に書き込まれます。

キーのロギングに関するStephenToubの記事を見つけました。これは、この「」を構築するための良いスタートになると思いますtool。システムで押されたすべてのキーを傍受するよりも良い代替手段はありますSetWindowsHookExか?コードは、ウイルス対策ソフトウェアによって疑わしいプログラムとしてフラグが付けられますか?もしそうなら、アンチウイルスによってフラグが立てられることなくこれを達成するために使用できるものは他にありますか?管理者権限は必要ですか?

学ぶことを避けるのと同じくらい学ぶことに興味を持っていれば、私は素晴らしいことをするだろうと言う人もいるでしょうが、これを試してみたいと思います。

編集:私は賞金を追加しました、私はキーストロークをキャプチャするためのいくつかのテクニックに興味があります(私は低レベルのフックや高度なものには興味がありません-基本的なものは問題ありません)、主にメソッド名とドキュメントへのリンクです。また、アンチウイルスに対してマルウェアとして表示されるかどうかも知りたいです。

4

4 に答える 4

2

不正行為が良いと言っているわけではありませんが、私たちはあなたの嘆願を理解しています。.NetはWIN32APIをラップしているので、APIフックを使わずにそれが可能だとは思いません。あなたが望むもののためにメソッドをラップしているとは思いません。

完全を期すために、いくつかの詳細を追加しましょう。

残念ながら、WIN32 APIにアクセスする必要があります:http://msdn.microsoft.com/en-us/library/ms645530(VS.85).aspx

WM_SYSKEYDOWN通知を使用してキーストロークを取得できますが、監視するウィンドウのハンドルが必要になるため、監視するウィンドウのハンドルを取得するには* GetWindow**APIが必要になります。

SendInputまたはkeybd_event [ http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx]関数を試して、キーストロークをシミュレートします。

Googleの「WINAPIViewer」は、前述のAPIを簡単に検索して表示するためのユーティリティであり、.Netコードのバージョンもあります。

これは試行錯誤の多いものの1つであり、もっと明確な答えがあればいいのにと思います。

于 2009-10-22T09:26:31.423 に答える
2

SetWindowsHookExが最適なオプションです。一部のウイルス対策プログラムでフラグが立てられると言われましたが、一度使用して小さなアプリを作成し、ウイルスアラートを返さないAVGでスキャンしました。

于 2009-10-10T16:00:39.780 に答える
2

神様!先日、これに最適なクラスを見つけました。元のソースを見つけるのに少し時間がかかりました。

http://www.codeproject.com/KB/cs/globalhook.aspx

私はこれ(およびSendKeys)を必要なものだけに使用しました。元のキーメッセージをブロックするには、Handle=trueを使用する必要があります。

SendKeysは少し醜いです...必要に応じて代替品を探すことができます。しかし、SendKeysはあなたのために働きます。

SendKeysを使用すると、次のようになります。

    private void HookManager_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.D){
            e.Handled = true;
            SendKeys.Send("F");
        }
    }

私は実際にこのメソッドを使用して、どのプロセスのウィンドウにフォーカスがあるかを判断しているため、別のアプリケーションを使用している場合、アプリは何もしません。

    /// <summary>
    /// The GetForegroundWindow function returns a handle to the foreground window.
    /// </summary>
    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow();

    static bool IsProcessFocused(string processname)
    {
        if (processname == null || processname.Length == 0)
        {
            throw new ArgumentNullException("processname");
        }

        Process[] runninProcesses = Process.GetProcessesByName(processname);
        IntPtr activeWindowHandle = GetForegroundWindow();

        foreach (Process process in runninProcesses)
        {
            if (process.MainWindowHandle.Equals(activeWindowHandle))
            {
                return true;
            }
        }

        // Process was not found or didn't had the focus.
        return false;
    }
于 2009-10-22T23:55:16.397 に答える
1

私が言える限り、キーログを作成する最も信頼できる方法は、システム全体の割り込みを設定することです(INT17hだと思いますか?)が、投稿にC#のタグが付けられていることを考えると、これはかなり低レベルです。関連するツールを検索してください...たくさんあります...

于 2009-10-10T16:04:19.787 に答える