2013-02-04 132 views
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; 

由於

+3

您需要展示更多代碼。該代碼不在上下文中。它之前出現了什麼? –

+1

該代碼是可怕的。最後的'asm db'會將你直接看到代碼中的任何東西發送出去;它發出的內容從無條件的相對短跳轉開始,在前兩個字節之後沒有任何影響。看起來像混淆了我。 –

回答

9

步驟一步;

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

我假設這段代碼是以某種方式{$INCLUDE} -ed。此代碼不希望包含兩次,因此它將(稍後)定義預編譯器符號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指令),所以我認爲這是有效負載。

+0

感謝您解釋這些細節 –