fix bugs in dalvik VM

This commit is contained in:
Anthony Desnos 2010-11-08 10:15:59 +01:00
parent 3f137170a6
commit 028404c628
2 changed files with 94 additions and 46 deletions

View File

@ -539,17 +539,17 @@ class AnnotationsDirectoryItem :
self.__CM.add_offset( buff.get_idx(), self )
self.format = SVs( ANNOTATIONS_DIRECTORY_ITEM[0], ANNOTATIONS_DIRECTORY_ITEM[1], buff.read( calcsize(ANNOTATIONS_DIRECTORY_ITEM[0]) ) )
self.__field_annotations = []
self.field_annotations = []
for i in range(0, self.format.get_value().fields_size) :
self.__field_annotations.append( FieldAnnotation( buff, cm ) )
self.field_annotations.append( FieldAnnotation( buff, cm ) )
self.__method_annotations = []
self.method_annotations = []
for i in range(0, self.format.get_value().annotated_methods_size) :
self.__method_annotations.append( MethodAnnotation( buff, cm ) )
self.method_annotations.append( MethodAnnotation( buff, cm ) )
self.__parameter_annotations = []
self.parameter_annotations = []
for i in range(0, self.format.get_value().annotated_parameters_size) :
self.__parameter_annotations.append( ParameterAnnotation( buff, cm ) )
self.parameter_annotations.append( ParameterAnnotation( buff, cm ) )
def reload(self) :
pass
@ -558,15 +558,15 @@ class AnnotationsDirectoryItem :
print self.format.get_value()
def get_obj(self) :
return [ i.get_obj() for i in self.__field_annotations ] + \
[ i.get_obj() for i in self.__method_annotations ] + \
[ i.get_obj() for i in self.__parameter_annotations ]
return [ i for i in self.field_annotations ] + \
[ i for i in self.method_annotations ] + \
[ i for i in self.parameter_annotations ]
def get_raw(self) :
return [ bytecode.Buff( self.__CM.get_offset(self), self.format.get_value_buff() ) ] + \
[ i.get_raw() for i in self.__field_annotations ] + \
[ i.get_raw() for i in self.__method_annotations ] + \
[ i.get_raw() for i in self.__parameter_annotations ]
[ i.get_raw() for i in self.field_annotations ] + \
[ i.get_raw() for i in self.method_annotations ] + \
[ i.get_raw() for i in self.parameter_annotations ]
def get_off(self) :
return self.__CM.get_offset( self )
@ -613,7 +613,7 @@ class TypeList :
nb = nb + 1
def get_obj(self) :
return [ i.get_obj() for i in self.__list ]
return [ i for i in self.__list ]
def get_raw(self) :
return [ bytecode.Buff( self.__CM.get_offset(self), self.pad + self.size.get_value_buff() ) ] + [ i.get_raw() for i in self.__list ]
@ -839,9 +839,9 @@ class EncodedValue :
print "ENCODED_VALUE", self.val, self.__value_arg, self.__value_type, self.value
def get_obj(self) :
if isinstance(self.__value, str) == False :
if isinstance(self.value, str) == False :
return [ self.value ]
return [ ]
return []
def get_raw(self) :
if isinstance(self.value, str) :
@ -1065,7 +1065,7 @@ class TypeIdItem :
i.show()
nb = nb + 1
def get_ob(self) :
def get_obj(self) :
return [ i for i in self.type ]
def get_raw(self) :
@ -1129,7 +1129,7 @@ class ProtoIdItem :
i.show()
nb = nb + 1
def get_ob(self) :
def get_obj(self) :
return [ i for i in self.proto ]
def get_raw(self) :
@ -1538,50 +1538,61 @@ class ClassDefItem :
class EncodedTypeAddrPair :
def __init__(self, buff) :
self.__type_idx = readuleb128( buff )
self.__addr = readuleb128( buff )
self.type_idx = readuleb128( buff )
self.addr = readuleb128( buff )
def get_obj(self) :
return []
def get_raw(self) :
return writeuleb128( self.__type_idx ) + writeuleb128( self.__addr )
return writeuleb128( self.type_idx ) + writeuleb128( self.addr )
class EncodedCatchHandler :
def __init__(self, buff) :
self.__size = readsleb128( buff )
self.size = readsleb128( buff )
self.__handlers = []
self.handlers = []
for i in range(0, abs(self.__size)) :
self.__handlers.append( EncodedTypeAddrPair(buff) )
for i in range(0, abs(self.size)) :
self.handlers.append( EncodedTypeAddrPair(buff) )
if self.__size <= 0 :
self.__catch_all_addr = readuleb128( buff )
if self.size <= 0 :
self.catch_all_addr = readuleb128( buff )
def show(self) :
bytecode._Print("ENCODED_CATCH_HANDLER SIZE", self.__size)
bytecode._Print("ENCODED_CATCH_HANDLER", self.size)
for i in self.handlers :
i.show()
def get_obj(self) :
return [ i for i in self.handlers ]
def get_raw(self) :
buff = writesleb128( self.__size ) + ''.join(i.get_raw() for i in self.__handlers)
buff = writesleb128( self.size ) + ''.join(i.get_raw() for i in self.handlers)
if self.__size <= 0 :
buff += writeuleb128( self.__catch_all_addr )
if self.size <= 0 :
buff += writeuleb128( self.catch_all_addr )
return buff
class EncodedCatchHandlerList :
def __init__(self, buff) :
self.__size = readuleb128( buff )
self.__list = []
self.size = readuleb128( buff )
self.list = []
for i in range(0, self.__size) :
self.__list.append( EncodedCatchHandler(buff) )
for i in range(0, self.size) :
self.list.append( EncodedCatchHandler(buff) )
def show(self) :
bytecode._Print("ENCODED_CATCH_HANDLER_LIST SIZE", self.__size)
for i in self.__list :
bytecode._Print("ENCODED_CATCH_HANDLER_LIST SIZE", self.size)
for i in self.list :
i.show()
def get_obj(self) :
return [ i for i in self.list ]
def get_raw(self) :
return writeuleb128( self.__size ) + ''.join(i.get_raw() for i in self.__list)
return writeuleb128( self.size ) + ''.join(i.get_raw() for i in self.list)
class DalvikCode :
def __init__(self, buff, cm) :
@ -1778,6 +1789,9 @@ class DalvikCode :
return "%s%x{%s}" % (c, v, self.__CM.get_type(v))
return "%s%x" % (c, v)
def get_obj(self) :
return [ i for i in self.__handlers ]
def get_raw(self) :
buff = self.registers_size.get_value_buff() + \
self.ins_size.get_value_buff() + \
@ -1918,6 +1932,15 @@ class MapItem :
else :
self.item.show()
def get_obj(self) :
if self.item == None :
return []
if isinstance( self.item, list ) :
return [ i for i in self.item ]
return [ self.item ]
def get_raw(self) :
if self.item == None :
return [ bytecode.Buff( self.__CM.get_offset(self), self.format.get_value_buff() ) ]
@ -2068,8 +2091,16 @@ class DalvikVMFormat(bytecode._Bytecode) :
yield e
else:
yield root
def _Exp(self, x) :
l = []
for i in x :
l.append(i)
l.append( self._Exp( i.get_obj() ) )
return l
def _get_raw(self) :
# print len( list(self._iterFlatten( self._Exp( self.map_list.get_obj() ) ) ) )
# Due to the specific format of dalvik virtual machine,
# we will get a list of raw object described by a buffer, a size and an offset
# where to insert the specific buffer into the file

