ゲーム用のウォールハックを検出するためのコードを記述しようとしています。 基本的に、いくつかのハッキングが存在し、ウィンドウの空白透明ウィンドウを作成し、この外部ウィンドウにハックを描画するので、ゲーム自体のスクリーンショットを撮ることで検出することはできません。スクリーンショット分析によるゲームのハックを検出する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;
}
私はあなたがしていることが倫理的だとは思わない。あなたの「wallhack」検出器は、ユーザーが漏れたくない情報を収集しています。ユーザーがゲームをプレイしている間にデスクトップのスクリーンキャプチャを取ることに同意したのはなぜですか?実装しようとしている動作は、トロイの木馬の分類に基づいています。もちろん、あなたがあなたのプログラムの目的について嘘をついていないならば、それはもちろんです。 <ロムクの提案でここに移動> –
これは['Parallel.Foreach']の適切な使用かもしれません(http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.foreach.aspx )。 'ThreadPool'は並列性を保証しません。 – Romoku
あなたのゲームをウィンドウで開いて、そのウィンドウ上でウェブブラウザを開いて(Googleの何か|私の銀行口座をチェックする| Facebookをブラウズする|違法をする)、そのスクリーンショットを撮るとします。あなたは偽陽性を記録します。私がそうしていないときは私が不正行為をしていることを証明し、証明/検証のための「偽の」スクリーンショットをアップロードすることを決定した場合、私の個人情報を誤って取得できます。 –