2016-11-30 7 views
15

हम विंडोज डिफेंडर एपीआई का उपयोग कर सी # से फ़ाइल की ऑन-डिमांड स्कैन करने के लिए एक कोड लिख रहे हैं।विंडोज डिफेंडर एंटीवायरस सी # [एक्सेसवियोलेशन अपवाद] से स्कैन करें

 [DllImport(@"C:\Program Files\Windows Defender\MpClient.dll")] 
     public static extern int WDStatus(out bool pfEnabled); 

     [DllImport(@"C:\Program Files\Windows Defender\MpClient.dll")] 
     public static extern int MpManagerOpen(uint dwReserved, out IntPtr phMpHandle); 

     [DllImport(@"C:\Program Files\Windows Defender\MpClient.dll")] 
     public static extern int MpScanStart(IntPtr hMpHandle, uint ScanType, uint dwScanOptions, IntPtr pScanResources, IntPtr pCallbackInfo, out IntPtr phScanHandle); 

     [DllImport(@"C:\Program Files\Windows Defender\MpClient.dll")] 
     public static extern int MpHandleClose(IntPtr hMpHandle); 

     private void DoDefenderScan_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       bool pfEnabled; 
       int result = WDStatus(out pfEnabled); //Returns the defender status - It's working properly. 
       ErrorHandler.ThrowOnFailure(result, VSConstants.S_OK); 

       IntPtr phMpHandle; 
       uint dwReserved = 0; 

       IntPtr phScanHandle; 

       MpManagerOpen(dwReserved, out phMpHandle); //Opens Defender and returns the handle in phMpHandle. 

       tagMPRESOURCE_INFO mpResourceInfo = new tagMPRESOURCE_INFO(); 
       mpResourceInfo.Path = "eicar.com"; 
       mpResourceInfo.Scheme = "file"; 
       mpResourceInfo.Class = IntPtr.Zero; 

       tagMPRESOURCE_INFO[] pResourceList = new tagMPRESOURCE_INFO[1]; 
       pResourceList.SetValue(mpResourceInfo, 0); 

       tagMPSCAN_RESOURCES scanResource = new tagMPSCAN_RESOURCES(); 
       scanResource.dwResourceCount = 1; 
       scanResource.pResourceList = pResourceList; 
       IntPtr resourcePointer = StructToPtr(scanResource); 

       result = MpScanStart(phMpHandle, 3, 0, resourcePointer, IntPtr.Zero, out phScanHandle); **//Getting Access violation exception here**. 

       MpHandleClose(phMpHandle); 
       MpHandleClose(phScanHandle); 
       Marshal.FreeHGlobal(resourcePointer); 
      } 
      catch (Exception) 
      { } 
     } 

और संरचना यहां परिभाषित की गई है।

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
    public struct tagMPSCAN_RESOURCES 
    { 
     public uint dwResourceCount; 

     [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)] 
     public tagMPRESOURCE_INFO[] pResourceList; 
    } 

    [StructLayout(LayoutKind.Sequential, Pack = 1)] 
    public struct tagMPRESOURCE_INFO 
    { 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public String Scheme; 

     [MarshalAs(UnmanagedType.LPWStr)] 
     public String Path; 

     public IntPtr Class; 
    } 

    public class MPRESOURCE_CLASS 
    { 
     public uint Value; 
    } 

    private static IntPtr StructToPtr(object obj) 
    { 
     var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(obj)); 
     Marshal.StructureToPtr(obj, ptr, false); 
     return ptr; 
    } 

कोड

https://msdn.microsoft.com/en-us/library/vs/alm/dn920144(v=vs.85).aspx

पर दस्तावेज़ उपलब्ध के आधार पर लिखा है हम इस अपवाद

पढ़ने के लिए या संरक्षित स्मृति लिखने के लिए प्रयास किया गया हो रही है। यह अक्सर एक संकेत है कि अन्य स्मृति भ्रष्ट है।

