Module bytecode
[hide private]
[frames] | no frames]

Source Code for Module bytecode

  1  # This file is part of Androguard. 
  2  # 
  3  # Copyright (C) 2010, Anthony Desnos <desnos at t0t0.org> 
  4  # All rights reserved. 
  5  # 
  6  # Androguard is free software: you can redistribute it and/or modify 
  7  # it under the terms of the GNU Lesser General Public License as published by 
  8  # the Free Software Foundation, either version 3 of the License, or 
  9  # (at your option) any later version. 
 10  # 
 11  # Androguard is distributed in the hope that it will be useful, 
 12  # but WITHOUT ANY WARRANTY; without even the implied warranty of   
 13  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 14  # GNU Lesser General Public License for more details. 
 15  # 
 16  # You should have received a copy of the GNU Lesser General Public License 
 17  # along with Androguard.  If not, see <http://www.gnu.org/licenses/>. 
 18   
 19  from struct import unpack, pack 
 20   
 21  SHOW = 0 
 22   
 23  # Handle exit message 
24 -def Exit( msg ):
25 print "Error : ", msg 26 raise("ooops")
27 28 # Print arg into a correct format
29 -def _Print(name, arg) :
30 buff = name + " " 31 32 if type(arg).__name__ == 'int' : 33 buff += "0x%x" % arg 34 elif type(arg).__name__ == 'long' : 35 buff += "0x%x" % arg 36 elif type(arg).__name__ == 'str' : 37 buff += "%s" % arg 38 elif isinstance(arg, SV) : 39 buff += "0x%x" % arg.get_value() 40 elif isinstance(arg, SVs) : 41 buff += arg.get_value().__str__() 42 43 print buff
44
45 -class SV :
46 """SV is used to handle more easily a value"""
47 - def __init__(self, size, buff) :
48 self.__size = size 49 self.__value = unpack(self.__size, buff)[0]
50
51 - def _get(self) :
52 return pack(self.__size, self.__value)
53
54 - def __str__(self) :
55 return "0x%x" % self.__value
56
57 - def __int__(self) :
58 return self.__value
59
60 - def get_value_buff(self) :
61 return self._get()
62
63 - def get_value(self) :
64 return self.__value
65
66 - def set_value(self, attr) :
67 self.__value = attr
68
69 -class SVs :
70 """SVs is used to handle more easily a structure of different values"""
71 - def __init__(self, size, ntuple, buff) :
72 self.__size = size 73 74 self.__value = ntuple._make( unpack( self.__size, buff ) )
75
76 - def _get(self) :
77 l = [] 78 for i in self.__value._fields : 79 l.append( getattr( self.__value, i ) ) 80 81 return pack( self.__size, *l)
82
83 - def _export(self) :
84 return [ x for x in self.__value._fields ]
85
86 - def get_value_buff(self) :
87 return self._get()
88
89 - def get_value(self) :
90 return self.__value
91
92 - def set_value(self, attr) :
93 self.__value = self.__value._replace( **attr )
94
95 - def __str__(self) :
96 return self.__value.__str__()
97
98 -class MethodBC(object) :
99 - def show(self, value) :
100 getattr(self, "show_" + value)()
101
102 -class BuffHandle :
103 - def __init__(self, buff) :
104 self.__buff = buff 105 self.__idx = 0
106
107 - def read_b(self, size) :
108 return self.__buff[ self.__idx : self.__idx + size ]
109
110 - def read(self, size) :
111 if isinstance(size, SV) : 112 size = size.value 113 114 buff = self.__buff[ self.__idx : self.__idx + size ] 115 self.__idx += size 116 117 return buff
118
119 -class Buff :
120 - def __init__(self, offset, buff) :
121 self.offset = offset 122 self.buff = buff 123 124 self.size = len(buff)
125
126 -class _Bytecode(object) :
127 - def __init__(self, buff) :
128 self.__buff = buff 129 130 self.__registers = { SHOW : [] } 131 self.__idx = 0
132
133 - def read(self, size) :
134 if isinstance(size, SV) : 135 size = size.value 136 137 buff = self.__buff[ self.__idx : self.__idx + size ] 138 self.__idx += size 139 140 return buff
141
142 - def readat(self, off) :
143 if isinstance(off, SV) : 144 off = off.value 145 146 return self.__buff[ off : ]
147
148 - def read_b(self, size) :
149 return self.__buff[ self.__idx : self.__idx + size ]
150
151 - def set_idx(self, idx) :
152 if isinstance(idx, SV) : 153 self.__idx = idx.value 154 else : 155 self.__idx = idx
156
157 - def get_idx(self) :
158 return self.__idx
159
160 - def add_idx(self, idx) :
161 self.__idx += idx
162
163 - def register(self, type_register, fct) :
164 self.__registers[ type_register ].append( fct )
165
166 - def get_buff(self) :
167 return self.__buff
168
169 - def length_buff(self) :
170 return len( self.__buff )
171 172
173 - def show(self) :
174 print self 175 for i in self.__registers[ SHOW ] : 176 i()
177
178 - def save(self, filename) :
179 fd = open(filename, "w") 180 buff = self._save() 181 fd.write( buff ) 182 fd.close()
183