皮特陳,這個是中文的不必翻譯啦。 (7千字)

看雪資料發表於2001-06-04

程式名:Crkme12.com 
這是皮特陳給我的3個DOS的CRACKME中的一個,另外的一個太簡單,還有一個又太複雜,只有這個適中,所以用
他來寫過程,也算對皮特陳有個交代,免得問的我連QQ都不敢上,呵呵。
跟蹤工具:DEBUG

-U 100 L 142
128E:0100 E9EE00        JMP    01F1                             
    .
    .     
128E:01F1 E80000        CALL    01F4    ;跳到此處                       
128E:01F4 5D            POP    BP  ;取得相對偏移,這可是外殼病毒常用的手法哦
128E:01F5 33DB          XOR    BX,BX                             
128E:01F7 8BC3          MOV    AX,BX                             
128E:01F9 BFC300        MOV    DI,00C3                           
128E:01FC 893F          MOV    [BX],DI  ;將PSP+0的地方放一個RET,這可是有目的。
128E:01FE 81C39000      ADD    BX,0090  ;這個90做為結束程式碼的入口
128E:0202 53            PUSH    BX                               
128E:0203 2E            CS:                                     
128E:0204 FF363600      PUSH    [0036]  ;取段址,因是COM檔案,其實沒必要                       
128E:0208 1F            POP    DS                               
128E:0209 1E            PUSH    DS  ;此處壓入DS,SI用做下面的RETF到程式入口用
128E:020A 56            PUSH    SI  ;!!!!!!這可是他的巧妙之處,後面再說
128E:020B 8D76E2        LEA    SI,[BP-1E]                       
128E:020E 8BFB          MOV    DI,BX                             
128E:0210 B90F00        MOV    CX,000F ;此處移動0F位元組到PSP+90的地方,移了些什麼,看注一
128E:0213 F2            REPNZ                                     
128E:0214 A4            MOVSB                                     
128E:0215 C64625BE      MOV    BYTE PTR [BP+25],BE  ;注意,此處會改變219的程式碼             
128E:0219 64            DB    64                ;被改為MOV SI,103               
128E:021A 0301          ADD    AX,[BX+DI]                       
128E:021C 66            DB    66    ;此處其實就是MOV EDX,[BP-0F],只不過DEBUG太老土,識別不了
128E:021D 8B56F1        MOV    DX,[BP-0F]                       
128E:0220 66            DB    66    ;同上                           
128E:0221 8B5EF5        MOV    BX,[BP-0B]                       
128E:0224 66            DB    66                               
128E:0225 8B6EF9        MOV    BP,[BP-07]                       
128E:0228 8B0E0101      MOV    CX,[0101]  ;CX為EE                       
128E:022C AC            LODSB              ;下面在做解碼                       
128E:022D 66            DB    66        ;如果你用32位偵錯程式就可以看到它們的真面目
128E:022E C1            DB    C1                               
128E:022F C20866        RET    6608                             
128E:0232 33D3          XOR    DX,BX                             
128E:0234 66            DB    66                               
128E:0235 03D5          ADD    DX,BP                             
128E:0237 66            DB    66                               
128E:0238 D3C5          ROL    BP,CL                             
128E:023A 32C2          XOR    AL,DL                             
128E:023C 8844FC        MOV    [SI-04],AL                       
128E:023F E2EB          LOOP    022C                             
128E:0241 CB            RETF    ;解碼完畢,進入程式。如果程式正常執行會返回到128E:100處執行程式,                                ;如在DEBUG下,會返回到PSP+0的地方執行那條RET指令,之後回到PSP+90
                                ;的結束程式碼處,這就是上面那個SI的妙處

;此處為程式的入口,可以脫殼了,將BX=0,CX=EE,再取個名字,W 回寫就不用我說了吧.
128E:0100 B409          MOV    AH,09                             
128E:0102 BA7201        MOV    DX,0172                           
128E:0105 CD21          INT    21                               
128E:0107 B40A          MOV    AH,0A                             
128E:0109 BAD201        MOV    DX,01D2                           
128E:010C CD21          INT    21                               
128E:010E B409          MOV    AH,09                             
128E:0110 BABA01        MOV    DX,01BA                           
128E:0113 CD21          INT    21                               
128E:0115 BF7201        MOV    DI,0172                           
128E:0118 33ED          XOR    BP,BP                             
128E:011A 33DB          XOR    BX,BX                             
128E:011C 33C0          XOR    AX,AX                             
128E:011E 33F6          XOR    SI,SI                             
128E:0120 56            PUSH    SI                               
128E:0121 BED201        MOV    SI,01D2  ;下面是一連串的運算                         
128E:0124 8A0ED301      MOV    CL,[01D3]  ;誰數學好,去做這道題吧,呵呵.                       
128E:0128 80C102        ADD    CL,02                             
128E:012B 50            PUSH    AX                               
128E:012C AC            LODSB                                     
128E:012D 8A25          MOV    AH,[DI]                           
128E:012F 84E4          TEST    AH,AH                             
128E:0131 7422          JZ    0155                             
128E:0133 02D8          ADD    BL,AL                             
128E:0135 1B45FE        SBB    AX,[DI-02]                       
128E:0138 12C4          ADC    AL,AH                             
128E:013A 03E8          ADD    BP,AX                             
128E:013C 86CB          XCHG    CL,BL                             
128E:013E D3D5          RCL    BP,CL                             
128E:0140 86CB          XCHG    CL,BL                             
128E:0142 AA            STOSB                                     
128E:0143 E2E7          LOOP    012C                             
128E:0145 58            POP    AX                               
128E:0146 5E            POP    SI                               
128E:0147 31AC6601      XOR    [SI+0166],BP  ;注三  ,此處的BP值隨密碼變動的
128E:014B 0F            DB    0F                               
128E:014C 95            XCHG    BP,AX                             
128E:014D C0            DB    C0                               
128E:014E 02E0          ADD    AH,AL                             
128E:0150 83C602        ADD    SI,+02                           
128E:0153 EBCB          JMP    0120                             
128E:0155 BAC501        MOV    DX,01C5                           
128E:0158 58            POP    AX                               
128E:0159 84E4          TEST    AH,AH    ;如想爆破,就是這裡了                       
128E:015B 7503          JNZ    0160                             
128E:015D BACC01        MOV    DX,01CC                           
128E:0160 B409          MOV    AH,09                             
128E:0162 CD21          INT    21                               
128E:0164 5E            POP    SI                               
128E:0165 C3            RET     ;返回到PSP+90處執行退出程式碼。注二                           

注一:
128E:0090  33C0            XOR      AX,AX      ;程式執行完後將自己清0,想不讓我們看他的程式碼
128E:0092  BF0001          MOV      DI,0100    ;在KV300中也有類似程式碼。
128E:0095  B9FFFE          MOV      CX,FEFF                             
128E:0098  F3              REPZ                                           
128E:0099  AA              STOSB         
128E:009A  B8004C          MOV      AX,4C00  ;由於程式破壞了PSP+0的程式碼,所以不能用INT 20結束 
128E:009D  CD21            INT      21
可以看出程式結束的最終程式碼在PSP+90的地方
注二:
我們脫殼後,此處已不在適合用RET了,我們可以用INT 20 或MOV AX,4C00,INT 21 來體面的結束它.
我用了INT 21來結束它,我們改了程式後,結果又被注三處改為其他程式碼,所以在注三處將[SI+166]改為[SI+16B]
也就是讓他去修改後面的程式碼,只要不動到我的結束部分就行了.
其實我們還可以將程式裁剪小一些,留給你去做吧.

現在我講一下那個SI的用處,其實就是程式正常執行時SI=IP=100,而在DEBUG下,SI被清0了,其中DX(它本該=DS)也一樣,也有程式用它來做反跟蹤。
我們只要用DEBUG載入程式後,手工將SI=100,就可正常進入程式入口了。說穿了,就是這麼詐。

                                                  飛刀浪子  留
                                                            2001.6.4

相關文章