result = MpScanStart(phMpHandle, 3, 0, resourcePointer, IntPtr.Zero, out phScanHandle); **//Getting Access violation exception here**. 

क्या समस्या हो सकती है पर

? क्या संरचना का प्रारूप सही है?

पीएस - MPRESOURCE_CLASS के बारे में कोई जानकारी msdn में उपलब्ध नहीं है।

मुझे यकीन नहीं है कि कोड की यह पंक्ति सही है या नहीं।

mpResourceInfo.Class = IntPtr.Zero; 

अद्यतन:

result = MpScanStart(phMpHandle, 1, 0, IntPtr.Zero, IntPtr.Zero, out phScanHandle); 
घटना दर्शक में

डिफेंडर लॉग [अनुप्रयोगों और सेवाओं लॉग्स-माइक्रोसॉफ्ट विंडोज विंडोज:

त्वरित स्कैन इस कोड के साथ ठीक काम कर रहा है डिफेंडर/ऑपरेशनल]

विंडोज डिफेंडर स्कैन शुरू हो गया है।
स्कैन आईडी: {CDC2AC0D-7648-4313-851C-4D8B7B5EB5CD}
स्कैन प्रकार: एंटी
स्कैन पैरामीटर: त्वरित स्कैन

+3

पवित्र हार्डकोडेड पथ, बैटमैन! कृपया यह मत करो। क्या होगा यदि मेरा बूट ड्राइव ड्राइव सी नहीं है? और क्या होगा यदि प्रोग्राम डिफेंडर में विंडोज डिफेंडर स्थापित नहीं है? –

+0

@ कोडीग्रे - यह एक पीओसी है। लेकिन इंगित करने के लिए धन्यवाद। – mlg

+0

मैं देखता हूं कि पहली बग MPSCAN_RESOURCES.pResourceList सदस्य घोषणा है। यह एक सरणी के लिए एक सूचक है, न कि UnmanagedType.ByValArray। आपको इसे इंटिप्टर के रूप में घोषित करना होगा और खुद को सरणी मार्शल करना होगा। पैक = 1 का उपयोग करना भी बहुत गलत है। और अधिक कीड़े हो सकती हैं, यह एक आसान एपीआई नहीं है। ऐसा करने के लिए आप C++/CLI का उपयोग करके आगे बढ़ेंगे, कम से कम आप mpclient.h शीर्षलेख फ़ाइल पर भरोसा कर सकते हैं। –

उत्तर

2

मैं यहाँ इस समस्या की पहचान नहीं कर सका उपलब्ध है। इसलिए मैंने Antimalware Scan Interface (एएमएसआई) के साथ विंडोज 10 से शुरू किया।

मैंने नमूना सी # कोड here लिखा है।
मुझे मिली एक चीज़ एएमएसआई को एपीआई को पास की गई फ़ाइल को सत्यापित करने के लिए विंडोज डिफेंडर/किसी भी एंटीवायरस को चालू करने की आवश्यकता है।लेकिन MpClient.dll के माध्यम से स्कैन ट्रिगर करने से बचावकर्ता बंद होने पर भी डिफेंडर स्कैन ट्रिगर होगा।

यह भी सुनिश्चित करें कि आपकी परियोजना x64 प्लेटफार्म को लक्षित करे।

public enum AMSI_RESULT 
    { 
     AMSI_RESULT_CLEAN = 0, 
     AMSI_RESULT_NOT_DETECTED = 1, 
     AMSI_RESULT_DETECTED = 32768 
    } 

[DllImport("Amsi.dll", EntryPoint = "AmsiInitialize", CallingConvention = CallingConvention.StdCall)] 
public static extern int AmsiInitialize([MarshalAs(UnmanagedType.LPWStr)]string appName, out IntPtr amsiContext); 

[DllImport("Amsi.dll", EntryPoint = "AmsiUninitialize", CallingConvention = CallingConvention.StdCall)] 
public static extern void AmsiUninitialize(IntPtr amsiContext); 

[DllImport("Amsi.dll", EntryPoint = "AmsiOpenSession", CallingConvention = CallingConvention.StdCall)] 
public static extern int AmsiOpenSession(IntPtr amsiContext, out IntPtr session); 

[DllImport("Amsi.dll", EntryPoint = "AmsiCloseSession", CallingConvention = CallingConvention.StdCall)] 
public static extern void AmsiCloseSession(IntPtr amsiContext, IntPtr session); 

[DllImport("Amsi.dll", EntryPoint = "AmsiScanString", CallingConvention = CallingConvention.StdCall)] 
public static extern int AmsiScanString(IntPtr amsiContext, [InAttribute()] [MarshalAsAttribute(UnmanagedType.LPWStr)]string @string, [InAttribute()] [MarshalAsAttribute(UnmanagedType.LPWStr)]string contentName, IntPtr session, out AMSI_RESULT result); 
[DllImport("Amsi.dll", EntryPoint = "AmsiScanBuffer", CallingConvention = CallingConvention.StdCall)] 
public static extern int AmsiScanBuffer(IntPtr amsiContext, [In] [MarshalAs(UnmanagedType.LPArray)] byte[] buffer, ulong length, [In()] [MarshalAs(UnmanagedType.LPWStr)] string contentName, IntPtr session, out AMSI_RESULT result); 

//This method apparently exists on MSDN but not in AMSI.dll (version 4.9.10586.0) 
[DllImport("Amsi.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] 
public static extern bool AmsiResultIsMalware(AMSI_RESULT result); 

private void CallAntimalwareScanInterface() 
{ 
    IntPtr amsiContext; 
    IntPtr session; 
    AMSI_RESULT result = 0; 
    int returnValue; 

    returnValue = AmsiInitialize("VirusScanAPI", out amsiContext); //appName is the name of the application consuming the Amsi.dll. Here my project name is VirusScanAPI. 
    returnValue = AmsiOpenSession(amsiContext, out session); 
    returnValue = AmsiScanString(amsiContext, @"X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*", "EICAR", session, out result); //I've used EICAR test string. 
    AmsiCloseSession(amsiContext, session); 
    AmsiUninitialize(amsiContext); 
} 
+0

इस पोस्ट पर वोट क्यों दें। बताने की देखभाल, यह क्यों मतदान किया गया है? मैं यहां बताना चाहता था, एएमएसआई डिफेंडर से संवाद करने का एक सफल वैकल्पिक तरीका है। – mlg

+0

@EricHirst - यह चारों ओर एक और तरीका है। मैंने इसे एक टिप्पणी के रूप में पोस्ट किया है http://stackoverflow.com/questions/40888849/windows-defender-antivirus-scan-from-c-sharp-accessviolation-exception/41361625?noredirect=1#comment69762063_40888849 मेरे प्रश्न के लिए ही। इवान ने इसकी प्रतिलिपि बनाई और जवाब के रूप में पोस्ट किया :) – mlg

+1

@mlg मैंने आपको जवाब नहीं दिया, क्योंकि मैंने इसे वास्तव में नहीं देखा था। ऐसा लगता है कि हम समानांतर में एक ही समस्या की जांच कर रहे थे और उसी समाधान को मिला। वैसे भी मैं आपकी प्रतिक्रिया को बढ़ा दूंगा और आपको बक्षीस दूंगा। यह शायद एएमएसआई का उपयोग करने के लिए अवधारणा कोड का सबूत जोड़ने के लिए समझ में आता है जिसे आपने पहले ही अपने उत्तर में लिखा था। –

2

मैं इस समस्या के बारे में खोज कर रहे हैं और मैं एक के रूप में इसे पढ़ लिया है संभावित कारणों में से:

"। आप अक्सर डिबग और रिहाई के बीच मतभेदों को बनाता है क्योंकि डिबग बनाता अतिरिक्त मेटाडाटा डिबगिंग में सहायता के लिए देखें, जिसमें"

यहाँ

: https://social.msdn.microsoft.com/Forums/vstudio/en-US/4f48c152-68cd-45ec-a11e-baa7de7f79c3/attempted-to-read-or-write-protected-memory?forum=csharpgeneral

इसके अलावा, आप के लिए this answer की जाँच करनी चाहिए "यह .NET में एक पहुँच उल्लंघन अपवाद को पकड़ने के लिए संभव है?" और एमएसडीएन पत्रिका
में आलेख Handling Corrupted State Exceptions में समझाए गए और विवरण ...

तो, कि उत्तर और लेख मैं कोशिश करता हूँ के अनुसार:

1 दोबारा जांच करके हस्ताक्षर और COM इंटरॉप Thunks सभी अप्रबंधित कोड के लिए सत्यापित करने के लिए कि वे सही कर रहे हैं।

2 सेट विजुअल स्टूडियो डीबगर इस अपवाद को बायपास करने के: -> विकल्प - टूल मेनू> डिबगिंग -> जनरल -> इस विकल्प "मॉड्यूल लोड पर JIT अनुकूलन को रोकें"

3 अपवाद का प्रयास करें-पकड़ो सही का निशान हटाएँ

(ध्यान दें:

<runtime> 
    <legacyCorruptedStateExceptionsPolicy enabled="true"/> 
</runtime> 

: यदि आप App.config में नेट 4 का उपयोग कर रहे तो, टैग के भीतर legacyCorruptedStateExceptionsPolicy सक्षम = की तरह "सही" शामिल करने के लिए क्रम संशोधित)

0,123,

इसके अलावा, here, मैंने पाया है कि कुछ .net फ्रेमवर्क संस्करण (नवीनतम टिप्पणी बिंदु में से एक में 4.6.1 पर टिप्पणी करें) इस अपवाद से संबंधित एक बग है और समाधान, अतीत में, किया गया है ढांचे को अपग्रेड करना इसके अलावा, मैंने उन उत्तरों में से एक में पढ़ा है:

हाय दो संभावित कारण हैं।

1. हमारे पास अन-प्रबंधित कोड है और हम इसे प्रबंधित कोड से कॉल कर रहे हैं। यह इस कोड को चलाने के लिए रोक रहा है। और

cmd इन आदेशों चलाने की कोशिश पुनः आरंभ अपने पीसी: netsh winsock रीसेट

खुला cmd.exe और कमांड "netsh winsock रीसेट सूची" चलाने 2.Anti वायरस अन-प्रबंधित कोड विचार कर रहा है के रूप में हानिकारक और इस कोड को एंटी-वायरस अक्षम करने के लिए प्रतिबंधित करें और फिर

मैं जानना चाहता हूं कि इनमें से कुछ दृष्टिकोण आपको आपकी समस्या का समाधान करने में मदद करते हैं या नहीं।

मुझे उम्मीद है कि यह वास्तव में मदद करता है।

के.आर.,

जुआन

+0

धन्यवाद। मैं उसे देख लूंगा। – mlg

1

आप मैलवेयर के लिए फ़ाइल की जाँच करने के Antimalware Scan Interface उपयोग कर सकते हैं।

एंटीमाइवेयर स्कैन इंटरफेस (एएमएसआई) एक सामान्य इंटरफ़ेस मानक है जो अनुप्रयोगों और सेवाओं को मशीन पर मौजूद किसी एंटीमलवेयर उत्पाद के साथ एकीकृत करने की अनुमति देता है। यह उपयोगकर्ताओं और उनके डेटा, अनुप्रयोगों और वर्कलोड के लिए उन्नत मैलवेयर सुरक्षा प्रदान करता है।

यह Windows 10 से शुरू

+0

पहले से ही प्रश्न के लिए टिप्पणी के रूप में जोड़ा गया था। http://stackoverflow.com/questions/40888849/windows-defender-antivirus-scan-from-c-sharp-accessviolation-exception/41361625?noredirect=1#comment69762063_40888849 – mlg

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