示例#1
0
    def calculate(self):
        mac_common.set_plugin_members(self)

        procs = mac_pslist.mac_pslist(self._config).calculate()
        proc_maps = {}
        dl_maps = {}
        seen_starts = []

        for task in procs:
            proc_maps[task.obj_offset] = {}
            proc_as = task.get_process_address_space()

            for map in task.get_proc_maps():
                sig = proc_as.read(map.start, 4)

                if sig in ['\xce\xfa\xed\xfe', '\xcf\xfa\xed\xfe']:
                    prot = map.get_perms()

                    if prot in ["rw-", "r--"]:
                        continue

                    fname = map.get_path()

                    proc_maps[task.obj_offset][map.start.v()] = (task, proc_as,
                                                                 fname)

            dl_maps[task.obj_offset] = {}
            for so in task.get_dyld_maps():
                dl_maps[task.obj_offset][so.imageLoadAddress] = (
                    task, proc_as, str(so.imageFilePath))

        for task_offset in dl_maps:
            for vm_start in dl_maps[task_offset]:
                seen_starts.append(vm_start)

                (task, proc_as, vm_name) = dl_maps[task_offset][vm_start]
                yield (task_offset, task, proc_as, vm_start, vm_name,
                       proc_maps, dl_maps)

        for task_offset in proc_maps:
            for vm_start in proc_maps[task_offset]:
                if vm_start in seen_starts:
                    continue

                (task, proc_as, vm_name) = proc_maps[task_offset][vm_start]
                yield (task_offset, task, proc_as, vm_start, vm_name,
                       proc_maps, dl_maps)
示例#2
0
    def calculate(self):
        mac_common.set_plugin_members(self)

        procs = mac_pslist.mac_pslist(self._config).calculate()
        proc_maps = {}
        dl_maps   = {}
        seen_starts = []

        for task in procs:
            proc_maps[task.obj_offset] = {}
            proc_as = task.get_process_address_space()        

            for map in task.get_proc_maps():
                sig = proc_as.read(map.start, 4)
                
                if sig in ['\xce\xfa\xed\xfe', '\xcf\xfa\xed\xfe']:
                    prot = map.get_perms()
 
                    if prot in ["rw-", "r--"]:
                        continue 

                    fname = map.get_path()        
 
                    proc_maps[task.obj_offset][map.start.v()] = (task, proc_as, fname)

            dl_maps[task.obj_offset] = {}
            for so in task.get_dyld_maps():
                dl_maps[task.obj_offset][so.imageLoadAddress] = (task, proc_as, str(so.imageFilePath))
    
        for task_offset in dl_maps:
            for vm_start in dl_maps[task_offset]:
                seen_starts.append(vm_start)

                (task, proc_as, vm_name) = dl_maps[task_offset][vm_start] 
                yield (task_offset, task, proc_as, vm_start, vm_name, proc_maps, dl_maps)

        for task_offset in proc_maps:
            for vm_start in proc_maps[task_offset]:
                if vm_start in seen_starts:
                    continue

                (task, proc_as, vm_name) = proc_maps[task_offset][vm_start]
                yield (task_offset, task, proc_as, vm_start, vm_name, proc_maps, dl_maps)
示例#3
0
 def _get_parent_pointers(self):
     return [p.p_pptr.v() for p in pslist.mac_pslist(self._config).calculate()]
示例#4
0
 def _get_pslist(self):
     return [p.v() for p in pslist.mac_pslist(self._config).calculate()]
示例#5
0
 def _get_parent_pointers(self):
     return [
         p.p_pptr.v() for p in pslist.mac_pslist(self._config).calculate()
     ]
示例#6
0
 def _get_pslist(self):
     return [p.v() for p in pslist.mac_pslist(self._config).calculate()]
示例#7
0
	def check_mac_pslist(self):
		procs = dict((v.obj_offset,(v, v.size())) for v in macpslist.mac_pslist(self._config).calculate())
		return procs
示例#8
0
 def getPidList(self):
     return pslist.mac_pslist(self._config).calculate()
示例#9
0
    def calculate(self):
        mac_common.set_plugin_members(self)
    
        tasks = mac_pslist.mac_pslist(self._config).calculate()


        for task in tasks:
            proc_as = task.get_process_address_space()
            
            # In cases when mm is an invalid pointer 
            if not proc_as:
                continue

            # Do we scan everything or just /bin/bash instances?
            if not (self._config.SCAN_ALL or str(task.p_comm) == "bash"):
                continue

            bit_string = str(task.task.map.pmap.pm_task_map or '')[9:]
            if bit_string.find("64BIT") == -1:
                addr_type       = "unsigned int"
                bucket_contents_type =  "mac32_bucket_contents"
                htable_type     = "mac32_bash_hash_table"
                nbuckets_offset = self.addr_space.profile.get_obj_offset(htable_type, "nbuckets") 
            else:
                addr_type       = "unsigned long long"
                bucket_contents_type =  "mac64_bucket_contents"
                htable_type     = "mac64_bash_hash_table"
                nbuckets_offset = self.addr_space.profile.get_obj_offset(htable_type, "nbuckets") 

            proc_as = task.get_process_address_space()

            for map in task.get_proc_maps():
                if map.get_path() != "":
                    continue

                off = map.start

                while off < map.end:
                    # test the number of buckets
                    dr = proc_as.read(off + nbuckets_offset, 4)
                    if dr == None:
                        new_off = (off & ~0xfff) + 0xfff + 1
                        off = new_off
                        continue

                    test = struct.unpack("<I", dr)[0]
                    if test != 64:
                        off = off + 1
                        continue

                    htable = obj.Object(htable_type, offset = off, vm = proc_as)
                    
                    if htable.is_valid():
                        bucket_array = obj.Object(theType="Array", targetType=addr_type, offset = htable.bucket_array, vm = htable.nbuckets.obj_vm, count = 64)

                        for bucket_ptr in bucket_array:
                            bucket = obj.Object(bucket_contents_type, offset = bucket_ptr, vm = htable.nbuckets.obj_vm)
                            while bucket != None and bucket.times_found > 0:  
                                pdata = bucket.data 

                                if pdata == None:
                                    bucket = bucket.next_bucket()
                                    continue

                                if pdata.is_valid() and (0 <= pdata.flags <= 2):
                                    yield task, bucket

                                bucket = bucket.next_bucket()
                    
                    off = off + 1
示例#10
0
 def getPidList(self):
   return pslist.mac_pslist(self._config).calculate()