You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.2 KiB
104 lines
3.2 KiB
from __future__ import absolute_import
|
|
|
|
import os
|
|
import sys
|
|
import ctypes.util
|
|
|
|
from ctypes import c_void_p, c_size_t, byref, create_string_buffer, CDLL
|
|
|
|
from . import JavaScriptInterpreter
|
|
from .encapsulated import template
|
|
|
|
# ------------------------------------------------------------------------------- #
|
|
|
|
|
|
class ChallengeInterpreter(JavaScriptInterpreter):
|
|
|
|
# ------------------------------------------------------------------------------- #
|
|
|
|
def __init__(self):
|
|
super(ChallengeInterpreter, self).__init__('chakracore')
|
|
|
|
# ------------------------------------------------------------------------------- #
|
|
|
|
def eval(self, body, domain):
|
|
chakraCoreLibrary = None
|
|
|
|
# check current working directory.
|
|
for _libraryFile in ['libChakraCore.so', 'libChakraCore.dylib', 'ChakraCore.dll']:
|
|
if os.path.isfile(os.path.join(os.getcwd(), _libraryFile)):
|
|
chakraCoreLibrary = os.path.join(os.getcwd(), _libraryFile)
|
|
continue
|
|
|
|
if not chakraCoreLibrary:
|
|
chakraCoreLibrary = ctypes.util.find_library('ChakraCore')
|
|
|
|
if not chakraCoreLibrary:
|
|
sys.tracebacklimit = 0
|
|
raise RuntimeError(
|
|
'ChakraCore library not found in current path or any of your system library paths, '
|
|
'please download from https://www.github.com/VeNoMouS/cloudscraper/tree/ChakraCore/, '
|
|
'or https://github.com/Microsoft/ChakraCore/'
|
|
)
|
|
|
|
try:
|
|
chakraCore = CDLL(chakraCoreLibrary)
|
|
except OSError:
|
|
sys.tracebacklimit = 0
|
|
raise RuntimeError('There was an error loading the ChakraCore library {}'.format(chakraCoreLibrary))
|
|
|
|
if sys.platform != 'win32':
|
|
chakraCore.DllMain(0, 1, 0)
|
|
chakraCore.DllMain(0, 2, 0)
|
|
|
|
script = create_string_buffer(template(body, domain).encode('utf-16'))
|
|
|
|
runtime = c_void_p()
|
|
chakraCore.JsCreateRuntime(0, 0, byref(runtime))
|
|
|
|
context = c_void_p()
|
|
chakraCore.JsCreateContext(runtime, byref(context))
|
|
chakraCore.JsSetCurrentContext(context)
|
|
|
|
fname = c_void_p()
|
|
chakraCore.JsCreateString(
|
|
'iuam-challenge.js',
|
|
len('iuam-challenge.js'),
|
|
byref(fname)
|
|
)
|
|
|
|
scriptSource = c_void_p()
|
|
chakraCore.JsCreateExternalArrayBuffer(
|
|
script,
|
|
len(script),
|
|
0,
|
|
0,
|
|
byref(scriptSource)
|
|
)
|
|
|
|
jsResult = c_void_p()
|
|
chakraCore.JsRun(scriptSource, 0, fname, 0x02, byref(jsResult))
|
|
|
|
resultJSString = c_void_p()
|
|
chakraCore.JsConvertValueToString(jsResult, byref(resultJSString))
|
|
|
|
stringLength = c_size_t()
|
|
chakraCore.JsCopyString(resultJSString, 0, 0, byref(stringLength))
|
|
|
|
resultSTR = create_string_buffer(stringLength.value + 1)
|
|
chakraCore.JsCopyString(
|
|
resultJSString,
|
|
byref(resultSTR),
|
|
stringLength.value + 1,
|
|
0
|
|
)
|
|
|
|
chakraCore.JsDisposeRuntime(runtime)
|
|
|
|
return resultSTR.value
|
|
|
|
|
|
# ------------------------------------------------------------------------------- #
|
|
|
|
ChallengeInterpreter()
|