【问题标题】:Extract Strings from Binary Files in VB.Net从 VB.Net 中的二进制文件中提取字符串
【发布时间】:2009-12-03 20:41:47
【问题描述】:

我想从一些包含嵌入式 SQL 语句的二进制文本文件中抓取字符串数据。我不需要任何花哨的清理——只需要某种方式来提取可读文本。我正在使用 vb.net,但调用外部实用程序也可以。

【问题讨论】:

    标签: .net windows vb.net string binaryfiles


    【解决方案1】:
    【解决方案2】:

    GNU 字符串实用程序一直存在,它通过使用启发式方法从二进制文件中提取任何“看起来像字符串”的数据,或多或少地做到了这一点。

    从 MinGW 获取 Win32 的 GNU binutils(包括字符串): http://sourceforge.net/projects/mingw/files/.

    【讨论】:

    • 仅供参考,字符串的输出会包含很多误报,但是鉴于您知道要查找的字符串的语法(SQL 语句),过滤起来并不难只有你在找什么。
    • +1,尤其是因为我也看过它并认为它不合适。难道我错了! ;-)。请注意,使用启发式方法不是罗塞塔石碑......
    【解决方案3】:

    这并不像乍看起来那么简单。字符串可以通过多种方式进行编码。您认为“可读文本”是什么,不可读的部分看起来如何?说它看起来像这样:

     &8)JÓxZZ`\■£ÌS?E?L?E?C?T?*?F?R?O?M?m?y?T?b?l?§ıÍ4¢
    

    你很幸运,因为它很可能使用 UTF-16 或其他多字节编码进行编码。这些是相当微不足道的识别。但在几乎所有其他情况下(UTF-8、ISO-8859-1、Windows-1252),几乎不可能区分单个字符是文本还是非文本,除非您非常了解某个字符“可读文本”的开始和结束方式。

    重点是:任何内容都是允许的并被视为可读文本。 UTF-8、ASCII 和 Windows-1252 甚至允许 NULL 字符(而某些编程语言则不允许)。 Here's a thread 提供了一个 VB 示例,说明如何进行操作,它可能会给您一些提示。

    PS:分析此类数据可能很困难,如果您可以将文件上传到某个地方以便我们查看,将会有很大帮助。

    【讨论】:

    • 当我打开我想在记事本中查看的文本文件时,我关心的字符串部分清晰可见。我假设我需要做的就是去掉任何非字符串,然后我就可以设置了吗?
    • 我希望你是对的,但这并不容易。记事本不知道这些字符串,它只是显示它们。查看任何二进制文件(即图像),您会发现“可读”部分。假设您逐个字符地查看它,您是否可以肯定地在整个文件中选择一个始终为“字符串”的字符范围?
    【解决方案4】:

    谢谢大家。伟大的想法。真的帮助我思考。到处点赞。最后,我不需要非常确定它们是字符串,所以我使用了一个快速、草率、丑陋、hack 的方法。

     'strip out non-string characters 
     For Each b As Byte In byteArray
          If b = 9 Or b = 10 Or b = 13 Or (b > 31 And b < 127) Then
              newByteArray(i) = b.ToString
              i += 1
          End If
      Next
    
      'move it into a string
      resultString = System.Text.Encoding.ASCII.GetString(newByteArray)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 2012-09-05
      • 2011-09-09
      • 2012-10-29
      • 2020-10-30
      • 1970-01-01
      相关资源
      最近更新 更多