97 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/env python
 | 
						|
 | 
						|
import sys
 | 
						|
import time
 | 
						|
import json
 | 
						|
import pefile
 | 
						|
 | 
						|
"""
 | 
						|
retrieve exe info,
 | 
						|
example for multivalue providers
 | 
						|
"""
 | 
						|
 | 
						|
 | 
						|
def unk(v):
 | 
						|
    return "unk({:04x})".format(v)
 | 
						|
 | 
						|
 | 
						|
class PE2(pefile.PE):
 | 
						|
    def __init__(self, *a, **ka):
 | 
						|
        for k in [
 | 
						|
            # -- parse_data_directories:
 | 
						|
            "parse_import_directory",
 | 
						|
            "parse_export_directory",
 | 
						|
            # "parse_resources_directory",
 | 
						|
            "parse_debug_directory",
 | 
						|
            "parse_relocations_directory",
 | 
						|
            "parse_directory_tls",
 | 
						|
            "parse_directory_load_config",
 | 
						|
            "parse_delay_import_directory",
 | 
						|
            "parse_directory_bound_imports",
 | 
						|
            # -- full_load:
 | 
						|
            "parse_rich_header",
 | 
						|
        ]:
 | 
						|
            setattr(self, k, self.noop)
 | 
						|
 | 
						|
        super(PE2, self).__init__(*a, **ka)
 | 
						|
 | 
						|
    def noop(*a, **ka):
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
try:
 | 
						|
    pe = PE2(sys.argv[1], fast_load=False)
 | 
						|
except:
 | 
						|
    sys.exit(0)
 | 
						|
 | 
						|
arch = pe.FILE_HEADER.Machine
 | 
						|
if arch == 0x14C:
 | 
						|
    arch = "x86"
 | 
						|
elif arch == 0x8664:
 | 
						|
    arch = "x64"
 | 
						|
else:
 | 
						|
    arch = unk(arch)
 | 
						|
 | 
						|
try:
 | 
						|
    buildtime = time.gmtime(pe.FILE_HEADER.TimeDateStamp)
 | 
						|
    buildtime = time.strftime("%Y-%m-%d_%H:%M:%S", buildtime)
 | 
						|
except:
 | 
						|
    buildtime = "invalid"
 | 
						|
 | 
						|
ui = pe.OPTIONAL_HEADER.Subsystem
 | 
						|
if ui == 2:
 | 
						|
    ui = "GUI"
 | 
						|
elif ui == 3:
 | 
						|
    ui = "cmdline"
 | 
						|
else:
 | 
						|
    ui = unk(ui)
 | 
						|
 | 
						|
extra = {}
 | 
						|
if hasattr(pe, "FileInfo"):
 | 
						|
    for v1 in pe.FileInfo:
 | 
						|
        for v2 in v1:
 | 
						|
            if v2.name != "StringFileInfo":
 | 
						|
                continue
 | 
						|
 | 
						|
            for v3 in v2.StringTable:
 | 
						|
                for k, v in v3.entries.items():
 | 
						|
                    v = v.decode("utf-8", "replace").strip()
 | 
						|
                    if not v:
 | 
						|
                        continue
 | 
						|
 | 
						|
                    if k in [b"FileVersion", b"ProductVersion"]:
 | 
						|
                        extra["ver"] = v
 | 
						|
 | 
						|
                    if k in [b"OriginalFilename", b"InternalName"]:
 | 
						|
                        extra["orig"] = v
 | 
						|
 | 
						|
r = {
 | 
						|
    "arch": arch,
 | 
						|
    "built": buildtime,
 | 
						|
    "ui": ui,
 | 
						|
    "cksum": "{:08x}".format(pe.OPTIONAL_HEADER.CheckSum),
 | 
						|
}
 | 
						|
r.update(extra)
 | 
						|
 | 
						|
print(json.dumps(r, indent=4))
 |