2013-08-13 8 views
5

ゲーム用のウォールハックを検出するためのコードを記述しようとしています。 基本的に、いくつかのハッキングが存在し、ウィンドウの空白透明ウィンドウを作成し、この外部ウィンドウにハックを描画するので、ゲーム自体のスクリーンショットを撮ることで検出することはできません。スクリーンショット分析によるゲームのハックを検出するC#

私のアプローチは次のとおりです。 - 1.ゲームウィンドウのスクリーンショットを撮ります。 2.同じ座標のWindowsデスクトップのスクリーンショットを撮ります。 3.画像解析を実行して、スクリーンショット1とスクリーンショット2を比較し、違いがあるかどうかを確認します。

私の問題は、スクリーンショット1とスクリーンショット2が同時に実行されないため、2つのスクリーンショットの間に新しいゲームフレームを描くことができ、画像を比較したときに偽陽性を引き起こすことです。

スクリーンショットが正確に同時に発生するように調整する方法があるかどうかを知りたいですか?または何とか私のスクリーンショットが終了するまで何らかの新しいフレームを描画する画面を停止しますか?

これはスクリーンショットの撮影に使用するコードです。 2つの作業項目をキューに入れて、2つのスクリーンショットを並行して取得しようとしました。 しかし、これでも、まったく同じタイミングでスクリーンショットが発生するわけではありません。 スクリーンショットが完成するまで、グラフィックスカードからのスクリーンへの更なる更新を止める方法があるのだろうか?私はこれを行うことができますか?それとして、レンダリングの停止についてあなたはそれがすべてのコンピュータで動作しないことを意味し、いくつかのグラフィックaccelaratorsするためのリソースがない限り、同時に両方のスクリーンショットを持ってできるようにするつもりはない

public void DoBitBlt(IntPtr dest, int width, int height, IntPtr src) 
    { 
     GDI32.BitBlt(dest, 0, 0, width, height, src, 0, 0, GDI32.SRCCOPY); 
    } 

    public struct Windows 
    { 
     public Bitmap window; 
     public Bitmap desktop; 
    } 
    public Windows CaptureWindows(IntPtr window, IntPtr desktop, User32.RECT coords) 
    { 
     Windows rslt = new Windows(); 
     // get te hDC of the target window 
     IntPtr hdcSrcWindow = User32.GetWindowDC(window); 
     IntPtr hdcSrcDesktop = User32.GetWindowDC(desktop); 

     // get the size 
     int width = coords.right - coords.left; 
     int height = coords.bottom - coords.top; 

     // create a device context we can copy to 
     IntPtr hdcDestWindow = GDI32.CreateCompatibleDC(hdcSrcWindow); 
     IntPtr hdcDestDesktop = GDI32.CreateCompatibleDC(hdcSrcDesktop); 
     // create a bitmap we can copy it to, 
     // using GetDeviceCaps to get the width/height 
     IntPtr hBitmapWindow = GDI32.CreateCompatibleBitmap(hdcSrcWindow, width, height); 
     IntPtr hBitmapDesktop = GDI32.CreateCompatibleBitmap(hdcSrcDesktop, width, height); 
     // select the bitmap object 
     IntPtr hOldWindow = GDI32.SelectObject(hdcDestWindow, hBitmapWindow); 
     IntPtr hOldDesktop = GDI32.SelectObject(hdcDestDesktop, hBitmapDesktop); 
     // bitblt over 
     var handle1 = new ManualResetEvent(false); 
     var handle2 = new ManualResetEvent(false); 
     Action actionWindow =() => { try { DoBitBlt(hdcDestWindow, width, height, hdcSrcWindow); } finally { handle1.Set(); } }; 
     Action actionDesktop =() => { try { DoBitBlt(hdcDestDesktop, width, height, hdcSrcDesktop); } finally { handle2.Set(); } }; 
     ThreadPool.QueueUserWorkItem(x => actionWindow()); 
     ThreadPool.QueueUserWorkItem(x => actionDesktop()); 
     WaitHandle.WaitAll(new WaitHandle[] { handle1, handle2 }); 

     rslt.window = Bitmap.FromHbitmap(hBitmapWindow); 
     rslt.desktop = Bitmap.FromHbitmap(hBitmapDesktop); 

     // restore selection 
     GDI32.SelectObject(hdcDestWindow, hOldWindow); 
     GDI32.SelectObject(hdcDestDesktop, hOldDesktop); 
     // clean up 
     GDI32.DeleteDC(hdcDestWindow); 
     GDI32.DeleteDC(hdcDestDesktop); 
     User32.ReleaseDC(window, hdcSrcWindow); 
     User32.ReleaseDC(desktop, hdcSrcDesktop); 
     // free up the Bitmap object 
     GDI32.DeleteObject(hBitmapWindow); 
     GDI32.DeleteObject(hBitmapDesktop); 
     return rslt; 
    } 
+3

私はあなたがしていることが倫理的だとは思わない。あなたの「wallhack」検出器は、ユーザーが漏れたくない情報を収集しています。ユーザーがゲームをプレイしている間にデスクトップのスクリーンキャプチャを取ることに同意したのはなぜですか?実装しようとしている動作は、トロイの木馬の分類に基づいています。もちろん、あなたがあなたのプログラムの目的について嘘をついていないならば、それはもちろんです。 <ロムクの提案でここに移動> –

+0

これは['Parallel.Foreach']の適切な使用かもしれません(http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.foreach.aspx )。 'ThreadPool'は並列性を保証しません。 – Romoku

+2

あなたのゲームをウィンドウで開いて、そのウィンドウ上でウェブブラウザを開いて(Googleの何か|私の銀行口座をチェックする| Facebookをブラウズする|違法をする)、そのスクリーンショットを撮るとします。あなたは偽陽性を記録します。私がそうしていないときは私が不正行為をしていることを証明し、証明/検証のための「偽の」スクリーンショットをアップロードすることを決定した場合、私の個人情報を誤って取得できます。 –

答えて

1

...

ゲームだから、これはあまりいい考えではないと思う。あなたのゲームがスムーズに動くようにしたい。

代わりに、ゲームの最近レンダリングされたイメージをメモリに保存し、スクリーンショットを撮るときにそれを比較することをお勧めします。いくつかの視覚的なヒントを追加して、最近のフレームのどれを比較するかを決めることができれば、はるかにうまくいくはずです。そうしないと、スクリーンショットをすべてのものと比較しなければならないでしょう。

GDIを使用してレンダリングしていますか?そうであれば、あなたのゲームのフレームをDIB(Device Independent Bitmaps)に保存して、それらを比較できるようにします。

どのイメージを使用するかを決定する手がかりは、画面上に何らかの種類の時間表示があります。多分色が変わる単一のピクセルです。そうであれば、そのピクセルの色を読んで、それを使って正しいフレームを見つけ、全体の画像を比較する手順を実行します。

+0

ゲームの協力があれば、実際に古いフレームを保存する必要はありません。ステガノグラフィを使用して古いフレームの強いチェックサム、または低カラービットで隠されたデータは、オンスクリーンイメージキャプチャが変更されたかどうかを判断するのに完全に十分です。 –

関連する問題