【问题标题】:Reverse engineering python 3逆向工程python 3
【发布时间】:2016-06-26 07:31:33
【问题描述】:

我想知道是否有办法解决这个错误。任何帮助将不胜感激!

TypeError: can't concat bytes to str
import marshal, imp

f=open('PYTHONSCRIPT','rb')
f.seek(28)  # Skip the header, you have to know the header size beforehand

ob=marshal.load(f)

for i in range(0,len(ob)):
    open(str(i)+'.pyc','wb').write(imp.get_magic() + '\0'*4 + marshal.dumps(ob[i]))

f.close()

open(str(i)+'.pyc','wb').write(imp.get_magic() + '\0'*4 + marshal.dumps(ob[i]))

【问题讨论】:

标签: python python-3.x


【解决方案1】:

'\0'*4str,使用b'\0' * 4 获取所需的bytes 值。

【讨论】:

    【解决方案2】:

    您的问题是您试图连接两个bytes 和一个str。这在 python3 中是不可能的,因为 python3 明确区分了字节和字符串(考虑到在 python2 中 strunicode 之间的区别有些模糊,这是一件好事)。我想你想要的大概是这样的:

    import marshal, imp
    
    f=open('PYTHONSCRIPT','rb')
    f.seek(28)  # Skip the header, you have to know the header size beforehand
    
    ob=marshal.load(f)
    
    for i in range(0,len(ob)):
        with open(str(i)+'.pyc','wb') as my_file:
            my_file.write(imp.get_magic() + b'\0'*4 + marshal.dumps(ob[i]))
    
    f.close()
    
    with open(str(i)+'.pyc','wb') as my_file:
        my_file.write(imp.get_magic() + b'\0'*4 + marshal.dumps(ob[i]))
    

    字符串前面的b 是一个标记,告诉python 字符串是byte 字符串而不是str 字符串。

    还请注意,我添加了with ... as ...:,这将确保即使在非 CPython 实现(PyPy、Jython、IronPython 等)中,您的文件也会立即确定性地关闭。

    【讨论】:

    • with 的一般建议很好,但是除了 CPython 之外,这段代码肯定不能在其他任何东西上运行:D
    • @AnttiHaapala 我不关注。它看起来像是相当标准的 python,至少可以在 pypy 上运行(我不能代表 Jython 或 IronPython,因为我不太了解它们)。你知道一些我不知道的提问者的申请吗?
    • 它与 CPython .pyc 文件混淆,当然不适用于使用 java .classes 的 Jython。至少 Jython 2.7 似乎有 imp.get_magic 返回 CPython get_magic,但 marshal 不兼容。
    • 啊,在 jython 上编组不能编组函数/代码对象,所以这绝对不能运行。
    • @AnttiHaapala 我很确定即使 CPython 也无法编组函数/代码对象。
    猜你喜欢
    • 2012-08-26
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2012-03-15
    • 1970-01-01
    • 2011-01-17
    • 2018-05-24
    相关资源
    最近更新 更多