def make(opts):
    log.info('[+] Extracting structures from pointer values and offsets.')
    ## get the list of pointers values pointing to heap
    ## need cache
    mappings = dump_loader.load(opts.dumpfile, lazy=True)
    values, heap_addrs, aligned, not_aligned = utils.getHeapPointers(
        opts.dumpfile.name, mappings)
    dumpname = opts.dumpfile.name
    # we
    if not os.access(Config.structsCacheDir, os.F_OK):
        os.mkdir(Config.structsCacheDir)
    heap = mappings.getHeap()
    log.info('[+] Reversing %s' % (heap))
    # creates
    t0 = time.time()
    structCache = {}
    signatures = {}
    lastNb = 0
    for anon_struct, structs_addrs in buildAnonymousStructs(
            mappings,
            heap,
            aligned,
            not_aligned,
            heap_addrs,
            structCache,
            reverse=False):  # reverse is way too slow...
        #
        # regexp could be better if crossed against another dump.
        anon_struct.save()
        # save signature
        cacheSignature(signatures, anon_struct)
        #
        nb = len(structs_addrs)
        if nb >= lastNb + 1000:  #time.time() - t0 > 30 :
            td = time.time()
            log.info(
                '\t[-] extracted @%lx, %lx left - %d structs extracted (%d)' %
                (anon_struct.vaddr, heap.end - anon_struct.vaddr,
                 len(structCache), td - t0))
            rewrite(structs_addrs, structCache, dumpname)
            saveSignatures(signatures, structCache, dumpname)
            log.info('\t\t[.] %2.2f secs to rewrite %d structs' %
                     (time.time() - td, len(structs_addrs)))
            t0 = time.time()
            lastNb = nb
        Config.nbAnonymousStruct = nb
        pass
    # final pass
    rewrite(structs_addrs, structCache, dumpname)
    saveSignatures(signatures, structCache)
    ## we have :
    ##  resolved PinnedPointers on all sigs in ppMapper.resolved
    ##  unresolved PP in ppMapper.unresolved

    ## next step
    log.info('Pin resolved PinnedPointers to their respective heap.')
def make(opts):
    log.info('[+] Extracting structures from pointer values and offsets.')
    # get the list of pointers values pointing to heap
    # need cache
    mappings = dump_loader.load(opts.dumpfile, lazy=True)
    values, heap_addrs, aligned, not_aligned = utils.getHeapPointers(
        opts.dumpfile.name, mappings)
    dumpname = opts.dumpfile.name
    # we
    if not os.access(Config.structsCacheDir, os.F_OK):
        os.mkdir(Config.structsCacheDir)
    heap = mappings.get_heap()
    log.info('[+] Reversing %s' % (heap))
    # creates
    t0 = time.time()
    structCache = {}
    signatures = {}
    lastNb = 0
    for anon_struct, structs_addrs in buildAnonymousStructs(mappings, heap, aligned,
                                                            not_aligned, heap_addrs, structCache, reverse=False):  # reverse is way too slow...
        #
        # regexp could be better if crossed against another dump.
        anon_struct.save()
        # save signature
        cacheSignature(signatures, anon_struct)
        #
        nb = len(structs_addrs)
        if nb >= lastNb + 1000:  # time.time() - t0 > 30 :
            td = time.time()
            log.info('\t[-] extracted @%lx, %lx left - %d structs extracted (%d)' % (anon_struct.vaddr,
                                                                                     heap.end - anon_struct.vaddr, len(structCache), td - t0))
            rewrite(structs_addrs, structCache, dumpname)
            saveSignatures(signatures, structCache, dumpname)
            log.info(
                '\t\t[.] %2.2f secs to rewrite %d structs' %
                (time.time() - td, len(structs_addrs)))
            t0 = time.time()
            lastNb = nb
        Config.nbAnonymousStruct = nb
        pass
    # final pass
    rewrite(structs_addrs, structCache, dumpname)
    saveSignatures(signatures, structCache)
    # we have :
    # resolved PinnedPointers on all sigs in ppMapper.resolved
    # unresolved PP in ppMapper.unresolved

    # next step
    log.info('Pin resolved PinnedPointers to their respective heap.')
Exemple #3
0
  def _init2(self):
    # force reload JIT
    self._reversedTypes = dict()
    self._structures = dict()

    log.info('[+] Fetching cached structures addresses list')
    #ptr_values, ptr_offsets, aligned_ptr, not_aligned_ptr = utils.getHeapPointers(self.dumpname, self.mappings)
    heap_offsets, heap_values = utils.getHeapPointers(self.dumpname, self.mappings)
    self._pointers_values = heap_values
    self._pointers_offsets = heap_offsets

    log.info('[+] Fetching cached malloc chunks list')
    # malloc_size is the structures_sizes, 
    # TODO adaptable allocator win32/linux
    self._malloc_addresses, self._malloc_sizes = utils.getAllocations(self.dumpname, self.mappings, self.heap)
    self._structures_addresses = self._malloc_addresses

    return