Поиск ReadAllBytes для конкретных значений - PullRequest
0 голосов
/ 06 февраля 2012

Я пишу программу, которая читает файлы '.exe' и сохраняет их шестнадцатеричные значения в массиве байтов для сравнения с массивом, содержащим серию значений.(как очень простой антивирусный сканер)

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

Затем я использовал BitConverter для создания одной строки этих значений

string hex = BitConverter.ToString(buffer);

Следующим шагом является поиск в этой строке сериизначений (определений) и вернуть положительный результат для совпадения.Здесь я сталкиваюсь с проблемами.Мои определения являются шестнадцатеричными значениями, но созданы и сохранены в блокноте как Defintions.xyz

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

Я пытался прочитать их в строковом массиве и сравнить элементы определения массива со строкой hex

bool[] test = new bool[currentDirectoryContents.Length];

test[j] = hex.Contains(definitions[i]);

Это часть домашней работы, поэтому я не публикую весь код программы.Я не использовал C # до прошлой пятницы, поэтому, скорее всего, на этом этапе делаю глупые ошибки.

Любой совет, который высоко ценится:)

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Довольно непонятно, в каком именно формате вы используете определения.Base64 - хорошая кодировка для byte [], вы можете быстро конвертировать туда и обратно с помощью Convert.ToBase64String и Convert.FromBase64String ().Но ваш вопрос предполагает, что байты закодированы в шестнадцатеричном виде.Предположим, это выглядит как «01020304» для нового байта [] {1, 2, 3, 4}.Затем эта вспомогательная функция преобразует такую ​​строку обратно в байт []:

    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;
    }

Теперь вы можете выполнять быстрый поиск по шаблону с помощью алгоритма, такого как Бойер-Мур.

0 голосов
/ 06 февраля 2012

Полагаю, вы понимаете, что это очень неэффективный способ сделать это. Но кроме этого, вы должны просто сделать что-то вроде этого:

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 
...