这是朋友的朋友送给我的一个程序,说是可以用来加密,刚刚毕业,看不懂,也不知道有没有用. 有没有高手帮我解释一下原理, 还有这玩艺到底管不管用?
;===============================================
;该方法可以打乱指令执行顺序。其用处主要是加密一段程序
;1. 将数据和指令糅合在一起。
;2. 将加密指令组隐藏在正常程序中,即所谓隐行程序。
;3. 以上需要和密码及算法联合使用才最好。
;4. 以上如果佐以花指令效果更好.
$ set (**=1) ;是否** 0--不是,1--是
Name Pwd
InstructionAdrRdy BIT 00H ;表示当前指令地址已经准备好
DSEG AT 30H
iPC: ds 2 ;虚地址
rPC: ds 2 ;实地址
nTemp: ds 2
nReg0: ds 3 ;应用程序寄存器
nReg1: ds 3 ;加密程序寄存器
nStack: ds 8 ;加密程序栈,本例中没有用
;============================================================================
CSEG AT 0000H
ljmp MainProc
CSEG AT 0003H ;int 0
reti
CSEG AT 000BH ;timer 0
ljmp Timer0Proc
Timer0Proc:
clr TF0
jnb InstructionAdrRdy,tpOver
clr InstructionAdrRdy
push iPC+1
push iPC
tpReturn:
reti
tpOver:
pop nTemp
pop nTemp+1
clr ET0
sjmp tpReturn
;=====================================================================
RunOneInstruction:
mov B,nReg1+2
mov A,nReg1+1
mov PSW,nReg1+0
setb InstructionAdrRdy
setb ET0
nop
nop
nop
mov nReg1+0,PSW
mov nReg1+1,A
mov nReg1+2,B
ret
;==========================================================================
TestProc:
db 78H ;随机数
Instruction2:
add A,B
db 45H,61H ;随机数
Instruction1:
mov A,#033H
db 85H ;随机数
Instruction0:
mov B,#055H
; nop
; ret ;本例不能处理ret/call和各种跳转指令,如需要请自己弄
;=====================================================================
MainProc:
mov SP,#80H
$if **==1
mov AUXR,#0C0H
$endif
mov TMOD,#22H
mov TH0,#0ffH
mov TL0,#0ffH
setb TR0
clr ET0
mov nReg1+0,#08H
mov nReg1+1,#00H
mov nReg1+2,#00H
clr InstructionAdrRdy
setb EA
;执行一条指令 0
mov iPC,#high (Instruction0)
mov iPC+1,#low (Instruction0)
lcall RunOneInstruction
;执行一条指令 1
mov iPC,#high (Instruction1)
mov iPC+1,#low (Instruction1)
lcall RunOneInstruction
;执行一条指令 2
mov iPC,#high (Instruction2)
mov iPC+1,#low (Instruction2)
lcall RunOneInstruction
mov SCON,#50H ;Set UART to mode 1
orl PCON,#80H
mov TH1,#(256-39)
mov TL1,#(256-39)
setb TR1
mov R0,#nReg1
mov R7,#10H
a000:
clr TI
mov sbuf,@R0
jnb TI,$
inc R0
djnz R7,a000
sjmp $
end |