def test_findPattern_recursive_2(self): sig = '''P4i4i4u9z8i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4T5I4P4i4T5I4P4i4I4I4P4i4T5'''\ '''I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4'''\ '''I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4I4I4P4i4T5I4P4I4i4''' sig_res = 'P4 (i4){2} u9z8i4 (I4I4P4i4){7} (T5I4P4i4){2} (I4){2} P4i4T5I4P4i4 (I4I4P4i4){17} T5I4P4I4i4' self.assertEquals(pattern.findPatternText(sig, 2), sig_res)
def test_findPattern_recursive_3(self): sig = '''I4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4z12''' sig_res = 'I4 (i4){31} z12' # print pattern.findPatternText( sig,2) # self.assertRaises ( ValueError, pattern.findPatternText , sig,2) # # why ? self.assertEquals(pattern.findPatternText(sig, 2), sig_res)
def test_findPattern_recursive_1(self): sig = '''P4I4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z'''\ '''4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u4z4P4I4u172z4I4T'''\ '''8z4I4z4I4T8z4I4z4I4T8z4I4z4I4T8z4I4z4u4z26336''' sig_res = 'P4 (I4){2} (u4z4P4I4){21} u172z4 (I4T8z4I4z4){4} u4z26336' self.assertEquals(pattern.findPatternText(sig, 2), sig_res)
def reverse_record(self, _context, _record): if not _record.resolvedPointers: raise ValueError('I should be resolved') _record._dirty = True _record._fields.sort() myfields = [] signature = _record.get_type_signature() pencoder = pattern.PatternEncoder(signature, minGroupSize=2) patterns = pencoder.makePattern() txt = _record.get_type_signature(text=True) p = pattern.findPatternText(txt, 1, 2) log.debug('substruct typeSig: %s' % txt) log.debug('substruct findPatterntext: %s' % p) log.debug('substruct came up with pattern %s' % patterns) # pattern is made on FieldType, # so we need to dequeue _record.fields at the same time to enqueue in # myfields for nb, fieldTypes in patterns: if nb == 1: field = _record._fields.pop(0) myfields.append(field) # single el # log.debug('simple field:%s '%(field) ) elif len(fieldTypes) > 1: # array of subtructure DEBUG XXX TODO log.debug('fieldTypes:%s' % fieldTypes) log.debug('substructure with sig %s', ''.join([ft.sig[0] for ft in fieldTypes])) myelements = [] for i in range(nb): fields = [ _record._fields.pop(0) for i in range(len(fieldTypes)) ] # nb-1 left # otherFields = [ _record.fields.pop(0) for i in range((nb-1)*len(fieldTypesAndSizes)) ] # need global ref to compare substructure signature to # other anonstructure firstField = fieldtypes.RecordField( _record, fields[0].offset, 'unk', 'typename', fields) myelements.append(firstField) array = fieldtypes.ArrayField(myelements) myfields.append(array) # log.debug('array of structure %s'%(array)) # make array of elements obase on same base type elif len(fieldTypes) == 1: log.debug('found array of %s', _record._fields[0].typename.basename) fields = [_record._fields.pop(0) for i in range(nb)] array = fieldtypes.ArrayField(fields) myfields.append(array) # log.debug('array of elements %s'%(array)) else: # TODO DEBUG internal struct raise ValueError('fields patterns len is incorrect %d' % (len(fieldTypes))) log.debug('done with findSubstructure') _record._fields = myfields # print 'final', _record.fields return
def reverse_record(self, _context, _record): if not _record.resolvedPointers: raise ValueError('I should be resolved') _record._dirty = True _record._fields.sort() myfields = [] signature = _record.get_type_signature() pencoder = pattern.PatternEncoder(signature, minGroupSize=2) patterns = pencoder.makePattern() txt = _record.get_type_signature(text=True) p = pattern.findPatternText(txt, 1, 2) log.debug('substruct typeSig: %s' % txt) log.debug('substruct findPatterntext: %s' % p) log.debug('substruct came up with pattern %s' % patterns) # pattern is made on FieldType, # so we need to dequeue _record.fields at the same time to enqueue in # myfields for nb, fieldTypes in patterns: if nb == 1: field = _record._fields.pop(0) myfields.append(field) # single el # log.debug('simple field:%s '%(field) ) elif len(fieldTypes) > 1: # array of subtructure DEBUG XXX TODO log.debug('fieldTypes:%s' % fieldTypes) log.debug('substructure with sig %s', ''.join([ft.sig[0] for ft in fieldTypes])) myelements = [] for i in range(nb): fields = [_record._fields.pop(0) for i in range(len(fieldTypes))] # nb-1 left # otherFields = [ _record.fields.pop(0) for i in range((nb-1)*len(fieldTypesAndSizes)) ] # need global ref to compare substructure signature to # other anonstructure firstField = fieldtypes.RecordField(_record, fields[0].offset, 'unk', 'typename', fields) myelements.append(firstField) array = fieldtypes.ArrayField(myelements) myfields.append(array) # log.debug('array of structure %s'%(array)) # make array of elements obase on same base type elif len(fieldTypes) == 1: log.debug('found array of %s', _record._fields[0].typename.basename) fields = [_record._fields.pop(0) for i in range(nb)] array = fieldtypes.ArrayField(fields) myfields.append(array) # log.debug('array of elements %s'%(array)) else: # TODO DEBUG internal struct raise ValueError( 'fields patterns len is incorrect %d' % (len(fieldTypes))) log.debug('done with findSubstructure') _record._fields = myfields # print 'final', _record.fields return
def test_findPattern_recursive_7(self): sig = '''aaaaa1111bbbccda2a2a2a2a2b1cb1cb1cb1cabcdabcdabcdabcdpooiiiuuuuyyyyy''' sig_res = ' (a){5} (1){4} (b){3} ccd (a2){5} (b1c){4} (abcd){4} poo (i){3} (u){4} (y){5} ' self.assertEquals(pattern.findPatternText(sig, 1, 3), sig_res)
def test_findPattern_recursive_5(self): sig = '''AAABABABABBAAABBBBABACBCBCBCBABCBABABC''' sig_res = ' (A){2} (AB){4} B (A){3} (B){3} (BA){2} (CB){3} (CBAB){2} ABC' self.assertEquals(pattern.findPatternText(sig, 1), sig_res)
def test_findPattern_recursive_4(self): sig = '''123321444567444567444567444567111123''' sig_res = '123321 (444567){4} 111123' self.assertEquals(pattern.findPatternText(sig, 3), sig_res)
def test_findPattern_recursive_8b(self): sig = '''I4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4z1''' sig_res = 'I4 (i4){31} z1' self.assertEquals(pattern.findPatternText(sig, 2, 4), sig_res)
def test_findPattern_recursive_9(self): sig = '''aaaaa1111bbbccda2a2a2a2a2b1cb1cb1cb1cabcdabcdabcdabcdpooiiiuuuuyyyyy''' sig_res = ' (a){5} 1111bbbccd (a2){5} b1cb1cb1cb1cabcdabcdabcdabcdpooiiiuuuu (y){5} ' self.assertEquals(pattern.findPatternText(sig, 1, 5), sig_res)