| OLD | NEW | 
|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python | 
| 2 # | 2 # | 
| 3 # Copyright 2012 the V8 project authors. All rights reserved. | 3 # Copyright 2012 the V8 project authors. All rights reserved. | 
| 4 # Redistribution and use in source and binary forms, with or without | 4 # Redistribution and use in source and binary forms, with or without | 
| 5 # modification, are permitted provided that the following conditions are | 5 # modification, are permitted provided that the following conditions are | 
| 6 # met: | 6 # met: | 
| 7 # | 7 # | 
| 8 #     * Redistributions of source code must retain the above copyright | 8 #     * Redistributions of source code must retain the above copyright | 
| 9 #       notice, this list of conditions and the following disclaimer. | 9 #       notice, this list of conditions and the following disclaimer. | 
| 10 #     * Redistributions in binary form must reproduce the above | 10 #     * Redistributions in binary form must reproduce the above | 
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 128 | 128 | 
| 129     if is_executable is not False: | 129     if is_executable is not False: | 
| 130       lines = reader.GetDisasmLines(start, size) | 130       lines = reader.GetDisasmLines(start, size) | 
| 131       for line in lines: | 131       for line in lines: | 
| 132         print FormatDisasmLine(start, heap, line) | 132         print FormatDisasmLine(start, heap, line) | 
| 133       print | 133       print | 
| 134 | 134 | 
| 135     if is_ascii is not False: | 135     if is_ascii is not False: | 
| 136       # Output in the same format as the Unix hd command | 136       # Output in the same format as the Unix hd command | 
| 137       addr = start | 137       addr = start | 
| 138       for slot in xrange(location, location + size, 16): | 138       for i in xrange(0, size, 16): | 
|  | 139         slot = i + location | 
| 139         hex_line = "" | 140         hex_line = "" | 
| 140         asc_line = "" | 141         asc_line = "" | 
| 141         for i in xrange(0, 16): | 142         for i in xrange(16): | 
| 142           if slot + i < location + size: | 143           if slot + i < location + size: | 
| 143             byte = ctypes.c_uint8.from_buffer(reader.minidump, slot + i).value | 144             byte = ctypes.c_uint8.from_buffer(reader.minidump, slot + i).value | 
| 144             if byte >= 0x20 and byte < 0x7f: | 145             if byte >= 0x20 and byte < 0x7f: | 
| 145               asc_line += chr(byte) | 146               asc_line += chr(byte) | 
| 146             else: | 147             else: | 
| 147               asc_line += "." | 148               asc_line += "." | 
| 148             hex_line += " %02x" % (byte) | 149             hex_line += " %02x" % (byte) | 
| 149           else: | 150           else: | 
| 150             hex_line += "   " | 151             hex_line += "   " | 
| 151           if i == 7: | 152           if i == 7: | 
| 152             hex_line += " " | 153             hex_line += " " | 
| 153         print "%s  %s |%s|" % (reader.FormatIntPtr(addr), | 154         print "%s  %s |%s|" % (reader.FormatIntPtr(addr), | 
| 154                                hex_line, | 155                                hex_line, | 
| 155                                asc_line) | 156                                asc_line) | 
| 156         addr += 16 | 157         addr += 16 | 
| 157 | 158 | 
| 158     if is_executable is not True and is_ascii is not True: | 159     if is_executable is not True and is_ascii is not True: | 
| 159       print "%s - %s" % (reader.FormatIntPtr(start), | 160       print "%s - %s" % (reader.FormatIntPtr(start), | 
| 160                          reader.FormatIntPtr(start + size)) | 161                          reader.FormatIntPtr(start + size)) | 
| 161       for slot in xrange(start, | 162       print start + size + 1; | 
| 162                          start + size, | 163       for i in xrange(0, size, reader.PointerSize()): | 
| 163                          reader.PointerSize()): | 164         slot = start + i | 
| 164         maybe_address = reader.ReadUIntPtr(slot) | 165         maybe_address = reader.ReadUIntPtr(slot) | 
| 165         heap_object = heap.FindObject(maybe_address) | 166         heap_object = heap.FindObject(maybe_address) | 
| 166         print "%s: %s" % (reader.FormatIntPtr(slot), | 167         print "%s: %s" % (reader.FormatIntPtr(slot), | 
| 167                           reader.FormatIntPtr(maybe_address)) | 168                           reader.FormatIntPtr(maybe_address)) | 
| 168         if heap_object: | 169         if heap_object: | 
| 169           heap_object.Print(Printer()) | 170           heap_object.Print(Printer()) | 
| 170           print | 171           print | 
| 171 | 172 | 
| 172   reader.ForEachMemoryRegion(dump_region) | 173   reader.ForEachMemoryRegion(dump_region) | 
| 173 | 174 | 
| (...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 653     if self.arch == MD_CPU_ARCHITECTURE_AMD64: | 654     if self.arch == MD_CPU_ARCHITECTURE_AMD64: | 
| 654       return ctypes.c_uint64.from_buffer(self.minidump, location).value | 655       return ctypes.c_uint64.from_buffer(self.minidump, location).value | 
| 655     elif self.arch == MD_CPU_ARCHITECTURE_ARM: | 656     elif self.arch == MD_CPU_ARCHITECTURE_ARM: | 
| 656       return ctypes.c_uint32.from_buffer(self.minidump, location).value | 657       return ctypes.c_uint32.from_buffer(self.minidump, location).value | 
| 657     elif self.arch == MD_CPU_ARCHITECTURE_X86: | 658     elif self.arch == MD_CPU_ARCHITECTURE_X86: | 
| 658       return ctypes.c_uint32.from_buffer(self.minidump, location).value | 659       return ctypes.c_uint32.from_buffer(self.minidump, location).value | 
| 659 | 660 | 
| 660   def IsProbableASCIIRegion(self, location, length): | 661   def IsProbableASCIIRegion(self, location, length): | 
| 661     ascii_bytes = 0 | 662     ascii_bytes = 0 | 
| 662     non_ascii_bytes = 0 | 663     non_ascii_bytes = 0 | 
| 663     for loc in xrange(location, location + length): | 664     for i in xrange(length): | 
|  | 665       loc = location + i | 
| 664       byte = ctypes.c_uint8.from_buffer(self.minidump, loc).value | 666       byte = ctypes.c_uint8.from_buffer(self.minidump, loc).value | 
| 665       if byte >= 0x7f: | 667       if byte >= 0x7f: | 
| 666         non_ascii_bytes += 1 | 668         non_ascii_bytes += 1 | 
| 667       if byte < 0x20 and byte != 0: | 669       if byte < 0x20 and byte != 0: | 
| 668         non_ascii_bytes += 1 | 670         non_ascii_bytes += 1 | 
| 669       if byte < 0x7f and byte >= 0x20: | 671       if byte < 0x7f and byte >= 0x20: | 
| 670         ascii_bytes += 1 | 672         ascii_bytes += 1 | 
| 671       if byte == 0xa:  # newline | 673       if byte == 0xa:  # newline | 
| 672         ascii_bytes += 1 | 674         ascii_bytes += 1 | 
| 673     if ascii_bytes * 10 <= length: | 675     if ascii_bytes * 10 <= length: | 
| 674       return False | 676       return False | 
| 675     if length > 0 and ascii_bytes > non_ascii_bytes * 7: | 677     if length > 0 and ascii_bytes > non_ascii_bytes * 7: | 
| 676       return True | 678       return True | 
| 677     if ascii_bytes > non_ascii_bytes * 3: | 679     if ascii_bytes > non_ascii_bytes * 3: | 
| 678       return None  # Maybe | 680       return None  # Maybe | 
| 679     return False | 681     return False | 
| 680 | 682 | 
| 681   def IsProbableExecutableRegion(self, location, length): | 683   def IsProbableExecutableRegion(self, location, length): | 
| 682     opcode_bytes = 0 | 684     opcode_bytes = 0 | 
| 683     sixty_four = self.arch == MD_CPU_ARCHITECTURE_AMD64 | 685     sixty_four = self.arch == MD_CPU_ARCHITECTURE_AMD64 | 
| 684     for loc in xrange(location, location + length): | 686     for i in xrange(length): | 
|  | 687       loc = location + i | 
| 685       byte = ctypes.c_uint8.from_buffer(self.minidump, loc).value | 688       byte = ctypes.c_uint8.from_buffer(self.minidump, loc).value | 
| 686       if (byte == 0x8b or           # mov | 689       if (byte == 0x8b or           # mov | 
| 687           byte == 0x89 or           # mov reg-reg | 690           byte == 0x89 or           # mov reg-reg | 
| 688           (byte & 0xf0) == 0x50 or  # push/pop | 691           (byte & 0xf0) == 0x50 or  # push/pop | 
| 689           (sixty_four and (byte & 0xf0) == 0x40) or  # rex prefix | 692           (sixty_four and (byte & 0xf0) == 0x40) or  # rex prefix | 
| 690           byte == 0xc3 or           # return | 693           byte == 0xc3 or           # return | 
| 691           byte == 0x74 or           # jeq | 694           byte == 0x74 or           # jeq | 
| 692           byte == 0x84 or           # jeq far | 695           byte == 0x84 or           # jeq far | 
| 693           byte == 0x75 or           # jne | 696           byte == 0x75 or           # jne | 
| 694           byte == 0x85 or           # jne far | 697           byte == 0x85 or           # jne far | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 722         cb(self, r.start, r.size, location) | 725         cb(self, r.start, r.size, location) | 
| 723         offset += r.size | 726         offset += r.size | 
| 724 | 727 | 
| 725     if self.memory_list is not None: | 728     if self.memory_list is not None: | 
| 726       for r in self.memory_list.ranges: | 729       for r in self.memory_list.ranges: | 
| 727         cb(self, r.start, r.memory.data_size, r.memory.rva) | 730         cb(self, r.start, r.memory.data_size, r.memory.rva) | 
| 728 | 731 | 
| 729   def FindWord(self, word, alignment=0): | 732   def FindWord(self, word, alignment=0): | 
| 730     def search_inside_region(reader, start, size, location): | 733     def search_inside_region(reader, start, size, location): | 
| 731       location = (location + alignment) & ~alignment | 734       location = (location + alignment) & ~alignment | 
| 732       for loc in xrange(location, location + size - self.PointerSize()): | 735       for i in xrange(size - self.PointerSize()): | 
|  | 736         loc = location + i | 
| 733         if reader._ReadWord(loc) == word: | 737         if reader._ReadWord(loc) == word: | 
| 734           slot = start + (loc - location) | 738           slot = start + (loc - location) | 
| 735           print "%s: %s" % (reader.FormatIntPtr(slot), | 739           print "%s: %s" % (reader.FormatIntPtr(slot), | 
| 736                             reader.FormatIntPtr(word)) | 740                             reader.FormatIntPtr(word)) | 
| 737     self.ForEachMemoryRegion(search_inside_region) | 741     self.ForEachMemoryRegion(search_inside_region) | 
| 738 | 742 | 
| 739   def FindWordList(self, word): | 743   def FindWordList(self, word): | 
| 740     aligned_res = [] | 744     aligned_res = [] | 
| 741     unaligned_res = [] | 745     unaligned_res = [] | 
| 742     def search_inside_region(reader, start, size, location): | 746     def search_inside_region(reader, start, size, location): | 
| 743       for loc in xrange(location, location + size - self.PointerSize()): | 747       for i in xrange(size - self.PointerSize()): | 
|  | 748         loc = location + i | 
| 744         if reader._ReadWord(loc) == word: | 749         if reader._ReadWord(loc) == word: | 
| 745           slot = start + (loc - location) | 750           slot = start + (loc - location) | 
| 746           if slot % self.PointerSize() == 0: | 751           if slot % self.PointerSize() == 0: | 
| 747             aligned_res.append(slot) | 752             aligned_res.append(slot) | 
| 748           else: | 753           else: | 
| 749             unaligned_res.append(slot) | 754             unaligned_res.append(slot) | 
| 750     self.ForEachMemoryRegion(search_inside_region) | 755     self.ForEachMemoryRegion(search_inside_region) | 
| 751     return (aligned_res, unaligned_res) | 756     return (aligned_res, unaligned_res) | 
| 752 | 757 | 
| 753   def FindLocation(self, address): | 758   def FindLocation(self, address): | 
| (...skipping 1577 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2331                 " more..." | 2336                 " more..." | 
| 2332                 " </a>)" % | 2337                 " </a>)" % | 
| 2333                 (self.encfilename, highlight_address)) | 2338                 (self.encfilename, highlight_address)) | 
| 2334 | 2339 | 
| 2335     f.write("<h3>%s 0x%x - 0x%x, " | 2340     f.write("<h3>%s 0x%x - 0x%x, " | 
| 2336             "highlighting <a href=\"#highlight\">0x%x</a> %s</h3>\n" % | 2341             "highlighting <a href=\"#highlight\">0x%x</a> %s</h3>\n" % | 
| 2337             (desc, start_address, end_address, highlight_address, expand)) | 2342             (desc, start_address, end_address, highlight_address, expand)) | 
| 2338     f.write('<div class="code">') | 2343     f.write('<div class="code">') | 
| 2339     f.write("<table class=\"codedump\">\n") | 2344     f.write("<table class=\"codedump\">\n") | 
| 2340 | 2345 | 
| 2341     for slot in xrange(start_address, end_address, size): | 2346     for j in xrange(0, end_address - start_address, size): | 
|  | 2347       slot = start_address + j | 
| 2342       heap_object = "" | 2348       heap_object = "" | 
| 2343       maybe_address = None | 2349       maybe_address = None | 
| 2344       end_region = region[0] + region[1] | 2350       end_region = region[0] + region[1] | 
| 2345       if slot < region[0] or slot + size > end_region: | 2351       if slot < region[0] or slot + size > end_region: | 
| 2346         straddress = "0x" | 2352         straddress = "0x" | 
| 2347         for i in xrange(end_region, slot + size): | 2353         for i in xrange(end_region, slot + size): | 
| 2348           straddress += "??" | 2354           straddress += "??" | 
| 2349         for i in reversed( | 2355         for i in reversed( | 
| 2350             xrange(max(slot, region[0]), min(slot + size, end_region))): | 2356             xrange(max(slot, region[0]), min(slot + size, end_region))): | 
| 2351           straddress += "%02x" % self.reader.ReadU8(i) | 2357           straddress += "%02x" % self.reader.ReadU8(i) | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2406 | 2412 | 
| 2407     f.write("<h3>ASCII dump 0x%x - 0x%x, highlighting 0x%x %s</h3>" % | 2413     f.write("<h3>ASCII dump 0x%x - 0x%x, highlighting 0x%x %s</h3>" % | 
| 2408             (start_address, end_address, highlight_address, expand)) | 2414             (start_address, end_address, highlight_address, expand)) | 
| 2409 | 2415 | 
| 2410     line_width = 64 | 2416     line_width = 64 | 
| 2411 | 2417 | 
| 2412     f.write('<div class="code">') | 2418     f.write('<div class="code">') | 
| 2413 | 2419 | 
| 2414     start = self.align_down(start_address, line_width) | 2420     start = self.align_down(start_address, line_width) | 
| 2415 | 2421 | 
| 2416     for address in xrange(start, end_address): | 2422     for i in xrange(end_address - start): | 
|  | 2423       address = start + i | 
| 2417       if address % 64 == 0: | 2424       if address % 64 == 0: | 
| 2418         if address != start: | 2425         if address != start: | 
| 2419           f.write("<br>") | 2426           f.write("<br>") | 
| 2420         f.write("0x%08x: " % address) | 2427         f.write("0x%08x: " % address) | 
| 2421       if address < start_address: | 2428       if address < start_address: | 
| 2422         f.write(" ") | 2429         f.write(" ") | 
| 2423       else: | 2430       else: | 
| 2424         if address == highlight_address: | 2431         if address == highlight_address: | 
| 2425           f.write("<span class=\"highlight\">") | 2432           f.write("<span class=\"highlight\">") | 
| 2426         code = self.reader.ReadU8(address) | 2433         code = self.reader.ReadU8(address) | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2475       if exact and not found and end_address == region[0] + region[1]: | 2482       if exact and not found and end_address == region[0] + region[1]: | 
| 2476         exactness = "&exact=off" | 2483         exactness = "&exact=off" | 
| 2477       expand = ("(<a href=\"disasm.html?%s%s" | 2484       expand = ("(<a href=\"disasm.html?%s%s" | 
| 2478                 "&val=0x%x#highlight\">more...</a>)" % | 2485                 "&val=0x%x#highlight\">more...</a>)" % | 
| 2479                 (self.encfilename, exactness, highlight_address)) | 2486                 (self.encfilename, exactness, highlight_address)) | 
| 2480 | 2487 | 
| 2481     f.write("<h3>Disassembling 0x%x - 0x%x, highlighting 0x%x %s</h3>" % | 2488     f.write("<h3>Disassembling 0x%x - 0x%x, highlighting 0x%x %s</h3>" % | 
| 2482             (start_address, end_address, highlight_address, expand)) | 2489             (start_address, end_address, highlight_address, expand)) | 
| 2483     f.write('<div class="code">') | 2490     f.write('<div class="code">') | 
| 2484     f.write("<table class=\"codedump\">\n"); | 2491     f.write("<table class=\"codedump\">\n"); | 
| 2485     for i in xrange(0, len(lines)): | 2492     for i in xrange(len(lines)): | 
| 2486       line = lines[i] | 2493       line = lines[i] | 
| 2487       next_address = count | 2494       next_address = count | 
| 2488       if i + 1 < len(lines): | 2495       if i + 1 < len(lines): | 
| 2489         next_line = lines[i + 1] | 2496         next_line = lines[i + 1] | 
| 2490         next_address = next_line[0] | 2497         next_address = next_line[0] | 
| 2491       self.format_disasm_line( | 2498       self.format_disasm_line( | 
| 2492           f, start_address, line, next_address, highlight_address) | 2499           f, start_address, line, next_address, highlight_address) | 
| 2493     f.write("</table>\n") | 2500     f.write("</table>\n") | 
| 2494     f.write("</div>") | 2501     f.write("</div>") | 
| 2495     return | 2502     return | 
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2831      Interpret memory in the given region [address, address + num * word_size) | 2838      Interpret memory in the given region [address, address + num * word_size) | 
| 2832      (if available) as a sequence of words. Automatic alignment is not performed
      . | 2839      (if available) as a sequence of words. Automatic alignment is not performed
      . | 
| 2833      If the num is not specified, a default value of 16 words is used. | 2840      If the num is not specified, a default value of 16 words is used. | 
| 2834      Synopsis: dd 0x<address> 0x<num> | 2841      Synopsis: dd 0x<address> 0x<num> | 
| 2835     """ | 2842     """ | 
| 2836     args = args.split(' ') | 2843     args = args.split(' ') | 
| 2837     start = int(args[0], 16) | 2844     start = int(args[0], 16) | 
| 2838     num = int(args[1], 16) if len(args) > 1 else 0x10 | 2845     num = int(args[1], 16) if len(args) > 1 else 0x10 | 
| 2839     if (start & self.heap.ObjectAlignmentMask()) != 0: | 2846     if (start & self.heap.ObjectAlignmentMask()) != 0: | 
| 2840       print "Warning: Dumping un-aligned memory, is this what you had in mind?" | 2847       print "Warning: Dumping un-aligned memory, is this what you had in mind?" | 
| 2841     for slot in xrange(start, | 2848     for i in xrange(0, | 
| 2842                        start + self.reader.PointerSize() * num, | 2849                     self.reader.PointerSize() * num, | 
| 2843                        self.reader.PointerSize()): | 2850                     self.reader.PointerSize()): | 
|  | 2851       slot = start + i | 
| 2844       if not self.reader.IsValidAddress(slot): | 2852       if not self.reader.IsValidAddress(slot): | 
| 2845         print "Address is not contained within the minidump!" | 2853         print "Address is not contained within the minidump!" | 
| 2846         return | 2854         return | 
| 2847       maybe_address = self.reader.ReadUIntPtr(slot) | 2855       maybe_address = self.reader.ReadUIntPtr(slot) | 
| 2848       heap_object = self.padawan.SenseObject(maybe_address) | 2856       heap_object = self.padawan.SenseObject(maybe_address) | 
| 2849       print "%s: %s %s" % (self.reader.FormatIntPtr(slot), | 2857       print "%s: %s %s" % (self.reader.FormatIntPtr(slot), | 
| 2850                            self.reader.FormatIntPtr(maybe_address), | 2858                            self.reader.FormatIntPtr(maybe_address), | 
| 2851                            heap_object or '') | 2859                            heap_object or '') | 
| 2852 | 2860 | 
| 2853   def do_do(self, address): | 2861   def do_do(self, address): | 
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3164     try: | 3172     try: | 
| 3165       server = InspectionWebServer(PORT_NUMBER, options, args[0]) | 3173       server = InspectionWebServer(PORT_NUMBER, options, args[0]) | 
| 3166       print 'Started httpserver on port ' , PORT_NUMBER | 3174       print 'Started httpserver on port ' , PORT_NUMBER | 
| 3167       webbrowser.open('http://localhost:%i/summary.html' % PORT_NUMBER) | 3175       webbrowser.open('http://localhost:%i/summary.html' % PORT_NUMBER) | 
| 3168       server.serve_forever() | 3176       server.serve_forever() | 
| 3169     except KeyboardInterrupt: | 3177     except KeyboardInterrupt: | 
| 3170       print '^C received, shutting down the web server' | 3178       print '^C received, shutting down the web server' | 
| 3171       server.socket.close() | 3179       server.socket.close() | 
| 3172   else: | 3180   else: | 
| 3173     AnalyzeMinidump(options, args[0]) | 3181     AnalyzeMinidump(options, args[0]) | 
| OLD | NEW | 
|---|