Совсем недавно я разработал инструменты, которые должны помочь с такими вещами. Некоторые вещи все еще очень альфа, но с некоторыми работами вы могли бы использовать их здесь.
Вокруг несколько дизассемблеров, и они обычно появляются в декомпиляторе. Тот, к которому я неравнодушен, конечно, тот, который я написал, называется xdis , потому что он дает большую информацию о том, что находится в файле байт-кода. Существует также один, называемый pycdas, написанный на C ++, и он находится в проекте, который имеет декомпилятор pycdc. Так что эта часть не нова.
Кроме того, как вы указали, вы использовали декомпилятор, но он не был идеальным. Надеюсь, в более поздних версиях под названием uncompyle6 эти ошибки были устранены. Но если нет, подайте проблему с github.
Ok. Так что теперь на то, что является новым. Недавно я изменил дизассемблер, чтобы сделать его пригодным для модификации, и написал ассемблер Python, чтобы сохранить его обратно в формате байт-кода pyc. Этот материал все еще в альфе; найдите его в 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
Ok. Итак, мы видим, что ==
является операндом COMPARE_OP
инструкция, которая закодирована как 2.
Глядя на документ для этого 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].
Но для получения информации о секретном кольце декодера вы должны перейти к
Исходный код Python для opcode.py, который у вас, вероятно, есть где-то на вашем диске, но вот ссылка: https://github.com/python/cpython/blob/master/Lib/opcode.py#L24, где у нас есть
cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', ...
И вы увидите, что пока ==
равно 2, !=
равно 3.
Что касается изменения константы [116901, 141, 349244, 39, 1159488]
, которая появится в моем дизассемблере в разделе под названием Constants
, и вы в основном измените числа там, а затем запустите ассемблер.