指令动态执行加密法
概述:
  
      这儿讲述的是用单条指令加密法,再用 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 逐句解开
  x7:
          push    ax
  x8:
          popf
  x9:
          nop
          
          mov    ax,2501h             
  ;把 INT 1 复原
          lds    dx,dword ptr 
  off1
          int    21h
  
          int    20h