From c099a3714bd3fbb227aef16484dab9496edc9595 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 19 Dec 2024 12:08:37 +0100 Subject: [PATCH] Name of target binary is not always identical to the annotation id --- .../import_functions_and_types_from_pdb.py | 6 +++++- reccmp/isledecomp/compare/core.py | 14 ++++++++++---- reccmp/tools/asmcmp.py | 6 +++++- reccmp/tools/datacmp.py | 1 + reccmp/tools/roadmap.py | 6 +++++- reccmp/tools/stackcmp.py | 6 +++++- reccmp/tools/vtable.py | 6 +++++- 7 files changed, 36 insertions(+), 9 deletions(-) diff --git a/reccmp/ghidra_scripts/import_functions_and_types_from_pdb.py b/reccmp/ghidra_scripts/import_functions_and_types_from_pdb.py index 08a7f74a..1482416f 100644 --- a/reccmp/ghidra_scripts/import_functions_and_types_from_pdb.py +++ b/reccmp/ghidra_scripts/import_functions_and_types_from_pdb.py @@ -300,7 +300,11 @@ def main(): raise ValueError isle_compare = IsleCompare( - origfile, recompfile, target.recompiled_pdb, target.source_root + origfile, + recompfile, + target.recompiled_pdb, + target.source_root, + target_id=target.target_id, ) logger.info("Comparison complete.") diff --git a/reccmp/isledecomp/compare/core.py b/reccmp/isledecomp/compare/core.py index cf6b69e6..4f8b2569 100644 --- a/reccmp/isledecomp/compare/core.py +++ b/reccmp/isledecomp/compare/core.py @@ -73,11 +73,20 @@ def __init__( recomp_bin: PEImage, pdb_file: Path | str, code_dir: Path | str, + target_id: str = None, ): self.orig_bin = orig_bin self.recomp_bin = recomp_bin self.pdb_file = str(pdb_file) self.code_dir = str(code_dir) + self.target_id = target_id + if self.target_id is None: + # Assume module name is the base filename of the original binary. + self.target_id, _ = os.path.splitext( + os.path.basename(self.orig_bin.filepath) + ) + self.target_id = self.target_id.upper() + logger.warning('Assuming id="%s"', self.target_id) # Controls whether we dump the asm output to a file self.debug: bool = False self.runid: str = uuid.uuid4().hex[:8] @@ -206,11 +215,8 @@ def _load_cvdump(self): self._db.set_function_pair(self.orig_bin.entry, self.recomp_bin.entry) def _load_markers(self): - # Assume module name is the base filename of the original binary. - (module, _) = os.path.splitext(os.path.basename(self.orig_bin.filepath)) - codefiles = list(walk_source_dir(self.code_dir)) - codebase = DecompCodebase(codefiles, module.upper()) + codebase = DecompCodebase(codefiles, self.target_id) def orig_bin_checker(addr: int) -> bool: return self.orig_bin.is_valid_vaddr(addr) diff --git a/reccmp/tools/asmcmp.py b/reccmp/tools/asmcmp.py index d4a9932c..f40afb6a 100755 --- a/reccmp/tools/asmcmp.py +++ b/reccmp/tools/asmcmp.py @@ -237,7 +237,11 @@ def main(): logging.getLogger("isledecomp.compare.lines").setLevel(logging.CRITICAL) isle_compare = IsleCompare( - origfile, recompfile, target.recompiled_pdb, target.source_root + origfile, + recompfile, + target.recompiled_pdb, + target.source_root, + target_id=target.target_id, ) if args.loglevel == logging.DEBUG: diff --git a/reccmp/tools/datacmp.py b/reccmp/tools/datacmp.py index 1817e8d6..cef5058f 100755 --- a/reccmp/tools/datacmp.py +++ b/reccmp/tools/datacmp.py @@ -157,6 +157,7 @@ def do_the_comparison(target: RecCmpBuiltTarget) -> Iterable[ComparisonItem]: recompfile, target.recompiled_pdb, target.source_root, + target_id=target.target_id, ) # TODO: We don't currently retain the type information of each variable diff --git a/reccmp/tools/roadmap.py b/reccmp/tools/roadmap.py index ad9b2142..85694796 100755 --- a/reccmp/tools/roadmap.py +++ b/reccmp/tools/roadmap.py @@ -401,7 +401,11 @@ def main() -> int: assert isinstance(recomp_bin, PEImage) engine = IsleCompare( - orig_bin, recomp_bin, target.recompiled_pdb, target.source_root + orig_bin, + recomp_bin, + target.recompiled_pdb, + target.source_root, + target_id=target.target_id, ) module_map = ModuleMap(target.recompiled_pdb, recomp_bin) diff --git a/reccmp/tools/stackcmp.py b/reccmp/tools/stackcmp.py index 9c9dab1e..56be33bf 100755 --- a/reccmp/tools/stackcmp.py +++ b/reccmp/tools/stackcmp.py @@ -325,7 +325,11 @@ def main(): raise ValueError(f"{target.recompiled_path} is not a PE executable") isle_compare = IsleCompare( - origfile, recompfile, target.recompiled_pdb, target.source_root + origfile, + recompfile, + target.recompiled_pdb, + target.source_root, + target_id=target.target_id, ) if args.loglevel == logging.DEBUG: isle_compare.debug = True diff --git a/reccmp/tools/vtable.py b/reccmp/tools/vtable.py index f3d41964..5527c653 100755 --- a/reccmp/tools/vtable.py +++ b/reccmp/tools/vtable.py @@ -74,7 +74,11 @@ def main(): recomp_bin = detect_image(target.recompiled_path) assert isinstance(recomp_bin, PEImage) engine = IsleCompare( - orig_bin, recomp_bin, target.recompiled_pdb, target.source_root + orig_bin, + recomp_bin, + target.recompiled_pdb, + target.source_root, + target_id=target.target_id, ) for tbl_match in engine.compare_vtables():