Exemple #1
0
    def open(filename):
        try:
            cached = localcache[filename]
            return cached
        except:
            lex = Container.identify(filename)
            resolver = data_store.MemoryDataStore(lex)
            with zip.ZipFile.NewZipFile(resolver, filename) as zip_file:
                if lex == lexicon.standard:
                    image = resolver.QueryPredicateObject(
                        lexicon.AFF4_TYPE, lex.Image).next()

                    datastreams = list(
                        resolver.QuerySubjectPredicate(image, lex.dataStream))

                    for stream in datastreams:
                        if lex.map in resolver.QuerySubjectPredicate(
                                stream, lexicon.AFF4_TYPE):
                            res = resolver.AFF4FactoryOpen(stream)
                            localcache[filename] = res
                            res.parent = aff4.Image(resolver, urn=image)
                            return res

                elif lex == lexicon.scudette:
                    m = resolver.QueryPredicateObject(lexicon.AFF4_TYPE,
                                                      lex.map).next()
                    cat = resolver.QuerySubjectPredicate(m,
                                                         lex.category).next()
                    if cat == lex.memoryPhysical:
                        res = resolver.AFF4FactoryOpen(m)
                        localcache[filename] = res
                        res.parent = aff4.Image(resolver, urn=m)

                        legacyYamlInfoURI = res.urn.Append("information.yaml")
                        with resolver.AFF4FactoryOpen(legacyYamlInfoURI) as fd:
                            txt = fd.read(10000000)
                            dt = yaml.safe_load(txt)
                            print txt
                            try:
                                CR3 = dt["Registers"]["CR3"]
                                resolver.Add(
                                    res.parent.urn, lexicon.standard.
                                    memoryPageTableEntryOffset,
                                    rdfvalue.XSDInteger(CR3))
                                kaslr_slide = dt["kaslr_slide"]
                                resolver.Add(res.parent.urn,
                                             lexicon.standard.OSXKALSRSlide,
                                             rdfvalue.XSDInteger(kaslr_slide))

                            except:
                                pass
                        return res
Exemple #2
0
    def new(urn):
        lex = lexicon.standard
        resolver = data_store.MemoryDataStore(lex)
        with zip.ZipFile.NewZipFile(resolver, urn) as zip_file:
            volumeURN = zip_file.urn
            imageURN = next(resolver.QueryPredicateObject(lexicon.AFF4_TYPE, lex.Image))

            datastreams = list(resolver.QuerySubjectPredicate(imageURN, lex.dataStream))
            with resolver.AFF4FactoryOpen(zip_file.backing_store_urn) as backing_store:
                for stream in datastreams:
                    if lex.map in resolver.QuerySubjectPredicate(stream, lexicon.AFF4_TYPE):
                        dataStream = resolver.AFF4FactoryOpen(stream)
                        image = aff4.Image(resolver, urn=imageURN)
                        dataStream.parent = image

                        return PhysicalImageContainer(backing_store, zip_file, volumeURN, zip_file, resolver, lex, image, dataStream)
Exemple #3
0
    def openURNtoContainer(urn, mode=None):
            if data_store.HAS_HDT:
                resolver = data_store.HDTAssistedDataStore(lexicon.standard)
            else:
                resolver = data_store.MemoryDataStore(lexicon.standard)

            (version, lex) = Container.identifyURN(urn, resolver=resolver)

            resolver.lexicon = lex
            if mode != None and mode == "+":
                resolver.Set(lexicon.transient_graph, urn, lexicon.AFF4_STREAM_WRITE_MODE,
                             rdfvalue.XSDString("random"))

            with zip.ZipFile.NewZipFile(resolver, version, urn) as zip_file:
                with resolver.AFF4FactoryOpen(zip_file.backing_store_urn) as backing_store:
                    volumeURN = zip_file.urn
                    if lex == lexicon.standard or lex == lexicon.standard11:

                        images = list(resolver.QueryPredicateObject(volumeURN, lexicon.AFF4_TYPE, lex.Image))
                        if len(images) > 0:
                            imageURN = images[0]

                            datastreams = list(resolver.QuerySubjectPredicate(volumeURN, imageURN, lex.dataStream))

                            if len(datastreams) > 0:
                                # it is a disk image or a memory image

                                for stream in datastreams:
                                    if lex.map in resolver.QuerySubjectPredicate(volumeURN, stream, lexicon.AFF4_TYPE):
                                        dataStream = resolver.AFF4FactoryOpen(stream)
                                        image = aff4.Image(resolver, urn=imageURN)
                                        dataStream.parent = image

                                        return PhysicalImageContainer(backing_store, zip_file, version, volumeURN, resolver, lex, image, dataStream)

                            else:
                                # it is a logical image
                                if version.is11():
                                    # AFF4 logical images are defined at version 1.1
                                    if mode != None and mode == "+":
                                        return WritableHashBasedImageContainer(backing_store, zip_file, version, volumeURN, resolver, lex)
                                    else:
                                        return LogicalImageContainer(backing_store, zip_file, version, volumeURN, resolver, lex)
                                else:
                                    # scudette's winpmem pre-std implementation is at 1.0
                                    lex = lexicon.pmemlogical
                                    return PreStdLogicalImageContainer(backing_store, zip_file, version, volumeURN, resolver, lex)

                        else:
                            # no images
                            encryptedStreams = list(resolver.QueryPredicateObject(volumeURN, lexicon.AFF4_TYPE, lexicon.standard11.EncryptedStream))
                            if len(encryptedStreams) == 1:
                                encryptedBlockStreamARN = encryptedStreams[0]
                                return EncryptedImageContainer(backing_store, zip_file, version, volumeURN, resolver, lexicon.standard11, encryptedBlockStreamARN, mode)
                            else:
                                return LogicalImageContainer(backing_store, zip_file, version, volumeURN, resolver, lex)


                    elif lex == lexicon.scudette:
                        m = next(resolver.QueryPredicateObject(volumeURN, lexicon.AFF4_TYPE, lex.map))
                        cat = next(resolver.QuerySubjectPredicate(volumeURN, m, lex.category))
                        if cat == lex.memoryPhysical:
                            dataStream = resolver.AFF4FactoryOpen(m)

                            image = aff4.Image(resolver, urn=m)
                            dataStream.parent = image

                            legacyYamlInfoURI = dataStream.urn.Append("information.yaml")
                            try:
                                with resolver.AFF4FactoryOpen(legacyYamlInfoURI) as fd:
                                    txt = fd.read(10000000)
                                    dt = yaml.safe_load(txt)
                                    CR3 = dt["Registers"]["CR3"]
                                    resolver.Add(dataStream.parent.urn, lexicon.standard.memoryPageTableEntryOffset, rdfvalue.XSDInteger(CR3))
                                    kaslr_slide = dt["kaslr_slide"]
                                    resolver.Add(dataStream.parent.urn, lexicon.standard.OSXKALSRSlide, rdfvalue.XSDInteger(kaslr_slide))
                            except:
                                pass

                            return PhysicalImageContainer(backing_store, zip_file, version, volumeURN, resolver, lex, image, dataStream)