Beispiel #1
0
    def AnalyzeStringLiterals(self, elf_path, elf_string_positions):
        logging.debug('worker: AnalyzeStringLiterals() started.')
        # Read string_data from elf_path, to be shared by forked processes.
        address, offset, _ = string_extract.LookupElfRodataInfo(
            elf_path, self._tool_prefix)
        adjust = address - offset
        abs_string_positions = ((addr - adjust, s)
                                for addr, s in elf_string_positions)
        string_data = string_extract.ReadFileChunks(elf_path,
                                                    abs_string_positions)

        params = ((chunk, )
                  for chunk in self._encoded_string_addresses_by_path_chunks)
        # Order of the jobs doesn't matter since each job owns independent paths,
        # and our output is a dict where paths are the key.
        results = concurrent.BulkForkAndCall(
            string_extract.ResolveStringPieces,
            params,
            string_data=string_data,
            tool_prefix=self._tool_prefix,
            output_directory=self._output_directory)
        results = list(results)

        final_result = []
        for i in xrange(len(elf_string_positions)):
            final_result.append(
                concurrent.JoinEncodedDictOfLists([r[i] for r in results]))
        self._list_of_encoded_elf_string_positions_by_path = final_result
        logging.debug('worker: AnalyzeStringLiterals() completed.')
Beispiel #2
0
 def _ReadElfStringData(self, elf_path, elf_string_ranges):
     # Read string_data from elf_path, to be shared with forked processes.
     address, offset, _ = string_extract.LookupElfRodataInfo(
         elf_path, self._tool_prefix)
     adjust = address - offset
     abs_elf_string_ranges = ((addr - adjust, s)
                              for addr, s in elf_string_ranges)
     return string_extract.ReadFileChunks(elf_path, abs_elf_string_ranges)
Beispiel #3
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--multiprocess', action='store_true')
    parser.add_argument('--tool-prefix', required=True)
    parser.add_argument('--output-directory', required=True)
    parser.add_argument('--elf-file', type=os.path.realpath)
    parser.add_argument('--show-names', action='store_true')
    parser.add_argument('--show-strings', action='store_true')
    parser.add_argument('objects', type=os.path.realpath, nargs='+')

    args = parser.parse_args()
    logging.basicConfig(
        level=logging.DEBUG,
        format='%(levelname).1s %(relativeCreated)6d %(message)s')

    if args.multiprocess:
        bulk_analyzer = _BulkObjectFileAnalyzerMaster(args.tool_prefix,
                                                      args.output_directory)
    else:
        concurrent.DISABLE_ASYNC = True
        bulk_analyzer = _BulkObjectFileAnalyzerWorker(args.tool_prefix,
                                                      args.output_directory)

    # Pass individually to test multiple calls.
    for path in args.objects:
        bulk_analyzer.AnalyzePaths([path])
    bulk_analyzer.SortPaths()

    names_to_paths = bulk_analyzer.GetSymbolNames()
    print('Found {} names'.format(len(names_to_paths)))
    if args.show_names:
        for name, paths in names_to_paths.iteritems():
            print('{}: {!r}'.format(name, paths))

    if args.elf_file:
        address, offset, size = string_extract.LookupElfRodataInfo(
            args.elf_file, args.tool_prefix)
        bulk_analyzer.AnalyzeStringLiterals(args.elf_file, ((address, size), ))

        positions_by_path = bulk_analyzer.GetStringPositions()[0]
        print('Found {} string literals'.format(
            sum(len(v) for v in positions_by_path.itervalues())))
        if args.show_strings:
            logging.debug('.rodata adjust=%d', address - offset)
            for path, positions in positions_by_path.iteritems():
                strs = string_extract.ReadFileChunks(
                    args.elf_file,
                    ((offset + addr, size) for addr, size in positions))
                print('{}: {!r}'.format(
                    path,
                    [s if len(s) < 20 else s[:20] + '...' for s in strs]))