def run_BinDiff(self, v1, v2, experiment): """ as_binary_filename is a function that takes 2 arguments: experiment and iteration number, and returns the binary name for this iteration """ try: f = open("bindiff.input", "w") binary_1 = experiment.as_binary_filename(experiment, v1) binary_2 = experiment.as_binary_filename(experiment, v2) f.write("%s#%s#%s" % (binary_1, binary_2, binary_2)) # file1#file2#dirbase f.close() ida.run_Ida(binary_2, extend_analysis=experiment.config.extend_IDA_analysis, path=experiment.path) out_file = self.full_filename(experiment, v1, v2) self.run_BinDiff_once(binary_1, binary_2, out_file, ida.get_suffix(experiment), experiment.path) except OSError, e: print "Error in running BinDiff:" print e sys.exit(1)
def analyze(self, experiment, version): exe = experiment.as_binary_filename(experiment, version) suffix = ida.get_suffix(experiment) ida.selectIdaSuffix(exe, suffix, experiment.path) ida.run_Ida_Script(exe, "analyze_turbodiff.idc", suffix, experiment.path, [".ana", ".dis", ".turbodiffinfo"], "")
def match(self, experiment, v1, v2): exe1 = experiment.as_binary_filename(experiment, v1) exe2 = experiment.as_binary_filename(experiment, v2) suffix = ida.get_suffix(experiment) file_base = self.filename_base(experiment, v1, v2) options = "turbodiff_bart:%s %s" % (multiplatform.local_dir_entry( experiment.path, exe2) + ".idb", file_base) ida.selectIdaSuffix(exe1, suffix, experiment.path) ida.selectIdaSuffix(exe2, suffix, experiment.path) ida.run_Ida_Script(exe1, "match_turbodiff.idc", suffix, experiment.path, [".turbodiffdump"], options, file_base)
def match(experiment, v1, v2): exe1 = experiment.as_binary_filename(experiment, v1) exe2 = experiment.as_binary_filename(experiment, v2) suffix = ida.get_suffix(experiment) file_base = filename_base(experiment, v1, v2) options = "patchdiff2_bart:%s %s" % (multiplatform.local_dir_entry( experiment.path, exe2) + ".idb", file_base) ida.selectIdaSuffix(exe1, suffix, experiment.path) ida.selectIdaSuffix(exe2, suffix, experiment.path) ida.run_Ida_Script(exe1, "match_patchdiff2.idc", suffix, experiment.path, [ ".patchdiff2.identical.out", ".patchdiff2.info", ".patchdiff2.matches", "patchdiff2.unmatched1", ".patchdiff2.unmatched2" ], options, file_base)
def match(self, experiment, v1, v2): exe1 = experiment.as_binary_filename(experiment, v1) exe2 = experiment.as_binary_filename(experiment, v2) suffix = ida.get_suffix(experiment) file_base = self.filename_base(experiment, v1, v2) ida.selectIdaSuffix(exe1, suffix, experiment.path) ida.selectIdaSuffix(exe2, suffix, experiment.path) ida_call = '"%s" -A -S%s\\%s ' % (ida.ida_binary, ida.ida_scriptdir, "binarydiffer.idc") logging.info("Running BinaryDiffer %s against %s", exe1, exe2) call([ binarydiffer, exe1, exe2, self.full_filename(experiment, v1, v2), ida_call ])
def full_filename(self, experiment, v1, v2): suffix = ida.get_suffix(experiment) return ida.script_filename_raw(self.filename_base(experiment, v1, v2), suffix, self.matcher_suffix)