2013-08-13 7 views
5

के माध्यम से गेम हैक का पता लगाएं मैं एक गेम के लिए वॉलहाक का पता लगाने के लिए कुछ कोड लिखने की कोशिश कर रहा हूं। असल में, कुछ हैक्स मौजूद हैं जो एक विंडोज एयरो पारदर्शी खिड़की बनाते हैं, और वे इस बाहरी विंडो पर हैक खींचते हैं, इसलिए गेम का स्क्रीनशॉट लेकर इसे पता नहीं लगाया जा सकता है।स्क्रीनशॉट विश्लेषण सी #

इस समय मेरा दृष्टिकोण है - 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; 
    } 
+3

मुझे विश्वास नहीं है कि आप क्या कर रहे हैं नैतिक है। आपका 'वालहाक' डिटेक्टर उस जानकारी को इकट्ठा कर रहा है जिसे उपयोगकर्ता प्रकट करना नहीं चाहता है। जब कोई गेम खेलता है तो उपयोगकर्ता आपके डेस्कटॉप के स्क्रीन कैप्चर लेने के लिए क्यों सहमति देगा? जिस व्यवहार को आप कार्यान्वित करने का प्रयास कर रहे हैं वह ट्रोजन घोड़े के वर्गीकरण के अंतर्गत आता है। यह निश्चित रूप से है यदि आप अपने कार्यक्रम के उद्देश्य के बारे में झूठ नहीं बोल रहे हैं। <रोमुकु के सुझाव पर यहां पहुंचे> –

+0

यह ['समानांतर। Foreach'] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.foreach.aspx का उचित उपयोग हो सकता है)। 'थ्रेडपूल' समांतरता की गारंटी नहीं देता है। – Romoku

+2

मान लीजिए कि मेरे पास एक विंडो में आपका गेम खुला है, लेकिन उसके बाद उस विंडो पर एक वेब ब्राउजर खोलें (google google | मेरा बैंक खाता देखें | फेसबुक ब्राउज़ करें | कुछ अवैध करें) और आप इसका स्क्रीनशॉट लेते हैं।आप झूठी पॉजिटिव रिकॉर्ड करेंगे - जब मैं नहीं हूं, तो मैं धोखा दे रहा हूं, और यदि आप निर्णय लेते हैं कि आपको सबूत/सत्यापन के लिए "फ़ेक्ड" स्क्रीनशॉट अपलोड करना चाहिए, तो आप गलती से मेरे निजी विवरण कैप्चर कर सकते हैं। –

उत्तर

1

आप एक साथ दोनों स्क्रीनशॉट के लिए जब तक आप कुछ ग्राफिक accelarators लिए संसाधन, जिसका अर्थ है कि यह है कि हर कंप्यूटर में काम नहीं करेगा सक्षम होने के लिए नहीं जा रहे हैं ...

प्रतिपादन रोक, यह के रूप में के बारे में एक खेल है, मुझे लगता है कि यह इतना अच्छा विचार नहीं है ... आप अपने खेल को आसानी से चलाने के लिए चाहते हैं।

इसके बजाय मैं स्मृति में आपके गेम की हाल ही में प्रस्तुत छवियों को स्टोर करने का सुझाव देना चाहता हूं, और जब आप स्क्रीनशॉट लेते हैं तो उन्हें तुलना करें। यदि आप यह तय करने के लिए कुछ दृश्य सुराग जोड़ सकते हैं कि हाल के फ्रेम की तुलना करने के लिए कौन से फ़्रेम की तुलना में बेहतर काम करेगा, अन्यथा आपको उन सभी को स्क्रीनशॉट की तुलना करना होगा और यह निश्चित रूप से कुछ CPU/GPU समय खाएगा।

क्या आप प्रस्तुत करने के लिए जीडीआई का उपयोग कर रहे हैं? यदि हां, तो आप जो चाहते हैं वह डीआईबी (डिवाइस इंडिपेंडेंट बिटमैप्स) में अपने गेम के फ्रेम को उनकी तुलना करने में सक्षम होना है।

यह तय करने के लिए कि कौन सी छवि का उपयोग करना है, मैं स्क्रीन पर किसी प्रकार के समय के प्रतिनिधित्व के लिए जाऊंगा, शायद एक पिक्सल जो रंग बदलता है। यदि ऐसा है, तो आप उस पिक्सेल के रंग को पढ़ लेंगे, सही फ्रेम खोजने के लिए इसका उपयोग करेंगे, और पूरी तस्वीर की तुलना करने की प्रक्रिया होगी।

+0

यदि आपके पास गेम से सहयोग है, तो आपको वास्तव में पुराने फ्रेम को सहेजने की आवश्यकता नहीं है। पुरानी फ्रेम का एक मजबूत चेकसम, या स्टेग्नोग्राफ़ी का उपयोग करके कम रंग बिट्स में छिपा हुआ डेटा, यह निर्धारित करने के लिए पूरी तरह से पर्याप्त होगा कि ऑन-स्क्रीन छवि कैप्चर संशोधित किया गया है या नहीं। –

संबंधित मुद्दे