7

自動生成された C コードをリバース エンジニアリングするのはどれくらい簡単ですか? 私は Python プロジェクトに取り組んでおり、作業の一環として Cython を使用してスピードアップのためにコードをコンパイルしています。

これは速度の面では確かに役に立ちますが、私が働いている場所では、コードを「のぞき見」してその機能を理解しようとする人がいるのではないかと心配しています。

Cython コードは基本的に自動生成された C ですが、リバース エンジニアリングするのは非常に難しいですか?

コードをより安全にし、リバース エンジニアリングをより困難にするための推奨事項はありますか? (十分な努力をすれば、すべてをリバース エンジニアリングできると思います)。

4

3 に答える 3

6

わかりました -- あなたの質問にもっと直接的に答えようとすると、ほとんどの自動生成された C コードはかなり醜いので、誰かがそれをリバース エンジニアリングするにはかなりの動機が必要です。同時に、Cython が生成するものを見たことがないとは思えないので、どのように見えるかはわかりません。

さらに、自動生成されたコードの多くはステート マシン テーブルのような形で行われるため、ほとんどのプログラマーは、よくても従うのがかなり難しいと感じています。(多くの場合) 傾向として、実行時にフレームワークが多かれ少なかれ "解釈" するデータのテーブルを備えた、汎用的なフレームワークが使用されます。これは必ずしも従うことが不可能というわけではありませんが、ほとんどの人がすぐにやめてしまうほど、ほとんどの典型的なコードとは十分に異なっています (そして、多くのことを行うと、通常、コードの代わりにフレームワークを見て多くの時間を無駄にします)。これは、このような場合に本当に重要なことです)。

ただし、繰り返しますが、Cython が生成するものを調べていないことは確かです。したがって、Cython について確信を持って多くを語ることはできません。

C ソース コードを理解しにくくすることを目的とした商用の難読化ツールがあります (または、少なくとも以前は存在していました)。Perl が利用できるようになったことで、市場シェアの多くが奪われたのではないかと思いますが、探してみれば、まだ 1 つを見つけて使用できる可能性があります。

それがなければ、独自の難読化ツールを作成することはそれほど難しいことではありませんが、その効果の程度は、あなたがどれだけ努力するかによって変わるでしょう。意味のある変数名を体系的に名前を や のよう_に変更するだけ__で、かなりのことができます (たとえば、profit = sales - costs;は よりもはるかに意味があり_ = _I_ - _i_;ます)。ただし、問題の機械生成コードによっては、これは実際にはあまり効果がない場合があります。一般的なフレームワークを難読化しても、コードの動作を理解する上で大きな違いはない場合があります。正しいフレームワーク コードを単純に複製し、プログラムに固有の部分を難読化されていないフレームワークに移植することができます。

于 2011-03-31T23:51:16.037 に答える
2

Cython が生成するコードを実際に確認する必要があります。たとえば、デバッグを支援するために、完全な Python ソース コードを生成されたファイルにコピーし、C コードを生成する前に各ソース行をマークします。これにより、関心のあるコード セクションを非常に簡単に見つけることができます。

非常に優れた機能は、"-a" (注釈) オプションを使用してコードをコンパイルできることです。これにより、注釈付きの Python コードを含む C ファイルの隣に HTML ファイルが出力されます。行をクリックすると、その行の C コードが表示されます。おまけとして、多くの Python 処理を実行する行が濃い黄色でマークされるため、潜在的な最適化を探す場所を簡単に示すことができます。

Cython には特別な gdb サポートもあり、Cython のソース レベルのデバッグなどを行うことができます。

于 2011-04-16T14:38:38.450 に答える
2

ああ、コンパイルされたモジュールについて話していたのを少し見逃していたようですが、Cython が生成するソース コードについてのみ言及していました。gdb サポートを無効 (デフォルト) にして、デバッグ シンボルを取り除く限り、コンパイル済みモジュールから有用なものを抽出するのはかなり難しいという Jerry の意見に同意します。これは、C コンパイラがあらゆる場所でヘルパー関数のインライン化を多数行い、さまざまな低レベル コードの最適化を適用するため、元のマクロ レベルのコード パターンを抽出するのが難しくなるためです。ただし、CPython への名前付き C-API 呼び出しが表示され、独自のコードからの関数名も表示されます。Cython は、コードの難読化のために特別に設計されたわけではなく、まったく逆です。しかし、読み取り可能なアセンブリが設計目標になったことはありません。

于 2011-04-16T14:55:32.590 に答える