View File

@ -8,6 +8,7 @@ sys.path.append(PATH_INSTALL + "./")
import androguard
def hexdump(src, length=8, off=0):
result = []
digits = 4 if isinstance(src, unicode) else 2
@ -18,10 +19,24 @@ def hexdump(src, length=8, off=0):
result.append( b"%04X %-*s %s" % (i+off, length*(digits + 1), hexa, text) )
return b'\n'.join(result)
TEST_TYPE = 0
TYPE_JVM = 1
TYPE_DVM = 2
if len(sys.argv) == 1 :
TEST_TYPE = TYPE_JVM + TYPE_DVM
elif len(sys.argv) == 2 :
if sys.argv[1] == "JVM" :
TEST_TYPE = TYPE_JVM
elif sys.argv[1] == "DVM" :
TEST_TYPE = TYPE_DVM
TEST = []
### JAVA TEST ###
BASE_TEST = "./examples/java/Demo1/orig/"
BASE_MAIN_TEST = "./examples/java/Demo1/orig_main/"
TEST = [ './examples/java/test/orig/Test1.class' ]
FILES = [
("BaseCipher.class", 0),
("DES.class", 0),
@ -36,20 +51,22 @@ FILES = [
("Demo1Main.class", 1)
]
for i in FILES :
if i[1] == 0 :
TEST.append( BASE_TEST + i[0] )
if TEST_TYPE & TYPE_JVM :
for i in FILES :
if i[1] == 0 :
TEST.append( BASE_TEST + i[0] )
else :
TEST.append( BASE_MAIN_TEST + i[0] )
TEST.append( BASE_MAIN_TEST + i[0] )
### DALVIK TEST ###
FILES = [
# "examples/android/Demo1/bin/classes.dex",
"examples/android/Demo1/bin/classes.dex",
"examples/dalvik/test/bin/classes.dex"
]
for i in FILES :
TEST.append( i )
if TEST_TYPE & TYPE_DVM :
for i in FILES :
TEST.append( i )
### ALL ###