ごく最近、この種の作業に役立つツールを開発しました。一部のものはまだ非常にアルファ版ですが、いくつかの作業を行うことで、ここで使用できた可能性があります。
いくつかの逆アセンブラがあり、通常は逆コンパイラに表示されます。もちろん、私が好きなのはxdisと呼ばれるものです。これは、バイトコード ファイルの内容について最も多くの情報を提供するためです。C++ で記述された pycdas というものもあり、pycdc デコンパイラを含むプロジェクトに含まれています。その部分は新しいものではありません。
また、逆コンパイラを使用したことを示しているように、完全ではありませんでした。uncompyle6と呼ばれる以降のバージョンでは、これらのバグが解決されていることを願っています。そうでない場合は、github の問題を報告してください。
Ok。それでは、新しいものについて説明します。最近、私は逆アセンブラを修正して修正しやすくし、それを pyc バイトコード形式に戻す Python アセンブラを作成しました。これはまだアルファ版です。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。
したがって、これは 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
場合は、基本的にそこで数値を変更してからアセンブラーを実行します。