众所周知, 有一些公司或个人专门做单片机的解密服务,别的,单片机的指令不论怎样加密终究它还要在明文的办法下才干运转, 并且解密者能够运用单片机开发体系单步调试ROM中的程序。当解密者了解了指令的运转进程之后, 也就取得了加密的程序, 如某些智能计价器的运算办法等,经过修正程序并拷贝新的ROM芯片, 就能够到达解密的意图。因而,对单片机的加密还要在程序的运转上进行加密处理, 也便是程序的动态加密办法。
1 程序的动态解码
动态解码是对加密程序的指令或数据代码进行动态康复。在程序运转时, 有一段指令是专门对某一区域的指令或数据代码解密, 并且当解密后的代码运用结束, 还要将其从头加密, 使存储器中不存在完好的程序代码。这种办法对防程序的静态剖析很有用, 由于从加密程序的清单上很难看出程序的实在面貌。但是,在程序的反盯梢方面, 动态解码又有其独到之处, 在阻挠带断点调试盯梢方面, 由于程序在履行之前是以密文办法呈现的, 解密者很难确认断点设置的方位, 稍有不小心就会因解密失利形成体系的损坏(电擦除EPROM中的数据)。下面是程序动态解码的详细比如:
……
SUB1: ADD A,#94H ;虚设的程序段
XRL 54H,#13H
……
MOV R0,#20H
MOV R1,#5
MOV R2,#55H
MOV DPTR,#SUB1
MOV A,#00H
LOOP1: PUSH A
MOVC A,@A+DPTR
XRL A,R2 ;异或运算
MOV @R0,A ;存入实践数据
POP A
INC A
INC R0
DJNZ R1,LOOP1
……
该程序是将RAM地址为20H开端的数据组(设有5个)进行动态改换, 由于初始的数据组是暗码方式的, 它需要在程序运转中改动,在程序的其他段中要运用改动后的数据。这里是用SUB1程序段中的指令代码(代码为:24H,94H,63H,54H,13H) 与55H进行动态解码,数据55H是加密数据,它”异或”指令代码后得到正确的数据存入20H开端的单元中(成果为:71H,C1H,36H,01H,46H)。为了阐明动态数据解码进程, 这个比如比较简单, 实践在转入该程序段时, 能够由某些运算生成数据单元地址, 以增强程序的抗剖析才干。
2 程序段防修正
在加密程序中, 所设置的妨碍不会只要一处。为了使加密办法完善, 在一些要害当地程序的前后呼应是反破译的有用办法。解密者为了一些意图, 必定要修正某段程序指令;而程序段防修正便是针对这种解密办法所选用的技术手段。为了到达加密程序的完好性, 能够在程序的要害处取指令或数据代码参与某种运算, 其成果作为判别程序是否被变化的依据。下面是程序防修正的程序段:
……
SUB2: ADD A,#35H
SUBB A,#05H
……
MOV DPTR,#SUB2
MOV R0,#30H
MOV A,#1
MOV R1,#3
MOV @R0,#24H ;SUB2段第一个指令代码为24H
LOOP2: PUSH A
MOVC A,@A+DPTR
XRL 30H,A ;异或运算
POP A
INC A
DJNZ R1,LOOP2
MOV A,30H
……
CJNE A,#80H,ERR ;成果与80H比较
……
ERR: MOV A,#0 ;过错出口
……
在 SUB2程序段, 是经过指令核算某些数据的,如收费的算法等。解密者总要修正部分指令, 到达某种意图。但是, 反解密的作业是在后面的LOOP2程序段中,是用到了SUB2程序段中的指令字节(这里是用了4个字节)进行运算(这里是用”异或”运算),它的成果将直接影响下面程序的正确履行(正确的运算成果为80H)。假如改动该SUB2程序段,则在LOOP2程序段中将程序引入歧途, 会不知不觉地走入迷路。假如在硬件规划上有电擦除EEPROM,能够进一步将程序中的数据修正(或删去),使盯梢者形成设备的”损坏”,无法从头剖析程序。
上面介绍的单片机加密办法,是阻挠解密者不合法取得ROM中的程序或许使ROM中的程序无法在仿制的单片机体系中运转。在实践运用中,判别程序正常运转与被盯梢运转是有许多办法的。例如,能够依据时钟计时判定某个程序段运转的时刻, 以便作出不同的反响, 由于单步与接连运转在时刻上是有很大不同的。别的, 对单片机的加密不能仅限于上述的一种办法,并且反盯梢的办法也不能单一, 要几种办法合作运用才干到达好的作用。如软件加密与硬件加密相结合,动态解码可与程序防修正相结合等,充分利用新技术、新办法(如可编程逻辑器件等)使单片机的加密维护更有用。