| OLD | NEW |
| (Empty) |
| 1 # A script for analyzing the output of NPSPY and merging data about streams. | |
| 2 | |
| 3 import sys | |
| 4 | |
| 5 | |
| 6 def ReadFile(filename, flags='rb'): | |
| 7 """Returns the contents of a file.""" | |
| 8 file = open(filename, flags) | |
| 9 result = file.read() | |
| 10 file.close() | |
| 11 return result | |
| 12 | |
| 13 | |
| 14 def WriteFile(filename, contents): | |
| 15 """Overwrites the file with the given contents.""" | |
| 16 file = open(filename, 'w') | |
| 17 file.write(contents) | |
| 18 file.close() | |
| 19 | |
| 20 | |
| 21 # sample line: 'NPP_NewStream(0x645c898, 0x56ba900("application/x-shockwave-flas
h"), 0x64bb3b0 (http://weeklyad.target.com/target/flash/target/target.swf?ver=09
0326), TRUE, NP_NORMAL)' | |
| 22 class Stream: | |
| 23 def __init__(self, line): | |
| 24 split = line.split(', ') | |
| 25 | |
| 26 self.mime_type = split[1].split('"')[1] | |
| 27 self.url = split[2].split(' ')[1].strip('()') | |
| 28 self.seekable = split[3] | |
| 29 self.type = split[4].strip(')') | |
| 30 self.size = 0 | |
| 31 self.status = '' | |
| 32 try: | |
| 33 self.address = split[2].split(' ')[0] | |
| 34 except: | |
| 35 print 'parsing error on ' + line | |
| 36 self.address = '' | |
| 37 | |
| 38 if self.type != 'NP_NORMAL': | |
| 39 print 'line got unexpected type: ' + line | |
| 40 | |
| 41 | |
| 42 def main(argv=None): | |
| 43 if argv is None: | |
| 44 argv = sys.argv | |
| 45 | |
| 46 streams = [] | |
| 47 | |
| 48 if len(argv) != 2: | |
| 49 print 'need filename' | |
| 50 return | |
| 51 file = ReadFile(argv[1]) | |
| 52 for line in file.splitlines(): | |
| 53 if line.startswith('NPP_NewStream('): | |
| 54 if line.count('(') < 3: | |
| 55 print 'unknown format for line: ' + line | |
| 56 continue | |
| 57 | |
| 58 s = Stream(line) | |
| 59 streams.append(s) | |
| 60 elif line.startswith('NPP_Write('): | |
| 61 # sample: NPP_Write(0x645c898, 0x64bb3b0, 0, 16384, 0x56c1000("CW"))) | |
| 62 split = line.split(', ') | |
| 63 address = split[1] | |
| 64 start = int(split[2]) | |
| 65 size = int(split[3]) | |
| 66 found = False | |
| 67 for stream in streams: | |
| 68 if stream.address == address: | |
| 69 if stream.size != start: | |
| 70 print 'error: starting at wrong place for write ' + stream.url + ' '
+ str(stream.size) + ' ' + str(start) | |
| 71 stream.size += size | |
| 72 found = True | |
| 73 break | |
| 74 | |
| 75 if not found: | |
| 76 print "couldn't find stream to match NPP_Write " + line | |
| 77 elif line.startswith('NPP_DestroyStream('): | |
| 78 # sample: NPP_DestroyStream(0x645c898, 0x64bb3b0, NPRES_DONE) | |
| 79 split = line.split(', ') | |
| 80 address = split[1] | |
| 81 status = split[2].strip(')') | |
| 82 found = False | |
| 83 for stream in streams: | |
| 84 if stream.address == address: | |
| 85 stream.status = status | |
| 86 stream.address = '' # address can be reused | |
| 87 found = True | |
| 88 break | |
| 89 | |
| 90 if not found: | |
| 91 print "couldn't find stream to match NPP_DestroyStream " + line | |
| 92 | |
| 93 | |
| 94 output = [] | |
| 95 for stream in streams: | |
| 96 if stream.status != 'NPRES_DONE': | |
| 97 print 'error: no NPP_DestroyStream with success for ' + stream.url + ' ' +
stream.status + '.' | |
| 98 output.append(', '.join([stream.url, stream.mime_type, str(stream.size), str
eam.seekable])) | |
| 99 output_file = argv[1].replace('.', '_analyzed.') | |
| 100 | |
| 101 WriteFile(output_file, '\n'.join(output)) | |
| 102 | |
| 103 | |
| 104 if __name__ == "__main__": | |
| 105 sys.exit(main()) | |
| OLD | NEW |