步驟一步;
{$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指令),所以我認爲這是有效負載。
您需要展示更多代碼。該代碼不在上下文中。它之前出現了什麼? –
該代碼是可怕的。最後的'asm db'會將你直接看到代碼中的任何東西發送出去;它發出的內容從無條件的相對短跳轉開始,在前兩個字節之後沒有任何影響。看起來像混淆了我。 –