0

申し訳ありませんが、これは非常に初歩的な質問ですが、誰かがこのコードを見て、このコードが何をすべきかを説明できますか? Delphi 7 は行の先頭に期待してエラーを出し続けます : または ,

{$IFDEF CRYPT_BLOCK}
  nested blocks not allowed!
{$ENDIF}
{$DEFINE CRYPT_BLOCK}
{$IFOPT O+}
  {$DEFINE SAVE_OPT}
{$ENDIF}
{$O-}
{$IfNDef UNSAFE_CRYPT}
begin
{$ENDIF}
asm db   $EB, $06, $EB, $FC, $EB, $FC, $FF, $F8 end;

ありがとう

4

1 に答える 1

9

段階的に;

{$IFDEF CRYPT_BLOCK}
  nested blocks not allowed!
{$ENDIF}

このコードは何らかの形で編集されていると思い{$INCLUDE}ます。このコードは 2 回インクルードしたくないので、(後で) プリコンパイラ シンボルを定義しますCRYPT_BLOCK。上記のコードは、シンボルが定義されているかどうかをテストし、定義され{$IFDEF CRYPT_BLOCK}ている場合はコンパイルされないことを実行します ( nested blocks not allowed!)。{$INCLUDE}プログラマーが、彼女がこのことを 2 回 -edしたことを知ることになるのを見たとき。

{$DEFINE CRYPT_BLOCK}

これは、上記のブロックでテストされるシンボルを定義します。コンパイラが問題なくここに到達した場合、シンボルはまだ定義されていません。

{$IFOPT O+}
  {$DEFINE SAVE_OPT}
{$ENDIF}

コンパイラの最適化が有効になっているかどうかを確認します。そうである場合は、シンボルSAVE_OPTが定義されているため、コンパイラ オプションを復元できます。これを確認すると、コードが{$O}コンパイラ オプションを変更しようとしていると見なされます。

{$O-}

案の定、最適化が無効になりました。

{$IfNDef UNSAFE_CRYPT}
begin
{$ENDIF}

シンボルUNSAFE_CRYPTが定義されていない場合は、コンパイラにbeginキーワードを表示させます。

asm db   $EB, $06, $EB, $FC, $EB, $FC, $FF, $F8 end;

これはちょっと怖いアセンブラー コードです。コードを「難読化」するという誰かのアイデア。あまり良い考えではありません。最初の 2 バイト ( $EB, $06) は、このすべてのコードの直後への相対ジャンプです。つまり、この一連のアセンブリをほぼどこにでも含めることができ、CPU は単純にそれを飛び越えます。次に、一連の奇妙なジャンプが続きます。2 回目$Eb $FCは、実際には最初のジャンプがあった場所へのジャンプです。最後の 2 バイト ( $FF, $F8) は実際には意味をなさない (これらは有効な Intel x86 命令ではない) ため、何らかのペイロードであると想定しています。

于 2013-02-04T22:10:06.560 に答える