【问题标题】:How would I find an unknown pattern in an array of bytes?如何在字节数组中找到未知模式?
【发布时间】:2015-11-04 01:54:05
【问题描述】:

我正在构建一个工具来帮助我对数据库文件进行逆向工程。我将我的工具定位于固定记录长度的平面文件。

我知道的: 1)每条记录都有一个索引(ID)。 2) 每条记录由分隔符分隔。 3) 每条记录都是固定宽度。 4) 每条记录中的每一列至少由一个 x00 字节分隔。 5)文件头在开头(我这么说是因为头不包含分隔符..)

我在其他文件中找到的分隔符是:( xFAxFA, xFExFE, xFDxFD ) 但考虑到我将来可能会在不同的数据库上使用该工具,这有点无关紧要。所以我需要一些能够挑选出“模式”的东西,尽管它是由多少字节组成的。大概不超过6个字节?如果它更多,它可能会吃掉太多的数据。但是,我这样做的经验是有限的。

所以我想我的问题是,如何在大文件中找到 UNKNOWN 分隔符?我觉得,“我所知道的”我应该能够编程一些东西,我只是不知道从哪里开始......

 # Really loose pseudo code
 def begin_some_how
   # THIS IS THE PART I NEED HELP WITH...
   # find all non-zero non-ascii sets of 2 or more bytes that repeat more than twice.
 end

 def check_possible_record_lengths
   possible_delimiter = begin_some_how
   # test if any of the above are always the same number of bytes apart from each other(except one instance, the header...)
   possible_records = file.split(possible_delimiter)
   rec_length_count = possible_records.map{ |record| record.length}.uniq.count
   if rec_length_count == 2 # The header will most likely not be the same size.
     puts "Success! We found the fixed record delimiter: #{possible_delimiter}
   else
     puts "Wrong delimiter found"
   end
 end

【问题讨论】:

    标签: ruby database reverse-engineering


    【解决方案1】:
    possible = [",", "."]
    
    result = [0, ""]
    possible.each do |delimiter|
        sizes = file.split( delimiter ).map{ |record| record.size }
        next if sizes.size < 2
    
        average = 0.0 + sizes.inject{|sum,x| sum + x }  
        average /= sizes.size    #This should be the record length if this is the right delimiter
    
        deviation = 0.0 + sizes.inject{|sum,x| sum + (x-average)**2 }
    
        matching_value = average / (deviation**2)
        if matching_value > result[0] then
            result[0] = matching_value
            result[1] = delimiter
        end
    
    end
    

    利用记录具有恒定大小这一事实。获取每个可能的分隔符并检查每条记录与通常的记录长度有多少偏差。如果与文件的其余部分相比,标题足够小,这应该可以工作。

    【讨论】:

    • 这看起来很棒,但我更想知道如何找到未知模式?我不想定义可能的分隔符,因为它们可以是任意一组随机字节。
    • @Peter Black 这就是你必须测试所有可能性的原因。可以这样想:如果您查看的是文件而不是计算机,您将如何猜测什么是分隔符,什么不是?尝试一些,看看哪些表现得像分隔符。
    • 那么“发现”未知模式的唯一方法就是看?我有点希望有某种算法可以测试模式。喜欢:1)找到所有重复超过两次的2个或更多字节的非零非ascii集。 2)测试上述任何一项是否总是彼此相隔相同数量的字节(除了一个实例,标头......)。
    猜你喜欢
    • 2012-07-07
    • 2022-07-07
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2016-04-27
    • 2013-09-20
    相关资源
    最近更新 更多