web-dev-qa-db-ja.com

Cおよび/またはC ++のポリモーフィックエンジン

私はポリモーフィックエンジンを偶然見つけましたが、それらについては何も知りません。しかし、私はそれらがどのように書かれているかについて興味があります。私が調べたすべての例はそれらをAssemblyに書き込みますが、私のAssemblyはまったく良くありません。私はあちこちにいくつかの指示を知っていますが、あまりよくわかりません。一方、私はCとC++が得意です。

私はC++のポリモーフィズムの概念に精通していますが、ポリモーフィックエンジンについて読んだ後、それらがC++のポリモーフィズムとは異なると想定しています。

CやC++を使用したコードの暗号化/復号化や難読化を示す単純なコードを探しています

C++で仮想キーワードを使用するなどの手法を使用して、アプリケーションのコードを難読化または暗号化するにはどうすればよいですか?

注:私はこの質問をstackoverflow.comからこの場所に転送するように言われました。

2
Hawk

私はC++のポリモーフィズムの概念に精通していますが、ポリモーフィックエンジンについて読んだ後、それらがC++のポリモーフィズムとは異なると想定しています。

C++で仮想キーワードを使用するなどの手法を使用して、アプリケーションのコードを難読化または暗号化するにはどうすればよいですか?

あなたの仮定は正しいです。彼らは違うものです。

  • 通常、CもC++もランタイムコード生成を利用せず、自己変更コードも使用しません。
  • CおよびC++では、ほとんどすべてのものの間で、チェックされていない型キャストだけでなく、関数ポインターも使用できます。これら2つの機能により、任意のアドレスへのCPUジャンプ(実行転送)が可能になります。
  • プログラマーは、意味のあるマシンコードで構成されるバイトフラグメントをバイトバッファーに連結するCまたはC++コードを記述し、このマシンコードフラグメントの先頭への呼び出しを発行できます。通常、マシンコードフラグメントには、呼び出し元のC/C++コードに制御を返す1つ以上のreturnステートメントが含まれています。
  • ただし、ほとんどのCおよびC++プログラムは任意のジャンプを行わないため、これらのプログラムがオペレーティングシステム(OS)で実行されると、OSは「実行無効ビット」(NX)と呼ばれるCPU機能を使用して、 C/C++コンパイラのバイナリ出力の一部ではありませんでした。
  • 通常、「関数ポインター」機能はCプログラマーが 仮想メソッドテーブル を実装するために使用します。
  • C++は、継承可能なクラスオブジェクトを作成するための、より人間が理解できるメカニズムを提供します。これは、一部は仮想メソッドテーブルメカニズムによって実現されます。
  • 仮想メソッドテーブルに対するCとC++のアプローチの違いは、です。
    1. Cでは、プログラマーは仮想メソッドテーブルを維持するために必要なすべての操作を処理する必要があります。
    2. Cでは、プログラマーはいつでも(メソッドの実行中であっても)仮想メソッドテーブルに対してあらゆる種類の操作を行うことができます。

  • 通常、ポリモーフィックエンジン(コード難読化)は仮想メソッドテーブルを利用しません。これは、ハードコードされた仮想メソッドテーブルが、実行時にコードが実行されるコードからなるメモリアドレス範囲への連続したポインターで構成されるため、実行時に(デバッガーが接続されている)マシンコードを分析すると非常に見やすいためです。
  • ただし、学習目的のためだけに、C/C++関数ポインターを使用してエンジンを実装すると便利な場合があります。

CやC++を使用したコードの暗号化/復号化および/または難読化を示す単純なコードを探しています

残念ながら、これはProgrammers.StackExchangeにとってトピック外です。


情報セキュリティに関してこれらのトピックについて質問がある場合:

  • 暗号化と復号化、
  • コード難読化

http://security.stackexchange.com で質問してみてください


アセンブリコードの呼び出し可能なフラグメントを生成するためのC++ツールを探している場合は、 AsmJit を試してください。これにより、プログラムでアセンブリコードを生成する基本を学ぶことができます。これにより、機能的に同等の計算を実行するさまざまなアセンブリコードフラグメントを生成する方法を学ぶことができます。

(免責事項:以前にAsmJitを使用したことがありません。)

2
rwong