3.4.4 - Fixed
This commit is contained in:
parent
305803ca95
commit
d3fe33fceb
|
@ -17,7 +17,7 @@ by UltrafunkAmsterdam (https://github.com/ultrafunkamsterdam)
|
|||
from __future__ import annotations
|
||||
|
||||
|
||||
__version__ = "3.4.2"
|
||||
__version__ = "3.4.4"
|
||||
|
||||
import json
|
||||
import logging
|
||||
|
@ -101,7 +101,6 @@ class Chrome( selenium.webdriver.chrome.webdriver.WebDriver ):
|
|||
session_id = None
|
||||
debug = False
|
||||
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
options=None,
|
||||
|
@ -459,12 +458,10 @@ class Chrome( selenium.webdriver.chrome.webdriver.WebDriver ):
|
|||
if options.headless:
|
||||
self._configure_headless()
|
||||
|
||||
|
||||
def _configure_headless(self):
|
||||
orig_get = self.get
|
||||
logger.info("setting properties for headless")
|
||||
|
||||
|
||||
def get_wrapped(*args, **kwargs):
|
||||
if self.execute_script("return navigator.webdriver"):
|
||||
logger.info("patch navigator.webdriver")
|
||||
|
@ -601,10 +598,8 @@ class Chrome( selenium.webdriver.chrome.webdriver.WebDriver ):
|
|||
)
|
||||
return orig_get(*args, **kwargs)
|
||||
|
||||
|
||||
self.get = get_wrapped
|
||||
|
||||
|
||||
# def _get_cdc_props(self):
|
||||
# return self.execute_script(
|
||||
# """
|
||||
|
@ -639,7 +634,6 @@ class Chrome( selenium.webdriver.chrome.webdriver.WebDriver ):
|
|||
# self._hook_remove_cdc_props()
|
||||
return super().get(url)
|
||||
|
||||
|
||||
def add_cdp_listener(self, event_name, callback):
|
||||
if (
|
||||
self.reactor
|
||||
|
@ -650,18 +644,15 @@ class Chrome( selenium.webdriver.chrome.webdriver.WebDriver ):
|
|||
return self.reactor.handlers
|
||||
return False
|
||||
|
||||
|
||||
def clear_cdp_listeners(self):
|
||||
if self.reactor and isinstance(self.reactor, Reactor):
|
||||
self.reactor.handlers.clear()
|
||||
|
||||
|
||||
def window_new(self):
|
||||
self.execute(
|
||||
selenium.webdriver.remote.command.Command.NEW_WINDOW, {"type": "window"}
|
||||
)
|
||||
|
||||
|
||||
def tab_new(self, url: str):
|
||||
"""
|
||||
this opens a url in a new tab.
|
||||
|
@ -681,7 +672,6 @@ class Chrome( selenium.webdriver.chrome.webdriver.WebDriver ):
|
|||
cdp = CDP(self.options)
|
||||
cdp.tab_new(url)
|
||||
|
||||
|
||||
def reconnect(self, timeout=0.1):
|
||||
try:
|
||||
self.service.stop()
|
||||
|
@ -698,7 +688,6 @@ class Chrome( selenium.webdriver.chrome.webdriver.WebDriver ):
|
|||
except Exception as e:
|
||||
logger.debug(e)
|
||||
|
||||
|
||||
def start_session(self, capabilities=None, browser_profile=None):
|
||||
if not capabilities:
|
||||
capabilities = self.options.to_capabilities()
|
||||
|
@ -707,7 +696,6 @@ class Chrome( selenium.webdriver.chrome.webdriver.WebDriver ):
|
|||
)
|
||||
# super(Chrome, self).start_session(capabilities, browser_profile)
|
||||
|
||||
|
||||
def quit(self):
|
||||
try:
|
||||
self.service.process.kill()
|
||||
|
@ -748,7 +736,6 @@ class Chrome( selenium.webdriver.chrome.webdriver.WebDriver ):
|
|||
# this must come last, otherwise it will throw 'in use' errors
|
||||
self.patcher = None
|
||||
|
||||
|
||||
def __getattribute__(self, item):
|
||||
if not super().__getattribute__("debug"):
|
||||
return super().__getattribute__(item)
|
||||
|
@ -757,6 +744,7 @@ class Chrome( selenium.webdriver.chrome.webdriver.WebDriver ):
|
|||
|
||||
original = super().__getattribute__(item)
|
||||
if inspect.ismethod(original) and not inspect.isclass(original):
|
||||
|
||||
def newfunc(*args, **kwargs):
|
||||
logger.debug(
|
||||
"calling %s with args %s and kwargs %s\n"
|
||||
|
@ -764,30 +752,24 @@ class Chrome( selenium.webdriver.chrome.webdriver.WebDriver ):
|
|||
)
|
||||
return original(*args, **kwargs)
|
||||
|
||||
|
||||
return newfunc
|
||||
return original
|
||||
|
||||
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
|
||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||
self.service.stop()
|
||||
time.sleep(self._delay)
|
||||
self.service.start()
|
||||
self.start_session()
|
||||
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self.options.debugger_address)
|
||||
|
||||
|
||||
def __dir__(self):
|
||||
return object.__dir__(self)
|
||||
|
||||
|
||||
def __del__(self):
|
||||
try:
|
||||
self.service.process.kill()
|
||||
|
@ -795,7 +777,6 @@ class Chrome( selenium.webdriver.chrome.webdriver.WebDriver ):
|
|||
pass
|
||||
self.quit()
|
||||
|
||||
|
||||
@classmethod
|
||||
def _ensure_close(cls, self):
|
||||
# needs to be a classmethod so finalize can find the reference
|
||||
|
|
|
@ -94,9 +94,7 @@ class Patcher(object):
|
|||
self.version_full = None
|
||||
|
||||
def auto(self, executable_path=None, force=False, version_main=None):
|
||||
|
||||
if executable_path:
|
||||
|
||||
self.executable_path = executable_path
|
||||
self._custom_exe_path = True
|
||||
|
||||
|
@ -207,12 +205,7 @@ class Patcher(object):
|
|||
|
||||
@staticmethod
|
||||
def gen_random_cdc():
|
||||
# make cdc_variables without underscores
|
||||
cdc = random.choices(string.ascii_letters, k=27)
|
||||
|
||||
# cdc[-6:-4] = map(str.upper, cdc[-6:-4])
|
||||
# cdc[2] = cdc[0]
|
||||
# cdc[3] = "_"
|
||||
return "".join(cdc).encode()
|
||||
|
||||
def is_binary_patched(self, executable_path=None):
|
||||
|
@ -227,39 +220,28 @@ class Patcher(object):
|
|||
start = time.perf_counter()
|
||||
logger.info("patching driver executable %s" % self.executable_path)
|
||||
with io.open(self.executable_path, "r+b") as fh:
|
||||
#content = fh.read()
|
||||
content = fh.read()
|
||||
# match_injected_codeblock = re.search(rb"{window.*;}", content)
|
||||
#if match_injected_codeblock:
|
||||
# target_bytes = match_injected_codeblock[0]
|
||||
# new_target_bytes = (
|
||||
# b'{console.log("undetected chromedriver 1337!")}'.ljust(
|
||||
# len(target_bytes), b" "
|
||||
# )
|
||||
# )
|
||||
# new_content = content.replace(target_bytes, new_target_bytes)
|
||||
# if new_content == content:
|
||||
# logger.warning(
|
||||
# "something went wrong patching the driver binary. could not find injection code block"
|
||||
# )
|
||||
# else:
|
||||
# logger.debug(
|
||||
# "found block:\n%s\nreplacing with:\n%s"
|
||||
# % (target_bytes, new_target_bytes)
|
||||
# )
|
||||
# fh.seek(0)
|
||||
# fh.write(new_content)
|
||||
|
||||
# we just keep the cdc variables as they can't be injected anyways so no harm
|
||||
# keeping for reference
|
||||
# fh.seek(0)
|
||||
for line in iter( lambda: fh.readline() , b"" ):
|
||||
if b'cdc_' in line:
|
||||
fh.seek( -len( line ) , 1 )
|
||||
new_line = re.sub( b"cdc_.{22}_" , self.gen_random_cdc() , line )
|
||||
logger.debug( 'replaced %s\n\twith:%s' % (line , new_line) )
|
||||
fh.write( new_line )
|
||||
# else:
|
||||
# logger.info("%s seems already patched ?!?!" % self.executable_path)
|
||||
match_injected_codeblock = re.search(rb"\{window\.cdc.*?;\}", content)
|
||||
if match_injected_codeblock:
|
||||
target_bytes = match_injected_codeblock[0]
|
||||
new_target_bytes = (
|
||||
b'{console.log("undetected chromedriver 1337!")}'.ljust(
|
||||
len(target_bytes), b" "
|
||||
)
|
||||
)
|
||||
new_content = content.replace(target_bytes, new_target_bytes)
|
||||
if new_content == content:
|
||||
logger.warning(
|
||||
"something went wrong patching the driver binary. could not find injection code block"
|
||||
)
|
||||
else:
|
||||
logger.debug(
|
||||
"found block:\n%s\nreplacing with:\n%s"
|
||||
% (target_bytes, new_target_bytes)
|
||||
)
|
||||
fh.seek(0)
|
||||
fh.write(new_content)
|
||||
logger.debug(
|
||||
"patching took us {:.2f} seconds".format(time.perf_counter() - start)
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue