【问题标题】:How to search hex pattern with wild card in string?如何在字符串中使用通配符搜索十六进制模式?
【发布时间】:2017-06-22 01:23:27
【问题描述】:

我有一些这种格式的哈希:

row:title:hash:flag
1:upx1:4D 00 68 6B ?? 68 6A:True
2:upx2:68 6B ?? 68 6A 00 02:False
3:upx3:FF 4D ?? 68 6B ?? 68:True

我有这样的字符串:

02 4D 00 68 6B 6A 68 6A 00 02 00 00 00 FF 02 5A 68 6B 6A 68 6A 00 02 00

我需要用这个字符串匹配任何哈希值并匹配任何十六进制值而不是双问号
例如第 1 行中的哈希“4D 00 68 6B ?? 68 6A”与我的字符串匹配

我使用了这段代码,但总是返回“否”

    string str = "02 4D 00 68 6B 6A 68 6A 00 02 00 00 00 FF 02 5A 68 6B 6A 68 6A 00 02 00";
    string hash = "1:upx1:4D 00 68 6B ?? 68 6A:True";

    str = string.Join(" ", str.Split().Select(x => string.Format(@"(?:{0}|\?\?)", x)).ToArray());
    string sPattern = string.Format(@"(?<row>\w*:)(?<title>\w*:)([^:]*{0}[^:]*:)(?<ep>\w*)", hash);


    if (Regex.IsMatch(str, sPattern))
    {
        MessageBox.Show("ok");
    }
    else
    {
        MessageBox.Show("no");
    }

【问题讨论】:

  • 看起来好像您想使用 hash 列值作为正则表达式模式来测试字符串,对吧?只需提取它并将? 替换为.
  • 可以,但是 hash.Replace("?",".") 不起作用!
  • 当然,首先提取哈希。 var pattern = hash.Split(':')[2].Replace("?", ".") 然后Regex.IsMatch(str, pattern)
  • 它的工作,但我需要返回标题列作为匹配的结果

标签: c# regex hex


【解决方案1】:

您不希望整行与字符串匹配,因为字符串不适合该行。这是一个如何做到这一点的工作示例:

 public static void Test()
 {
       string str = "02 4D 00 68 6B 6A 68 6A 00 02 00 00 00 FF 02 5A 68 6B 6A 68 6A 00 02 00";
        string hash = "1:upx1:4D 00 68 6B ?? 68 6A:True";
        var parts = hash.Split(':');
        string title = parts[1];
        string hashhex = parts[2];
        string sPattern = hashhex.Replace("?", ".");
        Console.WriteLine($"Pattern={sPattern}");
        Console.WriteLine($"String={str}");

        if (Regex.IsMatch(str, sPattern))
        {
            Console.WriteLine("ok");
            Console.WriteLine($"MatchedTitle={title}");
        }
        else
        {
            Console.WriteLine("no");
        }
        Console.ReadLine();
 }

这是输出:

【讨论】:

  • 由于字符串的长度较大,您对提高性能有何建议?
  • @Tavakkoli,你能描述一下字符串与哈希的关系吗?例如:将 100 个字符串匹配到 5 个哈希,或者将 10 个字符串匹配到 1000 个哈希。不同的比率应该有各种最佳方法来优化这一点。
  • 我的字符串是一个二进制文件的内容,我在这个内容中搜索哈希。
  • 所以只搜索一个二进制文件?文件有多大?还有多少哈希与此文件匹配?
  • 是的,每次搜索一个二进制文件,例如500000字节,我的哈希数据库大约3000条记录
猜你喜欢
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
相关资源
最近更新 更多