2009-12-03 52 views
1

我想从包含嵌入式SQL语句的一些二进制文本文件中提取字符串数据。我不需要任何花哨的清理 - 只是提取可读文本的一些方法。我使用的是vb.net,但是调用外部工具也可以。从VB.Net中的二进制文件中提取字符串

回答

0

谢谢大家。伟大的想法。真的帮助我思考。四处升腾。最后,我不需要确定它们是否是字符串,所以我用一种快速,草率,丑陋的黑客行事。

'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) 
1

这并不像起初看起来那么微不足道。一个字符串可以用许多方式编码。你认为什么是“可读文本”,不可读部分是怎么看的?说它看上去像这样:

&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:分析这种类型的数据可能很困难,如果您可以将文件上传到某个地方,那么我们可以看一看。

+0

当我打开我想看看在记事本中我关心的弦线部分的TEXTFILES都清晰可见。我认为我需要做的就是去掉任何非字符串,我会被设置? – Jeff 2009-12-03 20:52:23

+1

我希望你是对的,但并不那么容易。记事本不知道*这些字符串,它只是显示它们。查看任何二进制文件(即图像),你会发现“可读”的部分。假设你逐个角色地观察它,你能否在整个文件中主动选择一个始终为“字符串”的字符范围? – Abel 2009-12-03 20:55:53

3

的GNU strings实用程序已经撒手人寰,并做更多或多或少的正是这种利用启发式猛拉说,“看起来像一个字符串”从二进制的任何数据。

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

+0

仅供参考,字符串的输出将包含大量误报,但鉴于您知道要查找的字符串的语法(SQL语句),因此不会过滤仅您要查找的内容。 – 2009-12-03 21:53:43

+0

+1,尤其是因为我也看着它,并认为它不合适。我错了! ;-)。请注意,使用启发式不是罗塞塔的石头...... – Abel 2009-12-03 22:12:06