我正在编写一个程序,它读取'.exe'文件并将其十六进制值存储在一个字节数组中,以便与包含一系列值的数组进行比较。 (就像一个非常简单的病毒扫描程序)
byte[] buffer = File.ReadAllBytes(currentDirectoryContents[j]);
然后我使用BitConverter创建这些值的单个字符串
string hex = BitConverter.ToString(buffer);
下一步是在此字符串中搜索一系列值(定义)并为匹配返回正数。这是我遇到问题的地方。我的定义是十六进制值,但是在defeptions.xyz
中创建并保存在记事本中string[] definitions = File.ReadAllLines(@"C:\definitions.xyz");
我一直在尝试将它们读入字符串数组,并将数组的定义元素与字符串hex
进行比较bool[] test = new bool[currentDirectoryContents.Length];
test[j] = hex.Contains(definitions[i]);
这是一段作业的一部分,这就是为什么我没有发布我的整个程序代码。我上个星期五之前没有使用过C#,所以最有可能在这一点上犯下愚蠢的错误。
任何建议都非常感激:)
答案 0 :(得分:1)
目前还不清楚您使用这些定义的格式。 Base64是一个很好的byte []编码,你可以使用Convert.ToBase64String和Convert.FromBase64String()快速转换。但是你的问题表明字节是用十六进制编码的。让我们假设它对于一个新字节[] {1,2,3,4}看起来像“01020304”。然后这个辅助函数将这样的字符串转换回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等算法进行快速模式搜索。
答案 1 :(得分:0)
我希望你明白这是一种非常低效的方法。但除此之外,你应该做这样的事情:
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