我将二进制文件转换为十六进制字符串,以在其中搜索用户提供的特定模式,就像防病毒软件处理其签名数据库一样。如果找到一个模式,那么它将返回 true。
我面临的一个困难是通配符和扫描速度慢。用户有数千种模式,每个模式最多 200 个字符,甚至更多。
例如,此模式用于验证文件是否在 C++ 下编译,而“?” 字符是一个通配符(可以匹配任何一个字符):
55 8B EC 53 8B 5D 08 56 8B 75 0C 85 F6 57 8B 7D 10 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 01
与那个相似的模式都堆叠在一个长度不等的文件中,所以我想你明白了。
这是我正在使用的代码(工作正常,但与其他在几秒钟内完成模式扫描的工具(如 ExeInfoPE 或 Die)相比非常慢)
static bool compare(string[] mask, byte[] buffer, int position)
{
var i = 0; // index
foreach (string x in mask) // loop through the mask
{
if (x.Contains("?")) // is current mask position a wildcard?
{
}// if so skip comparison
else if (byte.Parse(x, System.Globalization.NumberStyles.HexNumber) == buffer[position + i]) // else try to compare
{
}// succeeded, move onto next byte
else
return false; // failed, pattern not found
++i; // increment the index.
}
return true; // pattern was found
}
关于如何极大地提高速度,同时保持对通配符的支持以便我的工具可以在现实世界中使用的任何想法?