指令动态执行加密法

概述:

   
这儿讲述的是用单条指令加密法,再用 int 1 单步中断解下一条指令的第一字节,由于用另外程序解密时无法预知指令长, 所以不能用编程的方法解密,只能用手工一条一条地解。具体实现见注释,这种加密法的麻烦只处就是加密时也要一句一句来。

汇编编程示例:



code    segment
        assume    cs:code,ds:code
        org    100h
start:
        jmp    install

d_ok    db    'OK, passed...',0dh,0ah,24h

temp_bx     dw    ?
off1        dw    ?
seg1        dw    ?

int1:
        mov    temp_bx,bx     ;save bx
        mov    bx,sp         ;BX=SP=0016h
        mov    bx,ss:[bx]
        xor    byte ptr ds:[bx],55h     ;decode
        mov    bx,temp_bx
        iret

install:
        mov    ax,3501h             ;保存原 INT 1 中断向量
        int    21h
        mov    off1,bx              ;设置新 INT 1 到 offset int1
        mov    seg1,es
        mov    ax,2501h
        mov    dx,offset int1
        int    21h
       
        xor    byte ptr x1,55h      ;这些指令是先把以下
        xor    byte ptr x2,55h      ;的一些指令加密
        xor    byte ptr x3,55h      ;当然,在应用时就不会有这些指令了
        xor    byte ptr x4,55h
        xor    byte ptr x5,55h
        xor    byte ptr x6,55h
        xor    byte ptr x7,55h
        xor    byte ptr x8,55h
        xor    byte ptr x9,55h

        pushf
        pop    ax
        or     ax,0100h
        push   ax
        popf                         ;打开单步跟踪
       
        nop                          ;由于单步跟踪要在执行下一条指令后才激活
x1:                                  ;所以这儿是一条 NOP 指令
        mov    ah,9
x2:
        mov    dx,offset d_ok
x3:
        int    21h
x4:       
        pushf
x5:
        pop    ax                     ;从 X1 到 X9 的指令要在
x6:
        and    ax,0feffh              ;执行中才由 INT 1 逐句