示例#1
0
    def _ScanProcess(self, process, scan_request, scan_response):
        rdf_process = rdf_client.Process.FromPsutilProcess(process)

        start_time = rdfvalue.RDFDatetime.Now()
        try:
            matches = self._GetMatches(process, scan_request)
            scan_time = rdfvalue.RDFDatetime.Now() - start_time
            scan_time_us = scan_time.ToInt(rdfvalue.MICROSECONDS)
        except YaraTimeoutError:
            scan_response.errors.Append(
                rdf_memory.ProcessMemoryError(
                    process=rdf_process,
                    error="Scanning timed out (%s)." %
                    (rdfvalue.RDFDatetime.Now() - start_time)))
            return
        except Exception as e:  # pylint: disable=broad-except
            scan_response.errors.Append(
                rdf_memory.ProcessMemoryError(process=rdf_process,
                                              error=str(e)))
            return

        if matches:
            scan_response.matches.Append(
                rdf_memory.YaraProcessScanMatch(process=rdf_process,
                                                match=matches,
                                                scan_time_us=scan_time_us))
        else:
            scan_response.misses.Append(
                rdf_memory.YaraProcessScanMiss(process=rdf_process,
                                               scan_time_us=scan_time_us))
示例#2
0
    def _ScanProcess(self, process, scan_request, scan_response):
        rdf_process = rdf_client.Process.FromPsutilProcess(process)

        # TODO: Replace time.time() arithmetic with RDFDatetime
        # subtraction.
        start_time = time.time()
        try:
            matches = self._GetMatches(process, scan_request)
            scan_time = time.time() - start_time
            scan_time_us = int(scan_time * 1e6)
        except yara.TimeoutError:
            scan_response.errors.Append(
                rdf_memory.ProcessMemoryError(
                    process=rdf_process,
                    error="Scanning timed out (%s seconds)." %
                    (time.time() - start_time)))
            return
        except Exception as e:  # pylint: disable=broad-except
            scan_response.errors.Append(
                rdf_memory.ProcessMemoryError(process=rdf_process,
                                              error=str(e)))
            return

        if matches:
            scan_response.matches.Append(
                rdf_memory.YaraProcessScanMatch(process=rdf_process,
                                                match=matches,
                                                scan_time_us=scan_time_us))
        else:
            scan_response.misses.Append(
                rdf_memory.YaraProcessScanMiss(process=rdf_process,
                                               scan_time_us=scan_time_us))
示例#3
0
    def Run(self, args):
        if args.prioritize_offsets and len(args.pids) != 1:
            raise ValueError(
                "Supplied prioritize_offsets {} for PIDs {} in YaraProcessDump. "
                "Required exactly one PID.".format(args.prioritize_offsets,
                                                   args.pids))

        result = rdf_memory.YaraProcessDumpResponse()

        for p in ProcessIterator(args.pids, args.process_regex, None,
                                 args.ignore_grr_process, result.errors):
            self.Progress()
            start = rdfvalue.RDFDatetime.Now()

            try:
                response = self.DumpProcess(p, args)
                now = rdfvalue.RDFDatetime.Now()
                response.dump_time_us = (now - start).ToInt(
                    rdfvalue.MICROSECONDS)
                result.dumped_processes.Append(response)
                if response.error:
                    # Limit exceeded, we bail out early.
                    break
            except Exception as e:  # pylint: disable=broad-except
                result.errors.Append(
                    rdf_memory.ProcessMemoryError(
                        process=rdf_client.Process.FromPsutilProcess(p),
                        error=str(e)))
                continue

        self.SendReply(result)
