最近,我开发了可以帮助解决此类问题的工具。有些东西仍然是 Alpha 版,但通过一些工作你可以在这里使用它。
周围有几个反汇编器,它们通常出现在反编译器中。我偏爱的当然是我写的称为xdis的那个,因为它提供了有关字节码文件中内容的最多信息。还有一个叫做 pycdas 用 C++ 编写,并且在具有 pycdc 反编译器的项目中。所以那部分并不新鲜。
此外,正如您所指出的,您使用了反编译器,但它并不完美。希望在名为uncompyle6的更高版本中,这些错误已得到解决。但如果没有,请提交 github 问题。
好的。所以现在来看看有什么新东西。最近我修改了反汇编程序以使其易于修改,并编写了一个 Python 汇编程序将其存储回 pyc 字节码格式。这些东西仍处于 alpha 阶段;在http://github.com/rocky/python-xasm找到它。
因此,您可以对常量和条件测试进行简单的更改。
所以现在让我进入条件测试,因为你特别问过这个问题,这里还没有完全回答。
考虑这个简单的 Python 代码:
___file__ == '__main'
让我们用 pydisasm 反汇编它:
...
# Constants:
# 0: '__main'
# 1: None
# Names:
# 0: ___file__
1: 0 LOAD_NAME 0 (___file__)
3 LOAD_CONST 0 ('__main')
6 COMPARE_OP 2 (==)
9 POP_TOP
10 LOAD_CONST 1 (None)
13 RETURN_VALUE
好的。所以我们看到
是编码为 2==
的指令的操作数。COMPARE_OP
查看此https://docs.python.org/3.6/library/dis.html#opcode-COMPARE_OP的文档 (这是针对 Python 3.6,但几乎所有 Python 版本都相同)有一点帮助解释:
The operation name can be found in cmp_op[opname].
但是对于秘密解码器环信息,您必须转到 opcode.py 的 Python 源代码,您可能在磁盘上的某个地方拥有它,但这里有一个链接:https ://github.com/python/cpython/blob/ master/Lib/opcode.py#L24我们在哪里
cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', ...
你会看到 while==
是 2,!=
是 3。
至于更改[116901, 141, 349244, 39, 1159488]
将出现在我的反汇编程序中调用的部分中的常量,Constants
您基本上会更改那里的数字,然后运行汇编程序。