Beispiel #1
0
    def _locate_heap(self, task, vad):
        """Locate the correct heap by scanning for its reference.

        Find the references into the heap from the dnsrslvr.dll vad. This will
        normally be stored in dnsrslvr.dll's global variable called g_CacheHeap.
        """
        scanner = scan.PointerScanner(
            pointers=task.Peb.ProcessHeaps,
            session=self.session,
            address_space=self.session.GetParameter("default_address_space"))

        seen = set()
        for hit in scanner.scan(vad.Start, maxlen=vad.Length):
            heap = self.heap_profile.Pointer(
                hit, target="_HEAP"
            ).deref()


            if heap in seen:
                continue

            seen.add(heap)

            for entry in heap.Entries:
                hash_table = self._verify_hash_table(entry.Allocation, heap)
                if hash_table:
                    return hash_table
    def initialize(self, task=None):
        if self.initialized:
            return self.initialized

        # if no task is given, we expect the process context to be switched
        # already.
        if task:
            self.task = task
            self.task_as = self.task.get_process_address_space()

        else:
            self.task = self.session.GetParameter("process_context")
            self.task_as = self.task.get_process_address_space()

        self.psize = self.profile.get_obj_size("Pointer")

        all_mods = list(self.task.get_load_modules())
        if not all_mods:
            # PEB is paged or no DLLs loaded
            self.session.logging.error(
                "Cannot load DLLs in process AS of process {:d}".format(
                    self.task.pid.v()))
            return False

        self.exported_apis = self._enum_apis(all_mods)
        func_addresses = [x[1].v() for x in list(self.exported_apis.values())]
        func_addresses = set(func_addresses)
        if 0 in func_addresses:
            func_addresses.remove(0)

        self.scanner = scan.PointerScanner(profile=self.profile,
                                           session=self.session,
                                           address_space=self.task_as,
                                           pointers=func_addresses)
        self.initialized = True

        return self.initialized