Advertisement
Guest User

Untitled

a guest
May 29th, 2015
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. #!/usr/bin/env python
  2. import os, sys, bisect, re
  3.  
  4. class Module:
  5. def __init__(self, name):
  6. self.name = name
  7. self.files = []
  8. self.funcs = []
  9. self.lines = []
  10.  
  11. def parse_line(self, line):
  12. head, tail = line.split(" ", 1)
  13. if head == "FILE":
  14. filenum, name = tail.split(" ", 1)
  15. filenum = int(filenum, 10)
  16. if name.startswith("hg:"):
  17. name = name.split(":")[2]
  18. while len(self.files) <= filenum:
  19. self.files.append(None)
  20. self.files[filenum] = name
  21. elif head == "FUNC":
  22. addr, length, params, name = tail.split(" ", 3)
  23. addr = int(addr, 16)
  24. length = int(length, 16)
  25. self.funcs.append((addr, length, name))
  26. elif head == "PUBLIC" or head == "STACK":
  27. pass
  28. else:
  29. addr = int(head, 16)
  30. length, line, filenum = tail.split(" ", 2)
  31. length = int(length, 16)
  32. line = int(line, 10)
  33. filenum = int(filenum, 10)
  34. self.lines.append((addr, length, line, filenum))
  35.  
  36. def lookup(self, addr):
  37. bf = bisect.bisect(self.funcs, (addr,))
  38. if bf == 0:
  39. return None
  40. faddr, flen, fname = self.funcs[bf - 1]
  41. if addr > faddr + flen:
  42. return None
  43. bl = bisect.bisect(self.lines, (addr,))
  44. if bl == 0:
  45. return fname
  46. laddr, llen, lline, lfile = self.lines[bl - 1]
  47. if addr > laddr + llen:
  48. return fname
  49. return ("%s %s:%d" % (fname, self.files[lfile], lline))
  50.  
  51. def read_symbols(modules, path):
  52. this_module = None
  53. with open(path) as file:
  54. for line in file:
  55. line = line.rstrip()
  56. if line.startswith("MODULE "):
  57. kwd, os, arch, blob, name = line.split(" ", 4)
  58. if name not in modules:
  59. modules[name] = Module(name)
  60. this_module = modules[name]
  61. else:
  62. this_module.parse_line(line)
  63.  
  64. def main(argv):
  65. modules = {}
  66. for arg in argv:
  67. if os.path.isfile(arg):
  68. read_symbols(modules, arg)
  69. else:
  70. for root, dirnames, filenames in os.walk(arg):
  71. for filename in filenames:
  72. if filename.endswith(".sym"): #???
  73. read_symbols(modules, os.path.join(root, filename))
  74.  
  75. FIXABLE = re.compile('\?\?\?\[(.*/)?(?P<file>[^/]*)\+(?P<offset>0x[0-9a-f]+)\]')
  76. def fix(m):
  77. filename = m.group("file").rstrip()
  78. offset = int(m.group("offset"), 16)
  79. if filename not in modules:
  80. return m.group(0)
  81. xlation = modules[filename].lookup(offset)
  82. if not xlation:
  83. return m.group(0)
  84. return "%s (%s+0x%x)" % (xlation, filename, offset)
  85.  
  86. for line in sys.stdin:
  87. sys.stdout.write(re.sub(FIXABLE, fix, line))
  88.  
  89. if __name__ == '__main__':
  90. main(sys.argv[1:])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement