mirror of
				https://github.com/isledecomp/isle.git
				synced 2025-10-25 09:24:17 +00:00 
			
		
		
		
	 b14116cc93
			
		
	
	b14116cc93
	
	
	
		
			
			* Create common print_diff function * Add pylint and black * Fix linting, move classes to utils * Add black/pylint to github actions * Fix linting * Move Bin and SymInfo into their own files * Split out format * Tidy up workdlows and pip, add readme * Lint tests, add tests to readme
		
			
				
	
	
		
			69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python3
 | |
| 
 | |
| import argparse
 | |
| import difflib
 | |
| import subprocess
 | |
| import os
 | |
| import sys
 | |
| 
 | |
| from isledecomp.utils import print_diff
 | |
| 
 | |
| parser = argparse.ArgumentParser(
 | |
|     allow_abbrev=False, description="Verify Exports: Compare the exports of two DLLs."
 | |
| )
 | |
| parser.add_argument("original", metavar="original-binary", help="The original binary")
 | |
| parser.add_argument(
 | |
|     "recompiled", metavar="recompiled-binary", help="The recompiled binary"
 | |
| )
 | |
| parser.add_argument(
 | |
|     "--no-color", "-n", action="store_true", help="Do not color the output"
 | |
| )
 | |
| 
 | |
| args = parser.parse_args()
 | |
| 
 | |
| if not os.path.isfile(args.original):
 | |
|     parser.error(f"Original binary file {args.original} does not exist")
 | |
| 
 | |
| if not os.path.isfile(args.recompiled):
 | |
|     parser.error(f"Recompiled binary {args.recompiled} does not exist")
 | |
| 
 | |
| 
 | |
| def get_file_in_script_dir(fn):
 | |
|     return os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), fn)
 | |
| 
 | |
| 
 | |
| def get_exports(file):
 | |
|     call = [get_file_in_script_dir("DUMPBIN.EXE"), "/EXPORTS"]
 | |
| 
 | |
|     if os.name != "nt":
 | |
|         call.insert(0, "wine")
 | |
|         file = subprocess.check_output(["winepath", "-w", file]).decode("utf-8").strip()
 | |
| 
 | |
|     call.append(file)
 | |
| 
 | |
|     raw = subprocess.check_output(call).decode("utf-8").split("\r\n")
 | |
|     exports = []
 | |
| 
 | |
|     start = False
 | |
| 
 | |
|     for line in raw:
 | |
|         if not start:
 | |
|             if line == "            ordinal hint   name":
 | |
|                 start = True
 | |
|         else:
 | |
|             if line:
 | |
|                 exports.append(line[27 : line.rindex("  (")])
 | |
|             elif exports:
 | |
|                 break
 | |
| 
 | |
|     return exports
 | |
| 
 | |
| 
 | |
| og_exp = get_exports(args.original)
 | |
| re_exp = get_exports(args.recompiled)
 | |
| 
 | |
| udiff = difflib.unified_diff(og_exp, re_exp)
 | |
| has_diff = print_diff(udiff, args.no_color)
 | |
| 
 | |
| sys.exit(1 if has_diff else 0)
 |