Commit c38b4723 authored by Vladislav Yarmak's avatar Vladislav Yarmak

win: new patch factory for 32bit library

parent 3de49e82
#!/usr/bin/env python3 #!/usr/bin/env python3
import argparse
import sys import sys
import subprocess import subprocess
import tempfile import tempfile
import os.path import os.path
from binascii import unhexlify from binascii import unhexlify
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
import itertools
PATCH_EXT = ".1337"
CRLF = b"\x0d\x0a" CRLF = b"\x0d\x0a"
HEADER_FORMAT = b">%s" HEADER_FORMAT = b">%s"
LINE_FORMAT = CRLF + b"%016X:%02X->%02X" LINE_FORMAT = CRLF + b"%016X:%02X->%02X"
...@@ -16,7 +17,6 @@ OFFSET_ADJUSTMENT = 0xC00 # shift specific to x64dbg .1337 format ...@@ -16,7 +17,6 @@ OFFSET_ADJUSTMENT = 0xC00 # shift specific to x64dbg .1337 format
def parse_args(): def parse_args():
import argparse
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Generates .1337 patch for Nvidia drivers for Windows", description="Generates .1337 patch for Nvidia drivers for Windows",
...@@ -29,18 +29,41 @@ def parse_args(): ...@@ -29,18 +29,41 @@ def parse_args():
dest="sevenzip", dest="sevenzip",
help="location of 7-zip `7z` executable") help="location of 7-zip `7z` executable")
parser.add_argument("-T", "--target", parser.add_argument("-T", "--target",
default="Display.Driver/nvcuvid64.dl_", nargs="+",
help="target location in archive") default=[
"Display.Driver/nvcuvid64.dl_",
"Display.Driver/nvcuvid32.dl_",
],
help="target location(s) in archive")
parser.add_argument("-N", "--target-name", parser.add_argument("-N", "--target-name",
default="nvcuvid.dll", nargs="+",
help="name of installed target file. Used for patch " default=[
"nvcuvid.dll",
"nvcuvid.dll",
],
help="name(s) of installed target file. Used for patch "
"header") "header")
parser.add_argument("-P", "--patch-name",
nargs="+",
default=[
"nvcuvid64.1337",
"nvcuvid32.1337",
],
help="relative filename(s) of generated patch(es)")
parser.add_argument("-S", "--search", parser.add_argument("-S", "--search",
default="FF909800000084C075", nargs="+",
help="representation of search pattern binary string") default=[
"FF909800000084C075",
"8B404CFFD084C075",
],
help="representation of search pattern(s) binary string")
parser.add_argument("-R", "--replacement", parser.add_argument("-R", "--replacement",
default="FF90980000000C0175", nargs="+",
help="representation of replacement binary string") default=[
"FF90980000000C0175",
"8B404CFFD00C0175",
],
help="representation of replacement(s) binary string")
parser.add_argument("-o", "--stdout", parser.add_argument("-o", "--stdout",
action="store_true", action="store_true",
help="output into stdout") help="output into stdout")
...@@ -162,53 +185,63 @@ def format_patch(diff, filename): ...@@ -162,53 +185,63 @@ def format_patch(diff, filename):
res += LINE_FORMAT % (offset + OFFSET_ADJUSTMENT, left, right) res += LINE_FORMAT % (offset + OFFSET_ADJUSTMENT, left, right)
return res return res
def patch_flow(installer_file, search, replacement, target, target_name, patch_name, *,
def main(): direct=False, stdout=False, sevenzip="7z"):
args = parse_args() search = unhexlify(search)
search = unhexlify(args.search) replacement = unhexlify(replacement)
replacement = unhexlify(args.replacement)
assert len(search) == len(replacement), "len() of search and replacement"\ assert len(search) == len(replacement), "len() of search and replacement"\
" is not equal" " is not equal"
for installer_file in args.installer_file: patch = make_patch(installer_file,
patch = make_patch(installer_file, arch_tgt=target,
arch_tgt=args.target, search=search,
search=search, replacement=replacement,
replacement=replacement, sevenzip=sevenzip,
sevenzip=args.sevenzip, direct=direct)
direct=args.direct) patch_content = format_patch(patch, target_name)
patch_content = format_patch(patch, args.target_name) if stdout or direct:
if args.stdout or args.direct: with open(sys.stdout.fileno(), mode='wb', closefd=False) as out:
with open(sys.stdout.fileno(), mode='wb', closefd=False) as out: out.write(patch_content)
out.write(patch_content) else:
version, product_type = identify_driver(installer_file,
sevenzip=sevenzip)
drv_prefix = {
"100": "quadro_",
"300": "",
"301": "nsd_",
}
installer_name = os.path.basename(installer_file).lower()
if 'winserv2008' in installer_name:
os_prefix = 'ws2012_x64'
elif 'winserv-2016' in installer_name:
os_prefix = 'ws2016_x64'
elif 'win10' in installer_name:
os_prefix = 'win10_x64'
elif 'win7' in installer_name:
os_prefix = 'win7_x64'
else: else:
version, product_type = identify_driver(installer_file, raise UnknownPlatformException("Can't infer platform from filename %s"
sevenzip=args.sevenzip) % (repr(installer_name),))
drv_prefix = { driver_name = drv_prefix[product_type] + version
"100": "quadro_", out_dir = os.path.join(
"300": "", os.path.dirname(
"301": "nsd_", os.path.abspath(__file__)), '..', '..', os_prefix, driver_name)
} os.makedirs(out_dir, 0o755, True)
installer_name = os.path.basename(installer_file).lower() out_filename = os.path.join(out_dir,
if 'winserv2008' in installer_name: patch_name)
os_prefix = 'ws2012_x64' with open(out_filename, 'xb') as out:
elif 'winserv-2016' in installer_name: out.write(patch_content)
os_prefix = 'ws2016_x64'
elif 'win10' in installer_name:
os_prefix = 'win10_x64' def main():
elif 'win7' in installer_name: args = parse_args()
os_prefix = 'win7_x64' if args.direct:
else: combinations = zip(args.installer_file, args.search, args.replacement,
raise UnknownPlatformException("Can't infer platform from filename %s" args.target, args.target_name, args.patch_name)
% (repr(installer_name),)) else:
driver_name = drv_prefix[product_type] + version base_params = zip(args.search, args.replacement, args.target, args.target_name, args.patch_name)
out_dir = os.path.join( combinations = ((l,) + r for l, r in itertools.product(args.installer_file, base_params))
os.path.dirname( for params in combinations:
os.path.abspath(__file__)), '..', '..', os_prefix, driver_name) patch_flow(*params, direct=args.direct, stdout=args.stdout)
os.makedirs(out_dir, 0o755, True)
out_filename = os.path.join(out_dir,
os.path.splitext(args.target_name)[0] + PATCH_EXT)
with open(out_filename, 'xb') as out:
out.write(patch_content)
if __name__ == '__main__': if __name__ == '__main__':
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment