module ZSteg::Checker::WBStego

Constants

ENCRYPTIONS

Public Class Methods

calc_avail_size(image) click to toggle source

from wbStego4open sources

# File lib/zsteg/checker/wbstego.rb, line 69
        def calc_avail_size image
         space = 0
         biHeader = image.hdr
         if biHeader.biCompression == 0
           case biHeader.biBitCount
           when 4
             space = 2*image.imagedata_size if used_colors < 9
           when 8
             space = image.imagedata_size if used_colors < 129
           when 24
             space = image.imagedata_size
           end
         else
           raise "TODO"
#           if biHeader.biBitCount=4 then begin
#             if UsedColors<9 then space:=GetAvailSizeRLE else space:=0;
#           end;
#           if biHeader.biBitCount=8 then begin
#             if UsedColors<129 then space:=GetAvailSizeRLE else space:=0;
#           end;
         end
         space/8
        end
check(data, params = {}) click to toggle source
# File lib/zsteg/checker/wbstego.rb, line 93
        def check data, params = {}
          return if data.size < 4
          return if params[:bit_order] != :lsb

          force_color = nil

          if params[:image].format == :bmp
            return if params[:order] !~ /b/i
          else
            # PNG
            return if Array(params[:channels]).join != 'bgr'
            force_color = :gray if params[:order] != 'xY'
          end

          size1 = (data[0,3] + "\x00").unpack('V')[0]
          avail_size =
            if params[:image].format == :bmp
              calc_avail_size(params[:image])
            else
              params[:max_hidden_size]
            end
          return if size1 == 0 || size1 > avail_size

          # check if too many zeroes, prevent false positive
          nzeroes = data[3..-1].count("\x00")
          return if nzeroes > 10 && data.size-3-nzeroes < 4

          result = nil

          size2 = (data[3,3] + "\x00").unpack('V')[0]
#          p [size1, size2, avail_size]
          if size2 < avail_size && size2 > 0
            spacing = 1.0*avail_size/(size2+5) - 1
#            puts "[d] spacing=#{spacing}"
            if spacing > 0
              error = 0
              r = ''
              6.upto(data.size-1) do |idx|
                if error < 1
                  r << data[idx]
                  error += spacing
                else
                  error -= 1
                end
              end
              if r.size > 4
                ext = r[0,3]
                result = Result.new(size2, ext, r[3..-1], true)
              end
            end
          end
          # no even distribution
          #return unless valid_ext?(data[3,3])
          result ||= Result.read(data)
          result.color = force_color if result && force_color
          result

        rescue
          STDERR.puts "[!] wbStego: #{$!.inspect}".red
        end
used_colors() click to toggle source
# File lib/zsteg/checker/wbstego.rb, line 64
def used_colors
  raise "TODO"
end