Miasm2
 All Classes Namespaces Files Functions Variables Typedefs Properties Macros
bin_stream.py
Go to the documentation of this file.
1 #
2 # Copyright (C) 2011 EADS France, Fabrice Desclaux <fabrice.desclaux@eads.net>
3 #
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License along
15 # with this program; if not, write to the Free Software Foundation, Inc.,
16 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 #
18 
19 
21 
22  def __init__(self, *args, **kargs):
23  pass
24 
25  def __repr__(self):
26  return "<%s !!>" % self.__class__.__name__
27 
28  def hexdump(self, offset, l):
29  return
30 
31  def getbytes(self, start, l=1):
32  return self.bin[start:start + l]
33 
34  def getbits(self, start, n):
35  """Return the bits from the bit stream
36  @start: the offset in bits
37  @n: number of bits to read
38  """
39  if not n:
40  return 0
41  o = 0
42  if n > self.getlen() * 8:
43  raise IOError('not enough bits %r %r' % (n, len(self.bin) * 8))
44  while n:
45  # print 'xxx', n, start
46  i = start / 8
47  c = self.getbytes(i)
48  if not c:
49  raise IOError('cannot get bytes')
50  c = ord(c)
51  # print 'o', hex(c)
52  r = 8 - start % 8
53  c &= (1 << r) - 1
54  # print 'm', hex(c)
55  l = min(r, n)
56  # print 'd', r-l
57  c >>= (r - l)
58  o <<= l
59  o |= c
60  n -= l
61  start += l
62  return o
63 
64 
66 
67  def __init__(self, input_str="", offset=0L, shift=0):
68  bin_stream.__init__(self)
69  self.bin = input_str
70  self.offset = offset
71  self.shift = shift
72  self.l = len(input_str)
73 
74  def getbytes(self, start, l=1):
75  if start + l + self.shift > self.l:
76  raise IOError("not enough bytes in str")
77 
78  return super(bin_stream_str, self).getbytes(start + self.shift, l)
79 
80  def readbs(self, l=1):
81  if self.offset + l + self.shift > self.l:
82  raise IOError("not enough bytes in str")
83  self.offset += l
84  return self.bin[self.offset - l + self.shift:self.offset + self.shift]
85 
86  def __str__(self):
87  out = self.bin[self.offset + self.shift:]
88  return out
89 
90  def setoffset(self, val):
91  self.offset = val
92 
93  def getlen(self):
94  return self.l - (self.offset + self.shift)
95 
96 
98 
99  def __init__(self, binary, offset=0L, shift=0):
100  bin_stream.__init__(self)
101  self.bin = binary
102  self.bin.seek(0, 2)
103  self.shift = shift
104  self.l = self.bin.tell()
105  self.offset = offset
106 
107  def getoffset(self):
108  return self.bin.tell() - self.shift
109 
110  def setoffset(self, val):
111  self.bin.seek(val + self.shift)
112  offset = property(getoffset, setoffset)
113 
114  def readbs(self, l=1):
115  if self.offset + l + self.shift > self.l:
116  raise IOError("not enough bytes in file")
117  return self.bin.read(l)
118 
119  def __str__(self):
120  return str(self.bin)
121 
122  def getlen(self):
123  return self.l - (self.offset + self.shift)
124 
125 
126 
128 
129  def __init__(self, virt_view, offset=0L):
130  bin_stream.__init__(self)
131  self.bin = virt_view
132  self.l = virt_view.max_addr()
133  self.offset = offset
134 
135  def is_addr_in(self, ad):
136  return self.bin.is_addr_in(ad)
137 
138  def getlen(self):
139  return self.l
140 
141  def readbs(self, l=1):
142  if self.offset + l > self.l:
143  raise IOError("not enough bytes")
144  self.offset += l
145  return self.bin(self.offset - l, self.offset)
146 
147  def getbytes(self, start, l=1):
148  return self.bin(start, start + l)
149 
150  def __str__(self):
151  out = self.bin(self.offset, self.l)
152  return out
153 
154  def setoffset(self, val):
155  self.offset = val
156 
157 
159  pass
160 
161 
162 class bin_stream_elf(bin_stream_container):
163  pass
164 
165 
167 
168  def __init__(self, vm, offset=0L, base_offset=0L):
169  self.offset = offset
170  self.base_offset = base_offset
171  self.vm = vm
172 
173  def getlen(self):
174  return 0xFFFFFFFFFFFFFFFF
175 
176  def getbytes(self, start, l=1):
177  try:
178  s = self.vm.get_mem(start + self.base_offset, l)
179  except:
180  raise IOError('cannot get mem ad', hex(start))
181  return s
182 
183  def readbs(self, l=1):
184  try:
185  s = self.vm.get_mem(self.offset + self.base_offset, l)
186  except:
187  raise IOError('cannot get mem ad', hex(self.offset))
188  self.offset += l
189  return s
190 
191  def setoffset(self, val):
192  self.offset = val