我必须在一些机器上同步大文件.这些文件最大可达6GB.同步将每隔几周手动完成.我不能考虑文件名,因为它们可以随时更改.
我的计划是在目标PC和源PC上创建校验和,然后将所有尚未在目标中的校验和文件复制到目标.我的第一次尝试是这样的:
using System.IO;
using System.Security.Cryptography;
private static string GetChecksum(string file)
{
using (FileStream stream = File.OpenRead(file))
{
SHA256Managed sha = new SHA256Managed();
byte[] checksum = sha.ComputeHash(stream);
return BitConverter.ToString(checksum).Replace("-", String.Empty);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是运行时:
- 使用带有1,6 GB文件的SHA256 - > 20分钟
- 使用带有1.6 GB文件的MD5 - > 6.15分钟
是否有更好 - 更快 - 获得校验和的方法(可能具有更好的散列函数)?
所以前几天,我看到了这个:
http://www.edgeofnowhere.cc/viewtopic.php?p=2483118
它涉及三种不同的DLL注入方法.我如何防止这些过程?或者至少,我该如何预防第一个?
我想也许Ring 0的驾驶员可能是阻止这三个人的唯一方法,但我想看看社区的想法.
我编写了一个C#.NET应用程序,它使用流行的非托管DLL文件来实现其部分功能.使用System.Runtime.InteropServices中的标准DllImport导入DLL.
但是,遗憾的是,我的应用程序(以及大多数使用DllImport的.NET应用程序)容易受到DLL劫持攻击.即攻击者可以将导入的DLL的恶意副本放在与我的应用程序打开的任何文件相同的目录中.这可以使攻击者完全控制用户的计算机.
为了缓解此漏洞,我想在导入之前验证DLL文件是否已正确签名(使用默认的Authenticode).我知道签名可以使用像sigcheck.exe这样的工具进行验证,但这对我来说不是一个可行的解决方案,因为我需要在我的C#代码中完成.
所以我的问题很简单:在加载DLL之前,如何从我的托管C#代码中验证DLL是否具有有效的Authenticode签名?
限制:
失败的方法: