Inbar Raz, Eden Shochat ve Yossi Gottlieb [1]'in anti debugging tricks yazısını okurken ortaokul yıllarıma gittim, yazı zaten 90'ların ilk yarısına ait. Kullandığım 386DX 40 mhz bilgisayarım ile o günlerde aldığım hazı bugünlerde bulamadığım için üzülüyorum ama iyi ki o günleri yaşamışım, güzel zamanlardı. 16-bit process'leri Borland / Turbo Debugger, SoftICE, debug.exe üzerinde incelerken alıştığımız AX, BX, CX, DX register'ları yerine 32-bit'in yaygınlaşması ile extended hallerini (EAX, EBX, ...) görünce bunlar büyümüş isimleri değişmiş demiştim. Oyunların crack'lenmesini zorlaştırmak için bazen de hile yöntemlerinin keşfedilmesini zorlaştırmak için kodlara anti debugging betikleri eklenirdi, bazen de virüs'lerin kendisini korumak için elbette.

Birkaç tekniğe göz atalım;

8259 Interrupt Controller ile klavye interrupt'ını kapatma:

CS:0100 E421           IN     AL,21
CS:0102 0C02           OR     AL,02
CS:0104 E621           OUT    21,AL

Alternatif olarak Programmable Peripheral Interface (PPI) aracılığı ile devre dışı bırakılması:

CS:0100 E461           IN     AL,61 ;PPI uzerinde 0x61 numarali port araciligi ile
CS:0102 0C80           OR     AL,80
CS:0104 E661           OUT    61,AL

Interrupt'ların yazılım ile maskelenmesine dair başka bir anti debug numarası... Burada dikkat edilmesi gereken yazılımınızın tetiklemediği kesmeleri kullanmanız. Breakpoint'leri maskeleyen örnek:

CS:0100 EB04           JMP    0106
CS:0102 0000           ADD    [BX+SI],AL
CS:0104 0000           ADD    [BX+SI],AL
CS:0106 31C0           XOR    AX,AX
CS:0108 8EC0           MOV    ES,AX
CS:010A 268B1E0C00     MOV    BX,ES:[000C]
CS:010F 891E0201       MOV    [0102],BX
CS:0113 268B1E0E00     MOV    BX,ES:[000E]
CS:0118 891E0401       MOV    [0104],BX
CS:011C 26C7064C000000 MOV    Word Ptr ES:[000C],0000
CS:0123 26C7064E000000 MOV    Word Ptr ES:[000E],0000

Interrupt'ları birbirleriyle değiştirmek bu yöntemi daha önceden görmemiş kişilerin sinirlerini bozmak için iyi bir yol:

CS:0100 FA             CLI
CS:0101 31C0           XOR    AX,AX
CS:0103 8EC0           MOV    ES,AX
CS:0105 26A18400       MOV    AX,ES:[0084]
CS:0109 26A30400       MOV    ES:[0004],AX
CS:010D 26A18600       MOV    AX,ES:[0086]
CS:0111 26A30600       MOV    ES:[0006],AX
CS:0115 B44C           MOV    AH,4C
CS:0117 CD01           INT    01  

Debugger'ların kendi stack alanı yerine yazılımın stack alanını kullanmasını kötüye kullanarak sistemin kilitlenmesi sağlayan bir yöntem:

CS:0100 8CD0           MOV    AX,SS
CS:0102 89E3           MOV    BX,SP
CS:0104 0E             PUSH   CS
CS:0105 17             POP    SS
CS:0106 BC0B01         MOV    SP,010B
CS:0109 90             NOP
CS:010A 90             NOP
CS:010B EB02           JMP    010F
CS:010D 90             NOP
CS:010E 90             NOP
CS:010F 89DC           MOV    SP,BX
CS:0111 8ED0           MOV    SS,AX

[1] Yazının orjinalinde daha fazla yöntem bulabilirsiniz.