示例#4
0
文件: memory.py 项目: x35029/grr
    def Run(self, args):
        result = rdf_memory.YaraProcessDumpResponse()

        self.bytes_written = 0

        for p in ProcessIterator(args.pids, args.process_regex,
                                 args.ignore_grr_process, result.errors):
            self.Progress()
            start_time = time.time()

            try:
                response = self.DumpProcess(p, args)
                response.dump_time_us = int((time.time() - start_time) * 1e6)
                result.dumped_processes.Append(response)
                if response.error:
                    # Limit exceeded, we bail out early.
                    break
            except Exception as e:  # pylint: disable=broad-except
                result.errors.Append(
                    rdf_memory.ProcessMemoryError(
                        process=rdf_client.Process.FromPsutilProcess(p),
                        error=str(e)))
                continue

        self.SendReply(result)
示例#5
0
 def _GenerateSample(self, **kwargs):
     process = rdf_client.Process(pid=2,
                                  ppid=1,
                                  cmdline=["cmd.exe"],
                                  exe="c:\\windows\\cmd.exe",
                                  ctime=1333718907167083)
     return rdf_memory.ProcessMemoryError(process=process, **kwargs)
示例#6
0
def ProcessIterator(pids, process_regex_string, cmdline_regex_string,
                    ignore_grr_process, error_list):
    """Yields all (psutil-) processes that match certain criteria.

  Args:
    pids: A list of pids. If given, only the processes with those pids are
      returned.
    process_regex_string: If given, only processes whose name matches the regex
      are returned.
    cmdline_regex_string: If given, only processes whose cmdline matches the
      regex are returned.
    ignore_grr_process: If True, the grr process itself will not be returned.
    error_list: All errors while handling processes are appended to this list.
      Type is repeated ProcessMemoryError.

  Yields:
    psutils.Process objects matching all criteria.
  """
    pids = set(pids)
    if ignore_grr_process:
        grr_pid = psutil.Process().pid
    else:
        grr_pid = -1

    if process_regex_string:
        process_regex = re.compile(process_regex_string)
    else:
        process_regex = None

    if cmdline_regex_string:
        cmdline_regex = re.compile(cmdline_regex_string)
    else:
        cmdline_regex = None

    if pids:
        process_iterator = []
        for pid in pids:
            try:
                process_iterator.append(psutil.Process(pid=pid))
            except Exception as e:  # pylint: disable=broad-except
                error_list.Append(
                    rdf_memory.ProcessMemoryError(
                        process=rdf_client.Process(pid=pid), error=str(e)))
    else:
        process_iterator = psutil.process_iter()

    for p in process_iterator:
        if process_regex and not process_regex.search(p.name()):
            continue

        if cmdline_regex and not cmdline_regex.search(" ".join(p.cmdline())):
            continue

        if p.pid == grr_pid:
            continue

        yield p
示例#7
0
    def Run(self, args):
        result = rdf_memory.YaraProcessScanResponse()
        for p in ProcessIterator(args.pids, args.process_regex,
                                 args.ignore_grr_process, result.errors):
            self.Progress()

            n_results = len(result.errors) + len(result.matches) + len(
                result.misses)
            if n_results >= self._RESULTS_PER_RESPONSE:
                self.SendReply(result)
                result = rdf_memory.YaraProcessScanResponse()

            rdf_process = rdf_client.Process.FromPsutilProcess(p)

            start_time = time.time()
            try:
                matches = self._ScanProcess(p, args)
                scan_time = time.time() - start_time
                scan_time_us = int(scan_time * 1e6)
            except yara.TimeoutError:
                result.errors.Append(
                    rdf_memory.ProcessMemoryError(
                        process=rdf_process,
                        error="Scanning timed out (%s seconds)." %
                        (time.time() - start_time)))
                continue
            except Exception as e:  # pylint: disable=broad-except
                result.errors.Append(
                    rdf_memory.ProcessMemoryError(process=rdf_process,
                                                  error=str(e)))
                continue

            if matches:
                result.matches.Append(
                    rdf_memory.YaraProcessScanMatch(process=rdf_process,
                                                    match=matches,
                                                    scan_time_us=scan_time_us))
            else:
                result.misses.Append(
                    rdf_memory.YaraProcessScanMiss(process=rdf_process,
                                                   scan_time_us=scan_time_us))

        self.SendReply(result)