在ReadAllBytes中搜索特定值



我正在编写一个程序,该程序读取".exe"文件,并将其十六进制值存储在字节数组中,以便与包含一系列值的数组进行比较。(就像一个非常简单的病毒扫描仪)

byte[] buffer = File.ReadAllBytes(currentDirectoryContents[j]);

然后,我使用BitConverter创建了这些值的单个字符串

string hex = BitConverter.ToString(buffer);

下一步是在该字符串中搜索一系列值(定义),并为匹配返回正数。这就是我遇到问题的地方。我的定义是十六进制值,但作为定义创建并保存在记事本中。xyz

string[] definitions = File.ReadAllLines(@"C:definitions.xyz");

我一直试图将它们读取到字符串数组中,并将数组的定义元素与字符串十六进制进行比较

bool[] test = new bool[currentDirectoryContents.Length];
test[j] = hex.Contains(definitions[i]);

这是一篇家庭作业的一部分,这就是为什么我没有发布我的整个程序代码。我在上周五之前没有使用过C#,所以在这一点上我很可能会犯一些愚蠢的错误。

非常感谢任何建议:)

目前还不清楚您使用的定义的确切格式。Base64是一个很好的字节编码[],您可以使用convert.ToBase64String和convert.FromBase64String()快速来回转换。但您的问题表明字节是用十六进制编码的。假设新字节[]{1,2,3,4}看起来像"01020304"。然后这个helper函数将这样的字符串转换回byte[]:

    static byte[] Hex2Bytes(string hex) {
        if (hex.Length % 2 != 0) throw new ArgumentException();
        var retval = new byte[hex.Length / 2];
        for (int ix = 0; ix < hex.Length; ix += 2) {
            retval[ix / 2] = byte.Parse(hex.Substring(ix, 2), System.Globalization.NumberStyles.HexNumber);                
        }
        return retval;
    }

您现在可以使用类似Boyer-Moore的算法进行快速模式搜索。

我希望你明白这是一种效率很低的方法。但除此之外,你应该做这样的事情:

bool[] test = new bool[currentDirectoryContents.Length];
for(int i=0;i<test.Length;i++){
  byte[] buffer = File.ReadAllBytes(currentDirectoryContents[j]);
  string hex = BitConverter.ToString(buffer);
  test[i] = ContainsAny(hex, definitions);
}
bool ContainsAny(string s, string[] values){
  foreach(string value in values){
    if(s.Contains(value){
      return true;
    }
  }
  return false;
}

如果你能使用LINQ,你可以这样做:

var test = currentDirectoryContents.Select(
             file=>definitions.Any(
               definition => 
                 BitConverter.ToString(
                   File.ReadAllBytes(file)
                 ).Contains(definition)
             )
           ).ToArray();

此外,请确保您的定义文件的格式与BitConverter.ToString()的输出相匹配:大写,用破折号分隔每个编码字节:

12-AB-F0-34
54-AC-FF-01-02 

最新更新