我正在构建一个Web应用程序,我需要扫描用户上传的文件以查找病毒.
有这方面经验的人是否可以提供有关如何启动和运行的信息?我猜测防病毒软件包有API以编程方式访问它们的功能,但似乎要轻易搞定细节.
仅供参考,该应用程序是用C#编写的.
我已经开始看到一个AccessViolationException被我的应用程序抛出了几个不同的位置.它从未出现在我的开发PC上,我们的测试服务器上.它也仅在我们的2个生产服务器中的一个上显示出来.因为它似乎只发生在我们的一个生产服务器上,所以我开始在服务器上查看已安装的.net框架版本.
我发现(出于一些奇怪的原因),出现问题的生产服务器有2.0 sp2,3.0 sp2和3.5 sp1,而另一个生产服务器和测试服务器有2.0 sp1.
我的应用程序仅针对2.0框架,决定从生产服务器卸载所有框架版本并仅安装2.0 sp1.到目前为止,我还没有能够重现这个问题.很有意思.
开发pc:紧凑型2.0 sp2,紧凑型3.5,2.0 sp2,3.0 sp2,3.5 sp1测试服务器:2.0 sp1生产服务器1:2.0 sp1生产服务器2:2.0 sp2,3.0 sp2,3.5 sp1
现在,为什么我无法重现问题我的开发pc上有2.0 sp2,我想不出来.我听说有传言说这种访问违规可能发生在一些使用远程处理的软件上,我的确如此,但是当实际进行远程处理时,访问冲突永远不会发生.我现在只使用2.0 sp1,但我真的很想知道是否有人遇到过这个问题,如果他们找到了更新版本的frameowork的解决方法.
这里有几个例外和它们的堆栈跟踪:
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at ICSharpCode.TextEditor.TextArea.HandleKeyPress(Char ch)
at ICSharpCode.TextEditor.TextArea.SimulateKeyPress(Char ch)
at ICSharpCode.TextEditor.TextArea.OnKeyPress(KeyPressEventArgs e)
at System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
at System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
at System.Windows.Forms.Control.WmKeyChar(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
System.AccessViolationException: Attempted to read …Run Code Online (Sandbox Code Playgroud) 我有什么可以做的AccessViolationException吗?它是由我无法控制的非托管DLL引发的.
我试图AmsiScanBuffer从托管代码中使用Windows防恶意软件服务接口的功能,特别是C#.尝试调用该方法时,只要提供非零缓冲区长度,程序就会挂起.如果提供的缓冲区长度为0,则该方法立即返回HResult E_INVALIDARG.AMSI暴露的其他方法按预期工作,所以我希望我相信我的dllimport这个功能很接近但可能不完全正确.除了这里表示的数组复制方法,我尝试固定数组,行为是相同的.
C原型
HRESULT WINAPI AmsiScanBuffer(
_In_ HAMSICONTEXT amsiContext,
_In_ PVOID buffer,
_In_ ULONG length,
_In_ LPCWSTR contentName,
_In_opt_ HAMSISESSION session,
_Out_ AMSI_RESULT *result
);
Run Code Online (Sandbox Code Playgroud)
托管代码
[DllImport("Amsi.dll", EntryPoint = "AmsiScanBuffer", CallingConvention = CallingConvention.StdCall)]
public static extern int ScanBuffer(IntPtr amsiContext, IntPtr ptr, ulong length, string contentName, IntPtr session, out int result);
var virus = "X5O!P%@AP[4\\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*";
var bytes = Encoding.UTF8.GetBytes(virus);
int sizet = Marshal.SizeOf(typeof(byte)) * bytes.Length;
var ptr = Marshal.AllocHGlobal(sizet);
try
{
Marshal.Copy(bytes, 0, ptr, bytes.Length);
int hr = Amsi.ScanBuffer(context, …Run Code Online (Sandbox Code Playgroud)