最佳答案
逆向考虑。解密的方法很多,但是简单点的就是擦除片内的加密锁定位。而加密锁定位,在被烧坏以后,就不具备擦除特性了,也就能保证不被读出了,从而起到加密作用。不能被读出,自然就更不能被写入了(这样就把芯片变成了太监,呵呵)。你烧坏加密锁定位,它就不能再写入了,类似于一次性编程,所以叫它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位