के माध्यम से गेम हैक का पता लगाएं मैं एक गेम के लिए वॉलहाक का पता लगाने के लिए कुछ कोड लिखने की कोशिश कर रहा हूं। असल में, कुछ हैक्स मौजूद हैं जो एक विंडोज एयरो पारदर्शी खिड़की बनाते हैं, और वे इस बाहरी विंडो पर हैक खींचते हैं, इसलिए गेम का स्क्रीनशॉट लेकर इसे पता नहीं लगाया जा सकता है।स्क्रीनशॉट विश्लेषण सी #
इस समय मेरा दृष्टिकोण है - 1. गेम विंडो का एक स्क्रीनशॉट लें। 2. एक ही निर्देशांक के लिए विंडोज डेस्कटॉप का एक स्क्रीनशॉट लें। 3. स्क्रीनशॉट 1 की तुलना करने के लिए स्क्रीनशॉट 1 की तुलना करने के लिए छवि विश्लेषण करें, यह देखने के लिए कि कोई अंतर है या नहीं।
मेरी समस्या यह है कि स्क्रीनशॉट 1 और स्क्रीनशॉट 2 एक साथ प्रदर्शन नहीं किए जाते हैं, इसलिए दो स्क्रीनशॉट के बीच नए गेम फ्रेम तैयार किए जा सकते हैं, जिससे छवियों की तुलना की जाती है जब झूठी सकारात्मक होती है।
मैं जानना चाहता हूं कि स्क्रीनशॉट को समन्वयित करने का कोई तरीका है या नहीं, तो वे ठीक उसी समय होते हैं? या किसी भी तरह से स्क्रीनशॉट समाप्त होने तक स्क्रीन को किसी नए फ्रेम को चित्रित करना बंद कर दें?
यह वह कोड है जिसका उपयोग मैं स्क्रीनशॉट लेने के लिए करता हूं। नोट, मैंने दो कार्य वस्तुओं को कतार में समानांतर में 2 स्क्रीनशॉट लेने का भी प्रयास किया है। हालांकि, इसके परिणामस्वरूप स्क्रीनशॉट बिल्कुल एक ही समय में नहीं हो रहा है। तो मुझे आश्चर्य है कि ग्राफिक्स कार्ड से स्क्रीन पर किसी और अपडेट को रोकने के लिए कोई तरीका नहीं है जब तक कि मेरे स्क्रीनशॉट खत्म नहीं हो जाते? या कोई और तरीका मैं यह कर सकता हूँ?
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;
}
मुझे विश्वास नहीं है कि आप क्या कर रहे हैं नैतिक है। आपका 'वालहाक' डिटेक्टर उस जानकारी को इकट्ठा कर रहा है जिसे उपयोगकर्ता प्रकट करना नहीं चाहता है। जब कोई गेम खेलता है तो उपयोगकर्ता आपके डेस्कटॉप के स्क्रीन कैप्चर लेने के लिए क्यों सहमति देगा? जिस व्यवहार को आप कार्यान्वित करने का प्रयास कर रहे हैं वह ट्रोजन घोड़े के वर्गीकरण के अंतर्गत आता है। यह निश्चित रूप से है यदि आप अपने कार्यक्रम के उद्देश्य के बारे में झूठ नहीं बोल रहे हैं। <रोमुकु के सुझाव पर यहां पहुंचे> –
यह ['समानांतर। Foreach'] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.foreach.aspx का उचित उपयोग हो सकता है)। 'थ्रेडपूल' समांतरता की गारंटी नहीं देता है। – Romoku
मान लीजिए कि मेरे पास एक विंडो में आपका गेम खुला है, लेकिन उसके बाद उस विंडो पर एक वेब ब्राउजर खोलें (google google | मेरा बैंक खाता देखें | फेसबुक ब्राउज़ करें | कुछ अवैध करें) और आप इसका स्क्रीनशॉट लेते हैं।आप झूठी पॉजिटिव रिकॉर्ड करेंगे - जब मैं नहीं हूं, तो मैं धोखा दे रहा हूं, और यदि आप निर्णय लेते हैं कि आपको सबूत/सत्यापन के लिए "फ़ेक्ड" स्क्रीनशॉट अपलोड करना चाहिए, तो आप गलती से मेरे निजी विवरण कैप्चर कर सकते हैं। –