You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

accuracy_shake_var_tree.py 3.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #!/usr/bin/env python3
  2. # -*-coding=utf-8-*-
  3. # This tool is used to analyze the file generated by compare_binary_iodump.py.
  4. # parse() can build a dependency tree with those varnodes
  5. # where accuracy shake occurs and show the root varnodes.
  6. # get_varNode()/get_dependence_list()/get_reference_list()/show_src_info()
  7. # are some functions which are used to query dependencies between varnodes.
  8. import argparse
  9. import os
  10. class varNode:
  11. var_node_dict = {}
  12. var_node_root_dict = {}
  13. def __init__(self, id, dependence_list, src_info):
  14. self.src_info = src_info
  15. if not id in varNode.var_node_dict.keys():
  16. self.id = id
  17. self.dependence_list = []
  18. self.reference_list = []
  19. else:
  20. self = varNode.var_node_dict[id]
  21. if dependence_list:
  22. self.vitrual = False
  23. self.is_root = True
  24. else:
  25. self.vitrual = True
  26. self.is_root = False
  27. for i in dependence_list:
  28. if not i in varNode.var_node_dict.keys():
  29. varNode.var_node_dict[i] = varNode(i, [], "")
  30. dv = varNode.var_node_dict[i]
  31. self.dependence_list.append(dv)
  32. if not dv.vitrual:
  33. self.is_root = False
  34. dv.reference_list.append(self)
  35. for i in self.reference_list:
  36. i.is_root = False
  37. varNode.var_node_root_dict.pop[i.id]
  38. if self.is_root:
  39. varNode.var_node_root_dict[id] = self
  40. varNode.var_node_dict[id] = self
  41. @staticmethod
  42. def get_varNode(id):
  43. return varNode.var_node_dict[id]
  44. def get_dependence_list(self):
  45. return self.dependence_list
  46. def get_reference_list(self):
  47. return self.reference_list
  48. def show_src_info(self):
  49. print(self.src_info)
  50. def get_dependence(string, src_info):
  51. start1 = "id:"
  52. end1 = ","
  53. e = 0
  54. count = string.count(start1)
  55. dependence_list = []
  56. for x in range(0, count):
  57. s = string.find(start1, e)
  58. e = string.find(end1, s)
  59. sub_str = string[s:e]
  60. if x == 0:
  61. var = sub_str
  62. else:
  63. dependence_list.append(sub_str)
  64. varNode(var, dependence_list, src_info)
  65. def parse(filename):
  66. with open(filename) as f:
  67. varNode.var_node_dict.clear()
  68. varNode.var_node_root_dict.clear()
  69. line = f.readline()
  70. s = ["", "", ""]
  71. idx = 1
  72. while line:
  73. if line.find("not equal: ") != -1:
  74. s[2] = line
  75. src_info = s[0] + "\n" + s[1] + "\n" + s[2]
  76. get_dependence(s[0], src_info)
  77. else:
  78. if line.find("var={id:") != -1:
  79. idx = idx ^ 1
  80. s[idx] = ""
  81. s[idx] = s[idx] + line.strip()
  82. line = f.readline()
  83. return varNode.var_node_root_dict
  84. def main():
  85. parser = argparse.ArgumentParser(
  86. description=(
  87. "Analyze the outputs of compare_binary_iodump.py"
  88. "Should save the outputs of compare_binary_iodump.py"
  89. "as a file"
  90. ),
  91. formatter_class=argparse.ArgumentDefaultsHelpFormatter,
  92. )
  93. parser.add_argument(
  94. "filename", help="file which save the outputs of compare_binary_iodump.py"
  95. )
  96. args = parser.parse_args()
  97. parse(args.filename)
  98. print("varnode root:")
  99. for key, value in varNode.var_node_root_dict.items():
  100. print(key)
  101. print("detail info:")
  102. value.show_src_info()
  103. if __name__ == "__main__":
  104. main()