# █ █ █ █▄▀ ▄▀█ █▀▄▀█ █▀█ █▀█ █ █
# █▀█ █ █ █ █▀█ █ ▀ █ █▄█ █▀▄ █▄█
# 🔒 Licensed under the GNU GPLv3
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
# 👤 https://t.me/hikamoru
# If you don't like the module don't use it
# meta developer: @hikamorumods
# meta banner: https://github.com/AmoreForever/assets/blob/master/besafe.jpg?raw=true
import logging
import requests
import ast
import re
from .. import loader, utils
logger = logging.getLogger(__name__)
__version__ = (1, 0, 0)
@loader.tds
class BeSafe(loader.Module):
"""
Check module before loading
"""
strings = {
"name": "BeSafe",
"no_args_or_reply": "🤷♂️[BeSafe] No link or reply to file",
"safe": "🛡Module is safe",
"suspicious": "🔎 Module is suspicious\n\n⛩Suspicious imports:\n",
'sus_keywords': "\n🔑Suspicous keywords:"
}
strings_ru = {
"no_args_or_reply": "🤷♂️[BeSafe] Нет ссылки или реплея на модуль",
"safe": "🛡Модуль безопасен",
"suspicious": "🔎 Модуль подозрительный\n\n⛩Подозрительные импорты:\n",
'sus_keywords': "\n🔑Подозрительные ключевые слова:"
}
def extract_imports(self, code):
code = code.lstrip('\ufeff') # крч удаление символа BOM, если он есть
try:
tree = ast.parse(code)
except SyntaxError as e:
if "invalid non-printable character" not in str(e):
raise
code = code.encode('utf-8-sig').decode('utf-8')
tree = ast.parse(code)
imports = []
for node in ast.walk(tree):
if isinstance(node, ast.Import):
imports.extend(name.name for name in node.names)
elif isinstance(node, ast.ImportFrom):
module_name = node.module
imports.extend(f"{module_name}.{name.name}" for name in node.names)
return imports
suspicious_imports = [
'glob',
'os',
'sys',
'telethon.tl.TLRequest',
'requests',
]
suspicious_keywords = [
r'0x418d4e0b',
r'0xf5b399ac',
r'w+z+mm+"A"+nk+u+h+lk',
r'b"\x0bN\x8dA"'
r'session',
r'TestingHikka_BOT' # временно будет тут
]
def extract_keywords(self, code):
words = []
for word in self.suspicious_keywords:
if r := re.findall(word, code):
words.append(r[0])
return words
@loader.command()
async def bs(self, message):
"""
BeSafe - or
"""
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if args:
r = await utils.run_sync(requests.get, args)
string = r.text
elif reply:
code = (await self._client.download_file(reply.media, bytes)).decode("utf-8")
string = code
else:
await utils.answer(message, self.strings["no_args_or_reply"])
imports = self.extract_imports(string)
sus_imports = [f"▫️ {imp}" for imp in self.suspicious_imports if imp in imports]
sus_keywords = []
if sus_imports:
kw = self.extract_keywords(string)
sus_keywords = [f"▫️ {k}" for k in self.suspicious_keywords if k in kw]
if sus_imports or sus_keywords:
sus_list = sus_imports + [self.strings["sus_keywords"]] + sus_keywords
text = self.strings["suspicious"] + '\n'.join(sus_list)
else:
text = self.strings["safe"]
await utils.answer(message, text)