Runtime Exec Tampering Detection, iOS Dynamic REST APIs, Datatables Export (#2339)

* Runtime Executable Tampering Detection

* Add security.py

* Code QA Performance

* Code QA Runtime EXEC tampering detection

* Corellium API QA + Domain support

* REST API Docs + Datatables export
This commit is contained in:
Ajin Abraham
2024-02-09 18:42:00 -08:00
committed by GitHub
parent 0a69464576
commit 29df4f2f03
31 changed files with 3065 additions and 322 deletions
+10 -7
View File
@@ -64,12 +64,12 @@ def ios_api_analysis(app_dir):
'cookies': [],
'crypto': [],
'network': [],
'files': set(),
'files': [],
'keychain': [],
'logs': set(),
'logs': [],
'credentials': [],
'userdefaults': {},
'pasteboard': set(),
'pasteboard': [],
'textinputs': [],
'datadir': [],
'sql': [],
@@ -90,17 +90,18 @@ def ios_api_analysis(app_dir):
elif parsed.get('crypto'):
dump['crypto'].append(parsed['crypto'])
elif parsed.get('filename'):
dump['files'].add(parsed['filename'])
dump['files'].append(parsed['filename'])
elif parsed.get('keychain'):
dump['keychain'] = parsed['keychain']
elif parsed.get('nslog'):
dump['logs'].add(parsed['nslog'])
dump['logs'].append(parsed['nslog'])
elif parsed.get('credentialstorage'):
dump['credentials'] = parsed['credentialstorage']
elif parsed.get('nsuserdefaults'):
dump['userdefaults'] = parsed['nsuserdefaults']
elif parsed.get('pasteboard'):
dump['pasteboard'].add(parsed['pasteboard'])
elif (parsed.get('pasteboard')
and parsed.get('pasteboard') not in dump['pasteboard']):
dump['pasteboard'].append(parsed['pasteboard'])
elif parsed.get('textinput'):
dump['textinputs'].append(parsed['textinput'])
elif parsed.get('network'):
@@ -111,6 +112,8 @@ def ios_api_analysis(app_dir):
dump['sql'].append(parsed['sql'])
elif parsed.get('json'):
dump['json'].append(parsed['json'])
dump['files'] = list(set(dump['files']))
dump['logs'] = list(set(dump['logs']))
if len(dump['network']) > 0:
dump['network'] = list(
{v['url']: v for v in dump['network']}.values())
@@ -18,21 +18,35 @@ from mobsf.MobSF.utils import (
SUCCESS_RESP = (200, 204)
ERROR_RESP = (400, 403, 404, 409)
OK = 'ok'
CORELLIUM_API_DOMAIN = getattr(
settings,
'CORELLIUM_API_DOMAIN',
'https://app.corellium.com')
CORELLIUM_API_KEY = getattr(
settings,
'CORELLIUM_API_KEY', '')
logger = logging.getLogger(__name__)
class CorelliumAPI:
class CorelliumInit:
def __init__(self, project_id) -> None:
self.api = 'https://app.corellium.com/api/v1'
self.api_key = getattr(settings, 'CORELLIUM_API_KEY', '')
def __init__(self) -> None:
self.api = f'{CORELLIUM_API_DOMAIN}/api/v1'
self.api_key = CORELLIUM_API_KEY
self.headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': f'Bearer {self.api_key}',
}
self.project_id = project_id
self.proxies, self.verify = upstream_proxy('https')
class CorelliumAPI(CorelliumInit):
def __init__(self, project_id) -> None:
super().__init__()
self.project_id = project_id
def api_ready(self):
"""Check API Availability."""
try:
@@ -160,17 +174,7 @@ class CorelliumAPI:
return False
class CorelliumModelsAPI:
def __init__(self) -> None:
self.api = 'https://app.corellium.com/api/v1'
self.api_key = getattr(settings, 'CORELLIUM_API_KEY', '')
self.headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': f'Bearer {self.api_key}',
}
self.proxies, self.verify = upstream_proxy('https')
class CorelliumModelsAPI(CorelliumInit):
def get_models(self):
r = requests.get(
@@ -205,18 +209,11 @@ class CorelliumModelsAPI:
return False
class CorelliumInstanceAPI:
class CorelliumInstanceAPI(CorelliumInit):
def __init__(self, instance_id) -> None:
self.api = 'https://app.corellium.com/api/v1'
self.api_key = getattr(settings, 'CORELLIUM_API_KEY', '')
self.headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': f'Bearer {self.api_key}',
}
super().__init__()
self.instance_id = instance_id
self.proxies, self.verify = upstream_proxy('https')
def start_instance(self):
"""Start instance."""
@@ -475,18 +472,11 @@ class CorelliumInstanceAPI:
return r.json()['error']
class CorelliumAgentAPI:
class CorelliumAgentAPI(CorelliumInit):
def __init__(self, instance_id) -> None:
self.api = 'https://app.corellium.com/api/v1'
self.api_key = getattr(settings, 'CORELLIUM_API_KEY', '')
self.headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': f'Bearer {self.api_key}',
}
super().__init__()
self.instance_id = instance_id
self.proxies, self.verify = upstream_proxy('https')
def agent_ready(self):
"""Agent ready."""
@@ -213,10 +213,13 @@ def list_apps(request, api=False):
bundle_ids.append(f'bundleID={bundle}')
elif r and r.get('error'):
data['message'] = r.get('error')
return send_response(failed, api)
verbose = r.get('originalError')
if verbose:
data['message'] += f' {verbose}'
return send_response(data, api)
else:
data['message'] = 'Failed to list apps'
return send_response(failed, api)
return send_response(data, api)
# Get app icons
logger.info('Getting all application icons')
ic = ca.get_icons('&'.join(bundle_ids))
@@ -572,14 +575,17 @@ def network_capture(request, api=False):
# File Download
@require_http_methods(['GET'])
@require_http_methods(['GET', 'POST'])
def live_pcap_download(request, api=False):
"""Download Network Capture."""
data = {
'status': 'failed',
'message': 'Failed to download network capture'}
try:
instance_id = request.GET['instance_id']
if api:
instance_id = request.POST['instance_id']
else:
instance_id = request.GET['instance_id']
failed = common_check(instance_id)
if failed:
return send_response(failed, api)
@@ -614,7 +620,7 @@ def ssh_execute(request, api=False):
'message': 'Failed to execute command'}
try:
instance_id = request.POST['instance_id']
cmd = request.POST.get('cmd')
cmd = request.POST['cmd']
failed = common_check(instance_id)
if failed:
return send_response(failed, api)
@@ -762,7 +768,7 @@ def system_logs(request, api=False):
return send_response(failed, api)
ci = CorelliumInstanceAPI(instance_id)
data = {'status': 'ok', 'message': ci.console_log()}
return send_response(data)
return send_response(data, api)
logger.info('Getting system logs')
instance_id = request.GET['instance_id']
failed = common_check(instance_id)
@@ -780,7 +786,7 @@ def system_logs(request, api=False):
logger.exception(err)
if request.method == 'POST':
data['message'] = str(exp)
return send_response(data)
return send_response(data, api)
return print_n_send_error_response(request, err, api)
# AJAX
@@ -810,7 +816,7 @@ def upload_file(request, api=False):
except Exception as exp:
logger.exception(err_msg)
data['message'] = str(exp)
return send_response(data)
return send_response(data, api)
# File Download
@@ -90,13 +90,19 @@ def dynamic_analysis(request, api=False):
def dynamic_analyzer(request, api=False):
"""Dynamic Analyzer for in-device iOS apps."""
try:
bundleid = request.GET.get('bundleid')
if api:
bundleid = request.POST.get('bundle_id')
else:
bundleid = request.GET.get('bundleid')
if not bundleid or not strict_package_check(bundleid):
return print_n_send_error_response(
request,
'Invalid iOS Bundle id',
api)
instance_id = request.GET.get('instance_id')
if api:
instance_id = request.POST.get('instance_id')
else:
instance_id = request.GET.get('instance_id')
failed = common_check(instance_id)
if failed:
return print_n_send_error_response(
@@ -109,12 +115,16 @@ def dynamic_analyzer(request, api=False):
app_dir.mkdir()
ci = CorelliumInstanceAPI(instance_id)
configure_proxy(request, bundleid, ci)
if api:
form = None
else:
form = UploadFileForm()
context = {
'hash': bundle_hash,
'instance_id': instance_id,
'bundle_id': bundleid,
'version': settings.MOBSF_VER,
'form': UploadFileForm(),
'form': form,
'title': 'iOS Dynamic Analyzer'}
template = 'dynamic_analysis/ios/dynamic_analyzer.html'
if api:
+4 -1
View File
@@ -36,7 +36,10 @@ def ios_view_report(request, bundle_id, api=False):
"""Dynamic Analysis Report Generation."""
logger.info('iOS Dynamic Analysis Report Generation')
try:
instance_id = request.GET.get('instance_id')
if api:
instance_id = request.POST.get('instance_id')
else:
instance_id = request.GET.get('instance_id')
if instance_id and not common_check(instance_id):
dev = instance_id
else:
@@ -107,6 +107,7 @@ def ios_instrument(request, api=False):
args = (None, None)
Thread(target=frida_obj.session, args=args, daemon=True).start()
data['status'] = OK
data['message'] = 'Frida Instrumentation successful'
except Exception as exp:
logger.exception('Frida Instrumentation failed')
data['message'] = str(exp)
+1 -1
View File
@@ -10,7 +10,7 @@ from mobsf.install.windows.setup import windows_config_local
logger = logging.getLogger(__name__)
VERSION = '3.9.3'
VERSION = '3.9.4'
BANNER = """
__ __ _ ____ _____ _____ ___
| \/ | ___ | |__/ ___|| ___|_ _|___ // _ \
+188
View File
@@ -0,0 +1,188 @@
"""Runtime Executable Tampering Detection."""
import subprocess
import functools
import logging
import sys
from shutil import which
from pathlib import Path
from concurrent.futures import ThreadPoolExecutor
from mobsf.MobSF.utils import (
find_java_binary,
gen_sha256_hash,
get_adb,
sha256,
)
from django.conf import settings
logger = logging.getLogger(__name__)
# Non executable files at host level
_SKIP = [
'.pyc', '.js',
'.json', '.txt', '.md']
EXECUTABLE_HASH_MAP = None
def get_sha256(filepath):
"""Calculate sha256 hash of a file."""
return (filepath.as_posix(), sha256(filepath))
def get_all_files(dirlocs):
"""Get all files from a list of directories/files."""
for dirloc in dirlocs:
if dirloc.is_file() and dirloc.suffix not in _SKIP:
yield dirloc
elif dirloc.is_dir():
# Use a generator expression for efficient filtering
files_in_dir = (
efile for efile in dirloc.rglob('*')
if efile.is_file() and efile.suffix not in _SKIP
)
# Yield all files from the filtered generator
yield from files_in_dir
def generate_hashes(dirlocs):
"""Generate master hash for all files."""
exec_hashes = {}
with ThreadPoolExecutor() as executor:
futures = []
for efile in get_all_files(dirlocs):
futures.append(
executor.submit(get_sha256, efile))
for future in futures:
sha = future.result()
exec_hashes[sha[0]] = sha[1]
return exec_hashes, gen_sha256_hash(str(exec_hashes))
def get_executable_hashes():
# Internal Binaries shipped with MobSF
base = Path(settings.BASE_DIR)
manage_py = base.parent / 'manage.py'
exec_loc = [
base / 'DynamicAnalyzer' / 'tools',
base / 'StaticAnalyzer' / 'tools',
manage_py,
]
# External binaries used directly by MobSF
system_bins = [
'adb',
'which',
'wkhtmltopdf',
'httptools',
'mitmdump',
'unzip',
'lipo',
'ar',
'nm',
'objdump',
'strings',
'xcrun',
'BinSkim.exe',
'BinScope.exe',
'nuget.exe',
]
for sbin in system_bins:
bin_path = which(sbin)
if bin_path:
exec_loc.append(Path(bin_path))
# User defined path/binaries
if settings.JAVA_DIRECTORY:
exec_loc.append(Path(settings.JAVA_DIRECTORY))
user_defined_bins = [
sys.executable,
settings.JADX_BINARY,
settings.BACKSMALI_BINARY,
settings.VD2SVG_BINARY,
settings.APKTOOL_BINARY,
settings.ADB_BINARY,
settings.JTOOL_BINARY,
settings.CLASSDUMP_BINARY,
settings.CLASSDUMP_SWIFT_BINARY,
]
for ubin in user_defined_bins:
if ubin:
exec_loc.append(Path(ubin))
# Add ADB and Java binaries
adb = get_adb()
java = find_java_binary()
if adb == 'adb':
adb = which('adb')
if java == 'java':
java = which('java')
if adb:
exec_loc.append(Path(adb))
if java:
exec_loc.append(Path(java))
return generate_hashes(exec_loc)
def store_exec_hashes_at_first_run():
"""Store executable hashes at first run."""
try:
global EXECUTABLE_HASH_MAP
hashes, signature = get_executable_hashes()
hashes['signature'] = signature
EXECUTABLE_HASH_MAP = hashes
except Exception:
logger.warning('Cannot calculate executable hashes, '
'disabling runtime executable '
'tampering detection')
def subprocess_hook(oldfunc, *args, **kwargs):
global EXECUTABLE_HASH_MAP
exec1 = args[0][0] # executable
exec2 = None # secondary executable
for arg in args[0]:
if arg.endswith('.jar'):
exec2 = Path(arg).as_posix()
if '/' in exec1 or '\\' in exec1:
exec1 = Path(exec1).as_posix()
else:
exec1 = Path(which(exec1)).as_posix()
executable_in_hash_map = False
if exec1 in EXECUTABLE_HASH_MAP:
executable_in_hash_map = True
if EXECUTABLE_HASH_MAP[exec1] != sha256(exec1):
msg = (
f'Executable Tampering Detected. [{exec1}]'
' has been modified during runtime')
logger.error(msg)
raise Exception(msg)
if exec2 and exec1 in EXECUTABLE_HASH_MAP:
executable_in_hash_map = True
if EXECUTABLE_HASH_MAP[exec2] != sha256(exec2):
msg = (
f'JAR Tampering Detected. [{exec2}]'
' has been modified during runtime')
logger.error(msg)
raise Exception(msg)
if not executable_in_hash_map:
logger.warning('Executable [%s] not found in known hashes, '
'skipping runtime executable '
'tampering detection', exec1)
_, signature = get_executable_hashes()
if EXECUTABLE_HASH_MAP['signature'] != signature:
msg = 'Executable/Library Tampering Detected'
logger.error(msg)
raise Exception(msg)
return oldfunc(*args, **kwargs)
def init_exec_hooks():
subprocess.Popen = wrap_function(
subprocess.Popen,
subprocess_hook)
def wrap_function(oldfunction, newfunction):
@functools.wraps(oldfunction)
def run(*args, **kwargs):
return newfunction(oldfunction, *args, **kwargs)
return run
+1 -5
View File
@@ -372,7 +372,6 @@ else:
JADX_BINARY = os.getenv('MOBSF_JADX_BINARY', '')
BACKSMALI_BINARY = os.getenv('MOBSF_BACKSMALI_BINARY', '')
VD2SVG_BINARY = os.getenv('MOBSF_VD2SVG_BINARY', '')
BATIK_BINARY = os.getenv('MOBSF_BATIK_BINARY', '')
APKTOOL_BINARY = os.getenv('MOBSF_APKTOOL_BINARY', '')
ADB_BINARY = os.getenv('MOBSF_ADB_BINARY', '')
@@ -383,15 +382,11 @@ else:
# COMMON
JAVA_DIRECTORY = os.getenv('MOBSF_JAVA_DIRECTORY', '')
VBOXMANAGE_BINARY = os.getenv('MOBSF_VBOXMANAGE_BINARY', '')
PYTHON3_PATH = os.getenv('MOBSF_PYTHON3_PATH', '')
"""
Examples:
JAVA_DIRECTORY = 'C:/Program Files/Java/jdk1.7.0_17/bin/'
JAVA_DIRECTORY = '/usr/bin/'
VBOXMANAGE_BINARY = '/usr/bin/VBoxManage'
PYTHON3_PATH = 'C:/Users/Ajin/AppData/Local/Programs/Python/Python35-32/'
JADX_BINARY = 'C:/Users/Ajin/AppData/Local/Programs/jadx/bin/jadx.bat'
JADX_BINARY = '/Users/ajin/jadx/bin/jadx'
"""
@@ -440,6 +435,7 @@ else:
# if VT_UPLOAD is set to True.
# ===============================================
# =======IOS DYNAMIC ANALYSIS SETTINGS===========
CORELLIUM_API_DOMAIN = os.getenv('MOBSF_CORELLIUM_API_DOMAIN', '')
CORELLIUM_API_KEY = os.getenv('MOBSF_CORELLIUM_API_KEY', '')
CORELLIUM_PROJECT_ID = os.getenv('MOBSF_CORELLIUM_PROJECT_ID', '')
# CORELLIUM_PROJECT_ID is optional, MobSF will use any available project id
+62 -3
View File
@@ -18,9 +18,14 @@ from mobsf.DynamicAnalyzer.views.ios import (
tests_frida as ios_tests_frida,
)
from mobsf.MobSF import utils
from mobsf.MobSF.security import (
init_exec_hooks,
store_exec_hashes_at_first_run,
)
from mobsf.MobSF.views import home
from mobsf.MobSF.views.api import api_static_analysis as api_sz
from mobsf.MobSF.views.api import api_dynamic_analysis as api_dz
from mobsf.MobSF.views.api import api_android_dynamic_analysis as api_dz
from mobsf.MobSF.views.api import api_ios_dynamic_analysis as api_idz
from mobsf.StaticAnalyzer import tests
from mobsf.StaticAnalyzer.views.common import (
appsec,
@@ -65,7 +70,6 @@ urlpatterns = [
re_path(r'^api/v1/dynamic/start_analysis$', api_dz.api_start_analysis),
re_path(r'^api/v1/dynamic/stop_analysis$', api_dz.api_stop_analysis),
re_path(r'^api/v1/dynamic/report_json$', api_dz.api_dynamic_report),
re_path(r'^api/v1/dynamic/view_source$', api_dz.api_dynamic_view_file),
# Android Specific
re_path(r'^api/v1/android/logcat$', api_dz.api_logcat),
re_path(r'^api/v1/android/mobsfy$', api_dz.api_mobsfy),
@@ -78,11 +82,64 @@ urlpatterns = [
# Frida
re_path(r'^api/v1/frida/instrument$', api_dz.api_instrument),
re_path(r'^api/v1/frida/api_monitor$', api_dz.api_api_monitor),
re_path(r'^api/v1/frida/logs$', api_dz.api_frida_logs),
re_path(r'^api/v1/frida/get_dependencies$', api_dz.api_get_dependencies),
# Shared
re_path(r'^api/v1/frida/logs$', api_dz.api_frida_logs),
re_path(r'^api/v1/frida/list_scripts$', api_dz.api_list_frida_scripts),
re_path(r'^api/v1/frida/get_script$', api_dz.api_get_script),
re_path(r'^api/v1/dynamic/view_source$', api_dz.api_dynamic_view_file),
# iOS Specific
re_path(r'^api/v1/ios/corellium_supported_models$',
api_idz.api_corellium_get_supported_models),
re_path(r'^api/v1/ios/corellium_ios_versions$',
api_idz.api_corellium_get_supported_ios_versions),
re_path(r'^api/v1/ios/corellium_create_ios_instance$',
api_idz.api_corellium_create_ios_instance),
re_path(r'^api/v1/ios/dynamic_analysis$',
api_idz.api_ios_dynamic_analysis),
re_path(r'^api/v1/ios/corellium_start_instance$',
api_idz.api_corellium_start_instance),
re_path(r'^api/v1/ios/corellium_stop_instance$',
api_idz.api_corellium_stop_instance),
re_path(r'^api/v1/ios/corellium_unpause_instance$',
api_idz.api_corellium_unpause_instance),
re_path(r'^api/v1/ios/corellium_reboot_instance$',
api_idz.api_corellium_reboot_instance),
re_path(r'^api/v1/ios/corellium_destroy_instance$',
api_idz.api_corellium_destroy_instance),
re_path(r'^api/v1/ios/corellium_list_apps$',
api_idz.api_corellium_instance_list_apps),
re_path(r'^api/v1/ios/setup_environment$',
api_idz.api_setup_environment),
re_path(r'^api/v1/ios/dynamic_analyzer$',
api_idz.api_ios_dynamic_analyzer),
re_path(r'^api/v1/ios/run_app$',
api_idz.api_run_app),
re_path(r'^api/v1/ios/remove_app$',
api_idz.api_remove_app),
re_path(r'^api/v1/ios/take_screenshot$',
api_idz.api_take_screenshot),
re_path(r'^api/v1/ios/get_app_container_path$',
api_idz.api_get_app_container_path),
re_path(r'^api/v1/ios/network_capture$',
api_idz.api_network_capture),
re_path(r'^api/v1/ios/live_pcap_download$',
api_idz.api_live_pcap_download),
re_path(r'^api/v1/ios/ssh_execute$',
api_idz.api_ssh_execute),
re_path(r'^api/v1/ios/download_app_data$',
api_idz.api_download_app_data),
re_path(r'^api/v1/ios/instance_input$',
api_idz.api_instance_input),
re_path(r'^api/v1/ios/system_logs$',
api_idz.api_system_logs),
re_path(r'^api/v1/ios/file_upload$',
api_idz.api_device_file_upload),
re_path(r'^api/v1/ios/file_download$',
api_idz.api_device_file_download),
# Frida
re_path(r'^api/v1/frida/ios_instrument$', api_idz.api_ios_instrument),
re_path(r'^api/v1/dynamic/ios_report_json$', api_idz.api_ios_view_report),
]
if settings.API_ONLY == '0':
urlpatterns.extend([
@@ -299,3 +356,5 @@ if settings.API_ONLY == '0':
])
utils.print_version()
init_exec_hooks()
store_exec_hashes_at_first_run()
-16
View File
@@ -179,22 +179,6 @@ def find_java_binary():
return 'java'
def run_process(args):
try:
proc = subprocess.Popen(
args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
dat = ''
while True:
line = proc.stdout.readline()
if not line:
break
dat += str(line)
return dat
except Exception:
logger.error('Finding Java path - Cannot Run Process')
return ''
def print_n_send_error_response(request,
msg,
api=False,
@@ -0,0 +1,389 @@
# -*- coding: utf_8 -*-
"""MobSF REST API V 1."""
from django.views.decorators.csrf import csrf_exempt
from mobsf.MobSF.views.helpers import request_method
from mobsf.MobSF.views.api.api_middleware import make_api_response
from mobsf.DynamicAnalyzer.views.ios import (
corellium_instance,
dynamic_analyzer,
report,
tests_frida,
)
FAILED = 'failed'
ERROR = 'error'
INSTANCE_ID = 'instance_id'
BUNDLE_ID = 'bundle_id'
# Dynamic Analyzer APIs
@request_method(['POST'])
@csrf_exempt
def api_ios_dynamic_analysis(request):
"""POST - iOS Dynamic Analysis Entrypoint."""
resp = dynamic_analyzer.dynamic_analysis(request, True)
if ERROR in resp:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_ios_dynamic_analyzer(request):
"""POST - iOS Dynamic Analyzer."""
params = {INSTANCE_ID, BUNDLE_ID}
if set(request.POST) < params:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = dynamic_analyzer.dynamic_analyzer(request, True)
if ERROR in resp:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
# Corellium Instance Operations
@request_method(['POST'])
@csrf_exempt
def api_corellium_get_supported_models(request):
"""POST - Corellium Get Supported iOS Models."""
resp = corellium_instance.get_supported_models(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_corellium_get_supported_ios_versions(request):
"""POST - Corellium Get Supported iOS Versions."""
if 'model' not in request.POST:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.get_supported_os(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_corellium_create_ios_instance(request):
"""POST - Corellium Create an iOS Instance."""
params = {'project_id', 'flavor', 'version'}
if set(request.POST) < params:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.create_vm_instance(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_corellium_start_instance(request):
"""POST - Start Corellium Instance."""
if INSTANCE_ID not in request.POST:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.start_instance(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_corellium_stop_instance(request):
"""POST - Stop Corellium Instance."""
if INSTANCE_ID not in request.POST:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.stop_instance(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_corellium_unpause_instance(request):
"""POST - Unpause Corellium Instance."""
if INSTANCE_ID not in request.POST:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.unpause_instance(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_corellium_reboot_instance(request):
"""POST - Reboot Corellium Instance."""
if INSTANCE_ID not in request.POST:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.reboot_instance(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_corellium_destroy_instance(request):
"""POST - Destroy Corellium Instance."""
if INSTANCE_ID not in request.POST:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.destroy_instance(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_corellium_instance_list_apps(request):
"""POST - Corellium Instance List Apps."""
if INSTANCE_ID not in request.POST:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.list_apps(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
# Dynamic Analyzer Helpers
@request_method(['POST'])
@csrf_exempt
def api_setup_environment(request):
"""POST - Setup Dynamic Analyzer Environment."""
params = {INSTANCE_ID, 'hash'}
if set(request.POST) < params:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.setup_environment(
request,
request.POST['hash'],
True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_run_app(request):
"""POST - Run an App."""
params = {INSTANCE_ID, BUNDLE_ID}
if set(request.POST) < params:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.run_app(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_remove_app(request):
"""POST - Remove an App from Device."""
params = {INSTANCE_ID, BUNDLE_ID}
if set(request.POST) < params:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.remove_app(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_take_screenshot(request):
"""POST - Take a Screenshot."""
if INSTANCE_ID not in request.POST:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.take_screenshot(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_get_app_container_path(request):
"""POST - Get App Container path."""
if BUNDLE_ID not in request.POST:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.get_container_path(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_network_capture(request):
"""POST - Enable/Disable Network Capture."""
params = {INSTANCE_ID, 'state'}
if set(request.POST) < params:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.network_capture(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_live_pcap_download(request):
"""POST - Download Network Capture file."""
if INSTANCE_ID not in request.POST:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.live_pcap_download(request, True)
if resp.get('Content-Disposition'):
# PCAP file http response
return resp
elif resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_ssh_execute(request):
"""POST - Execute commands in VM over SSH."""
params = {INSTANCE_ID, 'cmd'}
if set(request.POST) < params:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.ssh_execute(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_download_app_data(request):
"""POST - Download Application Data from Device."""
params = {INSTANCE_ID, BUNDLE_ID}
if set(request.POST) < params:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.download_data(
request,
request.POST[BUNDLE_ID],
True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_instance_input(request):
"""POST - Sending Touch/Swipe/Text Events."""
if INSTANCE_ID not in request.POST:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.touch(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_system_logs(request):
"""POST - Get system logs."""
if INSTANCE_ID not in request.POST:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.system_logs(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_device_file_upload(request):
"""POST - Upload file to device."""
if INSTANCE_ID not in request.POST:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.upload_file(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@request_method(['POST'])
@csrf_exempt
def api_device_file_download(request):
"""POST - Download file from device."""
params = {INSTANCE_ID, 'file'}
if set(request.POST) < params:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = corellium_instance.download_file(request, True)
if resp.get('Content-Disposition'):
# file http response
return resp
elif resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
# Frida APIs
@request_method(['POST'])
@csrf_exempt
def api_ios_instrument(request):
"""POST - Frida Instrument."""
params = {
INSTANCE_ID,
BUNDLE_ID,
'hash',
'default_hooks',
'dump_hooks',
'auxiliary_hooks',
'frida_code'}
if set(request.POST) < params:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = tests_frida.ios_instrument(request, True)
if resp.get('status') == FAILED:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
# Report APIs
@request_method(['POST'])
@csrf_exempt
def api_ios_view_report(request):
"""POST - iOS Dynamic Analysis report."""
params = {INSTANCE_ID, BUNDLE_ID}
if set(request.POST) < params:
return make_api_response(
{'error': 'Missing Parameters'}, 422)
resp = report.ios_view_report(
request,
request.POST[BUNDLE_ID],
True)
if 'error' in resp:
return make_api_response(resp, 500)
return make_api_response(resp, 200)
@@ -302,6 +302,11 @@ class ELFChecksec:
elf_strings = None
if not elf_strings:
elf_strings = strings_on_binary(self.elf_path)
for i in elf_strings:
if isinstance(i, bytes):
tmp = i.decode('utf-8', errors='ignore')
elf_strings.remove(i)
elf_strings.append(tmp)
return elf_strings
def get_symbols(self):
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+46
View File
@@ -0,0 +1,46 @@
//Datatables
$(function () {
// Datatable
$('table').DataTable({
"paging": true,
"lengthChange": false,
"searching": true,
"ordering": true,
"info": true,
"autoWidth": true,
"responsive": true,
"dom": '<"top"<"left-col"><"center-col"Bl><"right-col"f>>rtip',
"buttons": [
{
extend: 'copy',
text: '<i class="fa fa-copy"></i>',
title: '',
className: 'btn-default btn-sm-menu btn-xs',
},
{
extend: 'csv',
text: '<i class="fas fa-file-csv"></i>',
title: '',
className: 'btn-default btn-sm-menu btn-xs',
},
{
extend: 'excel',
text: '<i class="fa fa-file-excel"></i>',
title: '',
className: 'btn-default btn-sm-menu btn-xs',
},
{
extend: 'pdf',
text: '<i class="fa fa-file-pdf"></i>',
title: '',
className: 'btn-default btn-sm-menu btn-xs',
},
{
extend: 'print',
text: '<i class="fa fa-print"></i>',
title: '',
className: 'btn-default btn-sm-menu btn-xs',
},
],
});
});
@@ -6,7 +6,7 @@
{% endblock %}
{% block extra_css %}
<!-- DataTables -->
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
<link rel="stylesheet" href="{% static "others/css/spinner.css" %}">
<link href="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.css" %}" rel="stylesheet">
<style>
@@ -278,8 +278,10 @@ textarea:focus {
{% endblock %}
{% block extra_scripts %}
<!-- DataTables -->
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
<script src="{% static "others/js/datatables_init.js" %}"></script>
<script>
function dynamic_loader(){
var loadingOverlay = document.querySelector('.loading');
@@ -321,20 +323,5 @@ function dynamic_loader(){
return false;
});
//Datatables
$(function () {
// Datatable
$('table').DataTable({
"paging": true,
"lengthChange": false,
"searching": true,
"ordering": false,
"info": true,
"autoWidth": true,
"responsive": true,
});
});
</script>
{% endblock %}
@@ -5,7 +5,7 @@
{% endblock %}
{% block extra_css %}
<!-- DataTables -->
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
<style type="text/css" media="print">
@page { size: landscape; }
@media print {
@@ -945,25 +945,15 @@
<!--end new UI-->
{% block extra_scripts %}
<!-- DataTables -->
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
<script src="{% static "others/js/datatables_init.js" %}"></script>
<script src="{% static "amcharts/core.js" %}"></script>
<script src="{% static "amcharts/maps.js" %}"></script>
<script src="{% static "amcharts/worldIndiaLow.js" %}"></script>
<script src="{% static "amcharts/animated.js" %}"></script>
<script>
$(function () {
// Datatable
$('table').DataTable({
"paging": true,
"lengthChange": false,
"searching": true,
"ordering": true,
"info": true,
"autoWidth": true,
"responsive": true,
});
});
// Navbar Active
$(".nav-link").on("click", function() {
$(".nav-link").removeClass("active");
@@ -5,8 +5,8 @@
{% endblock %}
{% block extra_css %}
<!-- DataTables -->
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
<style type="text/css" media="print">
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
<style type="text/css" media="print">
@page { size: landscape; }
@media print {
.btn, #scan_options {
@@ -1309,26 +1309,16 @@ pre {
<!--end new UI-->
{% block extra_scripts %}
<!-- DataTables -->
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
<script src="{% static "others/js/datatables_init.js" %}"></script>
<script src="{% static "amcharts/core.js" %}"></script>
<script src="{% static "amcharts/maps.js" %}"></script>
<script src="{% static "amcharts/worldIndiaLow.js" %}"></script>
<script src="{% static "amcharts/animated.js" %}"></script>
<script type="text/javascript" src="{% static "enlighterjs/enlighterjs.min.js" %}"></script>
<script>
$(function () {
// Datatable
$('table').DataTable({
"paging": true,
"lengthChange": false,
"searching": true,
"ordering": true,
"info": true,
"autoWidth": true,
"responsive": true,
});
});
// Navbar Active
$(".nav-link").on("click", function() {
$(".nav-link").removeClass("active");
File diff suppressed because it is too large Load Diff
@@ -5,9 +5,8 @@
{% endblock %}
{% block extra_css %}
<link href="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.css" %}" rel="stylesheet">
<!-- DataTables -->
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
<link rel="stylesheet" href="{% static "others/css/spinner.css" %}">
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
<style type="text/css" media="print">
@page { size: landscape; }
@media print {
@@ -2407,8 +2406,10 @@
<!--end new UI-->
{% block extra_scripts %}
<!-- DataTables -->
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %}"></script>
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
<script src="{% static "others/js/datatables_init.js" %}"></script>
<script src="{% static "amcharts/core.js" %}"></script>
<script src="{% static "amcharts/maps.js" %}"></script>
<script src="{% static "amcharts/worldIndiaLow.js" %}"></script>
@@ -2421,6 +2422,23 @@
var delete_suppression_url = '{% url 'delete_suppression' %}';
</script>
<script src="{% static "others/js/suppression.js" %}"></script>
<style>
.left-col {
float: left;
width: 25%;
}
.center-col {
float: left;
width: 75%;
}
.right-col {
float: left;
width: 25%;
}
</style>
<script>
// Remove rescan parameter
@@ -2431,18 +2449,6 @@
const pkg = '{{ package_name }}'
const hash = '{{md5}}'
$(function () {
// Datatable
$('table').DataTable({
"paging": true,
"lengthChange": false,
"searching": true,
"ordering": true,
"info": true,
"autoWidth": true,
"responsive": true,
});
});
// Navbar Active
$(".nav-link").on("click", function() {
$(".nav-link").removeClass("active");
@@ -6,8 +6,8 @@
{% block extra_css %}
<link href="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.css" %}" rel="stylesheet">
<!-- DataTables -->
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
<style type="text/css" media="print">
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
<style type="text/css" media="print">
@page { size: landscape; }
@media print {
.btn, #scan_options {
@@ -1821,8 +1821,10 @@
{% block extra_scripts %}
<script src="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.js" %}"></script>
<!-- DataTables -->
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
<script src="{% static "others/js/datatables_init.js" %}"></script>
<script src="{% static "amcharts/core.js" %}"></script>
<script src="{% static "amcharts/maps.js" %}"></script>
<script src="{% static "amcharts/worldIndiaLow.js" %}"></script>
@@ -1844,18 +1846,6 @@
const pkg = '{{ package_name }}'
const hash = '{{md5}}'
$(function () {
// Datatable
$('table').DataTable({
"paging": true,
"lengthChange": false,
"searching": true,
"ordering": true,
"info": true,
"autoWidth": true,
"responsive": true,
});
});
// Navbar Active
$(".nav-link").on("click", function() {
$(".nav-link").removeClass("active");
@@ -5,7 +5,7 @@
{% endblock %}
{% block extra_css %}
<!-- DataTables -->
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
<link href="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.css" %}" rel="stylesheet">
<style type="text/css" media="print">
@page { size: landscape; }
@@ -1750,8 +1750,10 @@
<!--end new UI-->
{% block extra_scripts %}
<!-- DataTables -->
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
<script src="{% static "others/js/datatables_init.js" %}"></script>
<script src="{% static "amcharts/core.js" %}"></script>
<script src="{% static "amcharts/maps.js" %}"></script>
<script src="{% static "amcharts/worldIndiaLow.js" %}"></script>
@@ -1775,18 +1777,7 @@
const pkg = '{{ bundle_id }}'
const hash = '{{ md5 }}'
$(function () {
// Datatable
$('table').DataTable({
"paging": true,
"lengthChange": false,
"searching": true,
"ordering": true,
"info": true,
"autoWidth": true,
"responsive": true,
});
});
// Navbar Active
$(".nav-link").on("click", function() {
$(".nav-link").removeClass("active");
@@ -5,8 +5,8 @@
{% endblock %}
{% block extra_css %}
<!-- DataTables -->
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
<link href="{% static "adminlte/plugins/sweetalert2/sweetalert2.min.css" %}" rel="stylesheet">
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
<style type="text/css" media="print">
@page { size: landscape; }
@@ -1287,8 +1287,10 @@
<!--end new UI-->
{% block extra_scripts %}
<!-- DataTables -->
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
<script src="{% static "others/js/datatables_init.js" %}"></script>
<script src="{% static "amcharts/core.js" %}"></script>
<script src="{% static "amcharts/maps.js" %}"></script>
<script src="{% static "amcharts/worldIndiaLow.js" %}"></script>
@@ -1311,18 +1313,7 @@
const pkg = '{{ bundle_id }}'
const hash = '{{ md5 }}'
$(function () {
// Datatable
$('table').DataTable({
"paging": true,
"lengthChange": false,
"searching": true,
"ordering": true,
"info": true,
"autoWidth": true,
"responsive": true,
});
});
// Navbar Active
$(".nav-link").on("click", function() {
$(".nav-link").removeClass("active");
@@ -5,7 +5,7 @@
{% endblock %}
{% block extra_css %}
<!-- DataTables -->
<link rel="stylesheet" href="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.css" %}">
<link href="{% static "datatables/css/datatables.combined.min.css" %}" rel="stylesheet">
<style type="text/css" media="print">
@page { size: landscape; }
@media print {
@@ -387,25 +387,15 @@
<!--end new UI-->
{% block extra_scripts %}
<!-- DataTables -->
<script src="{% static "adminlte/plugins/datatables/jquery.dataTables.min.js" %} "></script>
<script src="{% static "adminlte/plugins/datatables-bs4/dataTables.bootstrap4.min.js" %}"></script>
<script src="{% static "datatables/js/pdfmake.min.js" %}"></script>
<script src="{% static "datatables/js/vfs_fonts.js" %}"></script>
<script src="{% static "datatables/js/datatables.combined.min.js" %}"></script>
<script src="{% static "others/js/datatables_init.js" %}"></script>
<script>
// Remove rescan parameter
window.history.replaceState({}, '', window.location.pathname);
$(function () {
// Datatable
$('table').DataTable({
"paging": true,
"lengthChange": false,
"searching": true,
"ordering": true,
"info": true,
"autoWidth": true,
"responsive": true,
});
});
// Navbar Active
$(".nav-link").on("click", function() {
$(".nav-link").removeClass("active");
Generated
+126 -115
View File
@@ -224,19 +224,22 @@ typecheck = ["mypy"]
[[package]]
name = "beautifulsoup4"
version = "4.12.2"
version = "4.12.3"
description = "Screen-scraping library"
optional = false
python-versions = ">=3.6.0"
files = [
{file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"},
{file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"},
{file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"},
{file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"},
]
[package.dependencies]
soupsieve = ">1.2"
[package.extras]
cchardet = ["cchardet"]
chardet = ["chardet"]
charset-normalizer = ["charset-normalizer"]
html5lib = ["html5lib"]
lxml = ["lxml"]
@@ -377,12 +380,13 @@ files = [
[[package]]
name = "bs4"
version = "0.0.1"
description = "Dummy package for Beautiful Soup"
version = "0.0.2"
description = "Dummy package for Beautiful Soup (beautifulsoup4)"
optional = false
python-versions = "*"
files = [
{file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"},
{file = "bs4-0.0.2-py2.py3-none-any.whl", hash = "sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc"},
{file = "bs4-0.0.2.tar.gz", hash = "sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925"},
]
[package.dependencies]
@@ -859,13 +863,13 @@ typing = ["typing-extensions (>=4.8)"]
[[package]]
name = "flask"
version = "3.0.0"
version = "3.0.1"
description = "A simple framework for building complex web applications."
optional = false
python-versions = ">=3.8"
files = [
{file = "flask-3.0.0-py3-none-any.whl", hash = "sha256:21128f47e4e3b9d597a3e8521a329bf56909b690fcc3fa3e477725aa81367638"},
{file = "flask-3.0.0.tar.gz", hash = "sha256:cfadcdb638b609361d29ec22360d6070a77d7463dcb3ab08d2c2f2f168845f58"},
{file = "flask-3.0.1-py3-none-any.whl", hash = "sha256:ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13"},
{file = "flask-3.0.1.tar.gz", hash = "sha256:6489f51bb3666def6f314e15f19d50a1869a19ae0e8c9a3641ffe66c77d42403"},
]
[package.dependencies]
@@ -1373,34 +1377,41 @@ semgrep = {version = "0.117.0", markers = "sys_platform != \"win32\""}
[[package]]
name = "lief"
version = "0.13.2"
version = "0.14.0"
description = "Library to instrument executable formats"
optional = false
python-versions = ">=3.8"
files = [
{file = "lief-0.13.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:0390cfaaf0e9aed46bebf26f00f34852768f76bc7f90abf7ceb384566200e5f5"},
{file = "lief-0.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5581bf0072c1e7a9ea2fb2e2252b8582016e8b298804b5461e552b402c9cd4e9"},
{file = "lief-0.13.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:dbbf2fb3d7807e815f345c77e287da162e081100f059ec03005995befc295d7f"},
{file = "lief-0.13.2-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:d344d37334c2b488dc02f04cb13c22cd61aa065eeb9bca7424588e0c8c23bdfb"},
{file = "lief-0.13.2-cp310-cp310-win32.whl", hash = "sha256:bc041b28b94139843a33c014e355822a9276b35f3c5ae10d82da56bf572f8222"},
{file = "lief-0.13.2-cp310-cp310-win_amd64.whl", hash = "sha256:01d4075bbc3541e9dd3ef008045fa1eb128294a0c5b0c1f69ce60d8948d248c7"},
{file = "lief-0.13.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:6570dacebe107ad60c2ba0968d1a865d316009d43cc85af3719d3eeb0911abf3"},
{file = "lief-0.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7ce2e3f7c791efba327c2bb3499dbef81e682027109045a9bae696c62e2aeeb0"},
{file = "lief-0.13.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:11ab900e0644b6735ecdef2bbd04439b4866a527650fc054470c195d6cfe2917"},
{file = "lief-0.13.2-cp311-cp311-manylinux_2_24_x86_64.whl", hash = "sha256:042ad2105a136b11a7494b9af8178468e8cb32b8fa2a0a55cb659a5605aeb069"},
{file = "lief-0.13.2-cp311-cp311-win32.whl", hash = "sha256:1ce289b6ab3cf4be654270007e8a2c0d2e42116180418c29d3ce83762955de63"},
{file = "lief-0.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:eccb248ffb598e410fd2ef7c1f171a3cde57a40c9bb8c4fa15d8e7b90eb4eb2d"},
{file = "lief-0.13.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:95731cadedd6ffc5fb48c147fcefe004624e436b75e8ee9fb2dbf2ae5f084342"},
{file = "lief-0.13.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8da75df0ea472557fcc37a27ba583bad5a8f3a256c186600d00a6dd0a57f718a"},
{file = "lief-0.13.2-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:b99092f02c13f580c2d00b504af224b7e60e7c98a791e72ae8519f530b7687bb"},
{file = "lief-0.13.2-cp38-cp38-win32.whl", hash = "sha256:03db0138e4dbbdfa8bba74de312b0cebb30f504e44f38a9c8918b84022da340b"},
{file = "lief-0.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:36c5bea3f8460dee3ebb75d35949f445638ec85d2871f31e293c47fb4a0a5af7"},
{file = "lief-0.13.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:eca8ecbcae1ad851ed7cf1e22ec8accd74f2267fa7375194559fb917523d8a92"},
{file = "lief-0.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8703cb5308b4828563badc6885ff07a3926ec3403d1caa3aa75f24fe9cbcf84"},
{file = "lief-0.13.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c60f2f79e7d0d1f18dec7dcdb4d4f35e6b126ac29e2f2f056d28ec50599d868a"},
{file = "lief-0.13.2-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:e0f84a7443b7f1b02666fd16a9aa57f5d9027e60ba2885e0d76db8426d689707"},
{file = "lief-0.13.2-cp39-cp39-win32.whl", hash = "sha256:3f8f251de874929d9c9e94a35891621ab8c059149f8a1c24e543fd9cf0c2a31c"},
{file = "lief-0.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:2bbe294385e629aa7206b2f39f0ca34e3948605a8db50b22091603053889a759"},
{file = "lief-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1e9af189e0dcbd6ce9ce67266135ef288c9b8f9a5efe2a47d0d0266288713cf"},
{file = "lief-0.14.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:60be24af0b913a79922a9730302df5f380954a1d7b1c0c7de91b8918e36f0756"},
{file = "lief-0.14.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:1d949c53f95132ef0d218e88c3c982610c54426249c95f99b736e5c15bb1b75b"},
{file = "lief-0.14.0-cp310-cp310-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl", hash = "sha256:51e7adfe1cc574a035b47a280cb5902cec6deb2d78ef0b47c536bdd75dfa6956"},
{file = "lief-0.14.0-cp310-cp310-win32.whl", hash = "sha256:b34708c002c119f43998af3c4f219d06de6b66a34aceb298fd8bba8247e57572"},
{file = "lief-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:684c1500fddab8aaf5a4f74cd092ea190c4c837d31c5d087c68a9f175775c2db"},
{file = "lief-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:737bd6fab74e222968936794e09b2bf399417c38a3bc13d6ad70836793e78586"},
{file = "lief-0.14.0-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:ff42aa1f12d3dc8bc5641eb1991269fb92e43bae386559ad576c97ffa09639f2"},
{file = "lief-0.14.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:69df631cd0573388fa6891277d006f8da2fa42a5bbe3acc440b66a7352f6bef3"},
{file = "lief-0.14.0-cp311-cp311-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl", hash = "sha256:b850f38b62ca8a92c7f9803ceac0e79369b732a75e627cba3c2b8f1fa729f643"},
{file = "lief-0.14.0-cp311-cp311-win32.whl", hash = "sha256:ba29aabd72e92334d54883d58b108f80465973edaec3e27cb422abbc657bfe17"},
{file = "lief-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:33f2afdf9f00a8a208d5f32135834fc5f02bd12e8b14f0857cf14d4475ad03bb"},
{file = "lief-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:70b53498390e8b95d878598c95bd068f5c86cab415c3869538fbce4cee36a9cc"},
{file = "lief-0.14.0-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:c49d34c9140a4b77046137ceeeb872f26262447f514ccbf0cc985a91e59e7f69"},
{file = "lief-0.14.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:46808f2ec6903d8a4a4a4975d664e70c64ca11691bacb391a51029a8cb941e92"},
{file = "lief-0.14.0-cp312-cp312-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl", hash = "sha256:4e6ca44bc9d0d314ac73148c64e4f9182c950a2f2024ab9d3d7100635d46261a"},
{file = "lief-0.14.0-cp312-cp312-win32.whl", hash = "sha256:17e2809fa52e377d1a5045dbbbdea8bebbaad7f672d6c133287388e7e9942b64"},
{file = "lief-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:5713e27ba7bbe7c8c503354f3555a33e69d5236a02dd34d162156cc85a9b88b5"},
{file = "lief-0.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9998bd60d332b50f72fb71d22316b227f9fdbb301c953e8aa003822a80a6ed0a"},
{file = "lief-0.14.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:fe783a180d63aa3ae19c5f58dc76afc179f40249c4c77d9f70bc557255b4051b"},
{file = "lief-0.14.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:28e847e8410b9101f49af0ae9d06e7cb2d0db64c47442ac4c79abf1b15b2c108"},
{file = "lief-0.14.0-cp38-cp38-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl", hash = "sha256:4a44d5bd2462c9db68227ed9193243c412ce6153fe6a8e53782ff4210e4606ab"},
{file = "lief-0.14.0-cp38-cp38-win32.whl", hash = "sha256:0a0754079d595c9e3ceffed9e32d309ed139b1433fad9ad37aaa35e6a8e67d70"},
{file = "lief-0.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:bc8647f050728c09645666765de6dcbc681df7b0b6bdcfb4cdbbb96a523d2eaa"},
{file = "lief-0.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f89b8e3cc6aa01f50a8ed58d5aea89f6d767df7951fd050659e9617c1b4eb45"},
{file = "lief-0.14.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:110705c186f2ddc13fc2fad0dc9d501742d785b934103fdf56e86a86bcbcac1d"},
{file = "lief-0.14.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0ba07f12c00950554d29495c3aef3740c44243d1c0d80a3f8dadf64c456a32e7"},
{file = "lief-0.14.0-cp39-cp39-manylinux_2_28_x86_64.manylinux_2_27_x86_64.whl", hash = "sha256:f237042467f41bf0e64b051e780865f9aef958ddec1a358317cc259da2ec2a16"},
{file = "lief-0.14.0-cp39-cp39-win32.whl", hash = "sha256:75c7daefe56ba91ad4fc0a5e6573ca3c79dea2e938787b285b31ac0c25c5e5c3"},
{file = "lief-0.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:583d37400c85dc80299db873d380c0901995ae03606f7de50fd3d0538e7a7860"},
]
[[package]]
@@ -1508,71 +1519,71 @@ altgraph = ">=0.17"
[[package]]
name = "markupsafe"
version = "2.1.3"
version = "2.1.4"
description = "Safely add untrusted strings to HTML/XML markup."
optional = false
python-versions = ">=3.7"
files = [
{file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"},
{file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"},
{file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"},
{file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"},
{file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"},
{file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"},
{file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"},
{file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"},
{file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"},
{file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"},
{file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"},
{file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"},
{file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"},
{file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"},
{file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"},
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"},
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"},
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
{file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
{file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
{file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"},
{file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"},
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"},
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"},
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"},
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"},
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"},
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"},
{file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"},
{file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"},
{file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"},
{file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"},
{file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"},
{file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"},
{file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"},
{file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"},
{file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"},
{file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"},
{file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"},
{file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"},
{file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"},
{file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"},
{file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"},
{file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"},
{file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"},
{file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"},
{file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"},
{file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"},
{file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"},
{file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"},
{file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"},
{file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"},
{file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"},
{file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"},
{file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"},
{file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"},
{file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"},
{file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"},
{file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"},
{file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"},
{file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"},
{file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"},
{file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"},
{file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"},
{file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"},
{file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"},
{file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"},
{file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"},
{file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"},
{file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"},
{file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"},
{file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"},
{file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"},
{file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"},
{file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"},
{file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"},
{file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"},
{file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"},
{file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"},
{file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"},
{file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"},
{file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"},
{file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"},
{file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"},
{file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"},
{file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"},
{file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"},
{file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"},
{file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"},
{file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"},
{file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"},
{file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"},
{file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"},
{file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"},
{file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"},
{file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"},
{file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"},
{file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"},
{file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"},
{file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"},
{file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"},
{file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"},
{file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"},
{file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"},
{file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"},
{file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"},
{file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"},
{file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"},
{file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"},
{file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"},
{file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"},
]
[[package]]
@@ -2112,27 +2123,27 @@ files = [
[[package]]
name = "psutil"
version = "5.9.7"
version = "5.9.8"
description = "Cross-platform lib for process and system monitoring in Python."
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
files = [
{file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"},
{file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"},
{file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"},
{file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"},
{file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"},
{file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"},
{file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"},
{file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"},
{file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"},
{file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"},
{file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"},
{file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"},
{file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"},
{file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"},
{file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"},
{file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"},
{file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"},
{file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"},
{file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"},
{file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"},
{file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"},
{file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"},
{file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"},
{file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"},
{file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"},
{file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"},
{file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"},
{file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"},
{file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"},
{file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"},
{file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"},
{file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"},
]
[package.extras]
@@ -2683,13 +2694,13 @@ experiments = ["jsonnet (>=0.18,<1.0)"]
[[package]]
name = "service-identity"
version = "23.1.0"
version = "24.1.0"
description = "Service identity verification for pyOpenSSL & cryptography."
optional = false
python-versions = ">=3.8"
files = [
{file = "service_identity-23.1.0-py3-none-any.whl", hash = "sha256:87415a691d52fcad954a500cb81f424d0273f8e7e3ee7d766128f4575080f383"},
{file = "service_identity-23.1.0.tar.gz", hash = "sha256:ecb33cd96307755041e978ab14f8b14e13b40f1fbd525a4dc78f46d2b986431d"},
{file = "service_identity-24.1.0-py3-none-any.whl", hash = "sha256:a28caf8130c8a5c1c7a6f5293faaf239bbfb7751e4862436920ee6f2616f568a"},
{file = "service_identity-24.1.0.tar.gz", hash = "sha256:6829c9d62fb832c2e1c435629b0a8c476e1929881f28bee4d20bc24161009221"},
]
[package.dependencies]
@@ -2699,7 +2710,7 @@ pyasn1 = "*"
pyasn1-modules = "*"
[package.extras]
dev = ["pyopenssl", "service-identity[docs,idna,mypy,tests]"]
dev = ["pyopenssl", "service-identity[idna,mypy,tests]"]
docs = ["furo", "myst-parser", "pyopenssl", "sphinx", "sphinx-notfound-page"]
idna = ["idna"]
mypy = ["idna", "mypy", "types-pyopenssl"]
+1 -1
View File
@@ -1,6 +1,6 @@
[tool.poetry]
name = "mobsf"
version = "3.9.3"
version = "3.9.4"
description = "Mobile Security Framework (MobSF) is an automated, all-in-one mobile application (Android/iOS/Windows) pen-testing, malware analysis and security assessment framework capable of performing static and dynamic analysis."
keywords = ["mobsf", "mobile security framework", "mobile security", "security tool", "static analysis", "dynamic analysis", "malware analysis"]
authors = ["Ajin Abraham <[email protected]>"]