最佳答案
逆向考虑。解密的方法很多,但是简单点的就是擦除片内的加密锁定位。而加密锁定位,在被烧坏以后,就不具备擦除特性了,也就能保证不被读出了,从而起到加密作用。不能被读出,自然就更不能被写入了(这样就把芯片变成了太监,呵呵)。你烧坏加密锁定位,它就不能再写入了,类似于一次性编程,所以叫它OTP加密方法。(OTP就是一次性编程的意思)
通常为了更好的加密程序,如果用户程序长度大于89C51单片机片内存储器的容量,也可使用OTP模式做加密。具体做法是:
1 按常规扩展一片大容量程序存储器,如27C512(64K)。
2 把关键的程序部分安排在整个程序的前4K中。
3 把整个程序写入27C512,再把27C512的前4K填充为0。
4 把程序的前4K固化到AT89C51中,用OTP模式做加密。
5 把单片机的EA脚接高电平。
这样程序的前4K在单片机内部运行,后60K在片外运行。盗版者无法读出程序的前4K程序,即使知道后60K也无济于事。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
当然,加密的方法很多。比如烧断一根数据总线,它也就无法读出了。(某根总线烧坏之后,它就总是显示输出1,固然就不能正确读出代码了)。
烧总线的方法不如烧加密位的方法好。因为烧总线以后这个芯片,就不能再使用总线接口扩展芯片和存储器,程序的大小也就只能是受片内程序存储器的容量限制了。但不论是烧总线还是烧加密锁定位,都将把芯片变成不可再读出的东东,想再次编程那肯定更是不可能了。所以,要确定无误后,再加密。
然而,破解方法也是有很多的。并不是非得沿着来路返回去才能回家的。你把锁定位或者总线烧坏了,我都不能读出了,那不这样读了。这就提到了更XX的解密方法。把芯片经过去层处理,把存储器进行拍照,然后把照片经过染色处理,把1和0区分读出整理,这样就得到了存储器里的代码(因为代码是以电荷的码点形式存在的)。
其他答案共有8条回答
-
魁梧的发夹
OTP是单片机的一种存储器类型,意思是一次性可编程,程序烧入单片机后,将不可再次更改和清除。
随着嵌入式应用的越来越广泛,产品的安全也显得越来越重要。一方面是为了保护硬件设计,另外一方面也是为了产品本身的安全,防止被HACKED。
在嵌入式系统当中,所有的代码和系统数据都是被存储在FLASH芯片内部的。FLASH芯片的特点是可多次擦写,而且掉电数据不会丢失。为了保护FLASH中的数据,越来越多的FLASH厂商在FLASH内部提供了一种特殊的寄存器:OTP寄存器。
扩展资料:
给OTP寄存器提供保护,一般这类FLASH芯片还会提供一个LOCK寄存器。LOCK寄存器(同属OTP)也只能烧写一次。
LOCK寄存器的每一位对应于一个OTP寄存器。如果与OTP寄存器对应LOCK寄存器的位(BIT)从1写为0,就意味着这个被锁住的OTP寄存器再也不能进行写操作了。
即使OTP的当前值为0xFFFFFFFF,它的值也永远不可以被改写了。通过OTP寄存器与LOCK寄存器,用户可以在OTP里保存一些特定的信息,例如软件版本号,硬件版本号,秘钥等信息。同时,这类FLASH芯片内部还会有另外一个OTP寄存器。
写入特定的序列号,并LOCK住。如果有需要,FLASH厂商也可以根据客户的需要写入特定的序列号。这样,每个芯片都会有一个不一样的ID号,避免被复制。
参考资料来源:百度百科-OTP
-
清爽的龙猫
OTP属于程序存储器,将数组直接存放在程序存储器中,要求这个数组是常量才行,在单片机运行过程中,只能读数组,是不能写的。这样,数组做为数表定义存放在程序区,声明数组时加code即可。
-
传统的芒果
AT89cxx加密原理
单片机解密简单就是擦除单片机片内的加密锁定位。由于AT89C系列单片机擦除操作时序设计上的不合理。使在擦除片内程序之前首先擦除加密锁定位成为可能。AT89C系列单片机擦除操作的时序为:擦除开始---->擦除操作硬件初始化(10微秒)---- >擦除加密锁定位(50----200微秒)--->擦除片内程序存储器内的数据(10毫秒)----->擦除结束。如果用程序监控擦除过程,一旦加密锁定位被擦除就终止擦除操作,停止进一步擦除片内程序存储器,加过密的单片机就变成没加密的单片机了。片内程序可通过总线被读出。对于 AT89C系列单片机有两种不可破解的加密方法。
一、永久性地破坏单片机的加密位的加密方法。简称OTP加密模式。
二、永久性地破坏单片机的数据总线的加密方法。简称烧总线加密模式。
一、OTP加密模式原理
这种编程加密算法烧坏加密锁定位(把芯片内的硅片击穿),面不破坏其它部分,不占用单片机任何资源。加密锁定位被烧坏后不再具有擦除特性, 89C51/52/55有3个加密位进一步增加了加密的可靠性。一旦用OTP模式加密后,单片机片内的加密位和程序存储器内的数据就不能被再次擦除, 89C51/52/55单片机就好象变成了一次性编程的OTP型单片机一样。如果用户程序长度大于89C51单片机片内存储器的容量,也可使用OPT模式做加密,具体方法如下:
1、按常规扩展一片大容量程序存储器,如27C512(64K)。
2、把关键的程序部分安排在程序的前4K中。
3、把整个程序写入27C512,再把27C512的前4K填充为0。
4、把程序的前4K固化到AT89C51中,用OPT模式做加密。
5、把单片机的EA脚接高电平。
这样程序的前4K在单片机内部运行,后60K在片外运行。盗版者无法读出程序的前4K程序,即使知道后60K也无济于事。
二、炼总线加密模式原理
因为单片机片内的程序代码最终都要通过数据总线读出,如果指导单片机的数据总线的其中一条线永久性地破坏,解密者即使擦除了加密位,也无法读出片内的程序的正确代码。89C1051/2051的数据总线为P1口烧总线模式烧坏89C2051的P1.0端口,原程序代码为02H、01H、00H。读出的数据则为03H,01H,00H。其中最低位始终为1,读出的程序代码显然为错码。这种加密模式用于加密89C1051/2051单片机。缺点是占用单片机的资源。开发设计人员在设计单片机硬件系统时只要预留出口线P1.0不用,以后就可用烧总线模式对单片机加密。
-
动人的溪流
汇编指令这样写:
在程序开头设置玩芯片信息即:list=xxx芯片后,用“__CONFIG”来配置,注意,这里的“__”是两个下划线,不是一个。CONFIG后面空格接各个配置位。例如:
__CONFIG _WDT_OFF &_BODEN_OFF &_PWRTE_ON &_XT_OSC
我用的芯片是16F873,配置字关闭了看门狗“_WDT_OFF”,关闭掉电检测“_BODEN_OFF”,打开上电复位“_PWRTE_ON”,振荡电路选外部标准晶振“_XT_OSC”。PIC各个不同型号的芯片之间有不同的配置位,你用那款芯片就去microchip的网站找这芯片的数据手册,里面有这芯片涉及到的配置位说明。
对于C语言程序:
也是“__CONFIG”用来设置配置位,但格式稍稍不同
__CONFIG { WDTDIS &BORDIS &PWRTEN &XT }
-
小巧的哈密瓜,数据线
#include <HT66F2390.h>
#include "MyType.h"
#define LED_Port _pg //宏定义引脚
#define LED_PortC _pgc //宏定义引脚属性的方向
void Delayms(u16) //延时函数
void main()
{ _wdtc=0b10101111 //关狗
LED_PortC=0x0 //设置 LED_Port 为输出模式
LED_Port=0xFE //设置 LED_Port 初值
while(1)
{ while(LED_Port &0b10000000) //若MSB不为0返回继续
{ Delayms(500)
GCC_RL(LED_Port) //左移
}
while(LED_Port &0b00000001) //若LSB不为0返回继续
{ Delayms(500)
GCC_RR(LED_Port) //右移
}
}
}
void Delayms(u16 del) //延时del*200指令周期
{ u16 i //fSYS=8MH,延时del*1ms
for(i=0i<deli++) GCC_DELAY(2000)
}
-
不安的鼠标
在51单片机中,只要将一个值传送给累加器,这个数的奇偶校验值就会影响P。一般而言,在串行通讯中为确保传输数的准确,用到校验位的情况比较多。以下是程序代码:
#include<reg51.h>
main()
{
char dat
TMOD=0x20
TH1=0xfd
TL1=0xfd
TR1=1
SCON=0xd0
while(1)
{
dat++
ACC=dat
TB8=P //校验位送第九数据位TB8
SBUF=ACC
while(TI==0)
TI=0
}
}
-
过时的溪流
IO口的输入输出是通过对单片机寄存器的配置来实现的。
C51的单片机IO口本来就是双向的不需要设置。
STM32单片机的IO口用C语言的设置方法如下:
void LED_Config(void)
{
GPIO_InitTypeDef GPIO_Structure
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE)
//PC10-LED(指示灯)
GPIO_Structure.GPIO_Pin = GPIO_Pin_10
GPIO_Structure.GPIO_Speed = GPIO_Speed_2MHz
GPIO_Structure.GPIO_Mode = GPIO_Mode_Out_PP
GPIO_Init(GPIOC,&GPIO_Structure) //LED
}
-
落寞的红牛
在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。
串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。
方式0的波特率 = fosc/12
方式2的波特率 =(2SMOD/64)· fosc
方式1的波特率 =(2SMOD/32)·(T1溢出率)
方式3的波特率 =(2SMOD/32)·(T1溢出率)
当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出率取决于TH1中的计数值。
T1 溢出率 = fosc /{12×[256 -(TH1)]}
在单片机的应用中,常用的晶振频率为:12MHz和11.0592MHz。所以,选用的波特率也相对固定。常用的串行口波特率以及各参数的关系如表所示。
热门文章
- 南昌绿地主管岗待遇怎么样
- 放弃华尔街高薪回国守门,她的背后原来藏着一个神秘家族
- 橡胶英才网上有哪些江苏橡胶公司在招聘
- 主题酒店加盟哪个好
- 融资租赁租金及利息计算
- 果果的鞋加盟费多少钱
- 诗和远方一一一中建五局南康家居小镇城市客厅项目建设心语
- 怎么打开微信
- 肯德基的经营模式
- 广东诚泰交通科技发展有限公司怎么样
- 打蛋器可以做哪些食物
- 吃羊血有什么好处呢
- 雀巢淡奶油可以手动打发吗、手动怎么打发、要多久
- 做法,孜然烤面筋怎么做好吃,孜然烤面筋的家常做法
- 腌葱叶怎么做好吃,腌葱叶的家常做法
- 切开的西瓜常温下可以放多久
- 煮粥多久能熟
- 香菇和什么菜一起包饺子好吃
- 椰蓉怎么吃
- 坐月子用的猪脚姜提前多久煲
- 胆机怎么使用
- 功放没声音怎么修
- ads1293怎么用
- 信捷的PLC和keyence基恩士的PLC哪个好啊
- 健伍汽车cd怎么进入调eq功能
- 西门子S7-200 smart PLC用PLS命令控制步进电机的简单程序中的ENI是什么意思
- 大众波罗音响怎么解码
- vk3234 怎么样
- 西门子PLC的ATCH中断指令使用
- 单片机怎么设置otp位