指令动态执行加密法

概述:

这儿讲述的是用单条指令加密法,再用 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