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}编辑的。这段代码不想被包含两次,所以它将(稍后)定义预编译器符号CRYPT_BLOCK;上面的代码测试符号是否被定义{$IFDEF CRYPT_BLOCK},如果是,那么它会做一些不会编译的事情(nested blocks not allowed!)。当程序员看到她会知道时,她 - 编辑了{$INCLUDE}这个东西两次。

{$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;

这只是一些可怕的汇编代码;有人“混淆”代码的想法;不是一个很好的主意。前两个字节 ( $EB, $06) 是在所有这些代码之后的相对跳转。换句话说,您几乎可以在任何地方包含这一系列组装,CPU 会简单地跳过它。然后是一系列奇怪的跳跃,第二次$Eb $FC实际上是跳到第一次跳跃的地方,等等。最后两个字节($FF, $F8)实际上没有任何意义(它们不是有效的 Intel x86 指令),所以我认为这是一种有效载荷。

于 2013-02-04T22:10:06.560 回答