Source code

Revision control

Copy as Markdown

Other Tools

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import argparse
import os
import re
from pathlib import Path
def extract_dll_methods(file: str, list_dll, list_rejects, windows_methods):
accepted = {}
rejected = {}
with open(file, "rb") as f:
data = f.read()
pattern = re.compile(rb"[a-zA-Z]\w{2,}")
for name in pattern.findall(data):
str_name = name.decode("ascii")
if str_name in windows_methods:
accepted[str_name] = windows_methods[str_name]
else:
rejected[str_name] = 1
if list_rejects:
for name in sorted(rejected.keys()):
print(f"{name}")
elif list_dll:
for name in sorted(accepted.keys()):
print(f"{name} ({accepted[name]})")
else:
for name in sorted(accepted.keys()):
print(f"{name}")
def extract_crate_methods(crate: str):
methods = {}
pattern = re.compile('link!\\("([\\w\\.-]+)".+?\\s+fn\\s+(\\w+)\\(')
for dirpath, dirnames, filenames in os.walk(crate):
for filename in filenames:
with open(os.path.join(dirpath, filename)) as f:
data = f.read()
for method in pattern.findall(data):
methods[method[1]] = method[0]
return methods
def main():
examples = """examples:
python dom/media/tools/extractSystemCalls.py /path/to/widevinecdm.dll"""
parser = argparse.ArgumentParser(
description="Extract Windows system call usage from Windows DLL",
epilog=examples,
formatter_class=argparse.RawDescriptionHelpFormatter,
)
parser.add_argument(
"plugin",
help="path to plugin",
)
parser.add_argument(
"--list-rejects", action="store_true", help="output unknown strings instead"
)
parser.add_argument(
"--list-dll", action="store_true", help="include the system dll name"
)
parser.add_argument(
"--windows-sys-crate", help="alternate path to the rust windows-sys crate"
)
args = parser.parse_args()
# Pull out a list of win32 APIs from one of our Rust crates that we can
# cross reference against to filter out the unrelated strings.
if args.windows_sys_crate is not None:
crate_path = args.windows_sys_crate
else:
crate_path = (
Path(__file__).parents[3].joinpath("third_party", "rust", "windows-sys")
)
windows_methods = extract_crate_methods(crate_path)
# RtlGenRandom maps to SystemFunction036
windows_methods["SystemFunction036"] = "advapi32.dll"
extract_dll_methods(args.plugin, args.list_dll, args.list_rejects, windows_methods)
if __name__ == "__main__":
main()