手上有STC8A8K64SA13的开发板,我读了一个ram区的id与rom区的id是一至的。 |
手上有STC8A8K64SA13的开发板,我读了一个ram区的id与rom区的 |
每块单片机都有一个唯一的编 |
好像这个挺难破的,这个是怎么搞的,大家看看。 https://download.csdn.net/download/cangfang2006/8291469 读取STC单片机ID号,用CRC-ITU算法加密 完整源代码 读取STC单片机 ID号,利用CRC-ITU算法存入EEPROM,在应用程序中比较单片机ID号和EEPROM中的CRC数据,两者符合规定算法才运行程序执行,这样将达到程序坚不可摧的目的!(在具体应用中,可以灵活修改 生成多项式0X1021的值,防止被破解算法) |
http://www.stcisp.com/stc_id_encryption_stcisp.html 单片机加密保护的几种方式: 其实理论上所有的单片机加密都会被破解,只是成本的问题(含时间成本、金钱成本等)。只要做到解密的成本足够大,让破解者觉得无利可图即算成功! 1、法律保护 由完善的法律加强对盗版的打击。在单片机程序里添加自己的版权、LOGO标记等,作为法庭上的证据(当然要加密保存,并反跟踪,程序运行中要校验是否被修改,如是则作相应的处理)。 2、技术保护。 通常是加密的容易而破解难。现代芯片的加密主要有工艺上缩小线宽、将保密位深埋、读写协议保密、读取敏感区域时自动重启等等方法,让破解者不能取得内部BIN执行代码。这是最基本的保护!假如一个系统的成本为:开发+测试+投产只需5万元,而破解得到BIN文件却要10万元,这时哪谁还去做破解的傻事?? 如果单片机有唯一ID,开发者使用了关联单片机唯一ID的保护方式,可以让加密更上一层楼!哪怕破解者千辛万苦花了大价钱盗取了BIN文件,但不能直接使用,就可以大大增加了系统的保密性。使用唯一ID的加密的方式类似PC软件使用USB加密狗或银行网银使用证书加密,都是通过唯一的标志记号,让系统识别合法用户。 修改单片机的BIN文件需要反汇编,人工阅读分析。小程序容易进行跟踪反汇编,但大程序(例如60KB)时,加密者首先通过各种编程技巧破坏反汇编软件的跟踪,这时需要破解者人工进行层层跟踪了。当遇到包括多次隐蔽转跳、动态加密、代码CRC32校验、动态陷阱和随机报错等等方式,例如60KB的BIN代码,这个可是个浩大的工程,人工处理无疑象大海捞针,沙漠里找金砂! 即使在PC环境如此先进的跟踪环境下,破解PC软件的USB加密狗都很困难,更况且是在单片机的调试环境?! 当解密所花的人力金钱成本和时间成本比重新开发还高,解密将变得不偿失!这绝不是象学生在学校做例题一样:将“判断某条JNZ指令改为JZ”这么简单!说STC唯一ID解密容易的都是些水平不够的新手,根本没有经过实际操作! 也有人说,STC单片机早期的唯一ID是由ISPCODE提供,存在于RAM中的7个字节,而不是光刻在硅晶片上的唯一ID,容易被破坏:只要在程序前做一个转跳去修改该RAM的ID区域为原ID可以破解。认为只有利用在硅片光刻的唯一ID用来加密才是可靠的,例如使用外部器件(例如:DS18B20)的。真是这样吗?答案当然是否定的,他违反了加密的基本常识,使用了外部ID,破解者就可以轻易地使用廉价的另一小单片机模拟这个ID,这样的加密方法是非常脆弱的,是不堪一击的!其次认为该唯一ID存在于RAM,会被后续程序破坏。但实际上加密者可以在启动后其复制到变量中使用,不影响效果。至于认为破解时可修改程序,在RAM中人工生成一个原ID来欺骗加密机制或直接跳过该ID的判断来解密。哈哈,听上去不错。但实际上加密者会首先对程序进行加密反跟踪,而且在程序中有技巧地重重多次判断程序本身是否被修改。若发现被修改则进入会进入保护陷阱! 唯一ID不管是由物理光刻或由厂家的程序生成,只要是原始不被复制直接使用,那都是可靠的保密ID!只有使用象STC单片机的内部唯一ID加密才是上策! 现在,新的STC15F系列单片机还在增加了一种在程序FLASH最后7个字节的新唯一ID!这个是不可改写的,可进一步增强单片机的保密程度,使数据更安全了。所以好好利用单片机内部的唯一ID,是加密的利器,对保护投资者、开发者的合法权益就具有很大意义了。 3、可通过不断优化完善系统,快速升级固件和产品,赢得客户。 |
HC6800-ES-V2.0 发表于 2018-10-10 08:39 谢谢! |
程序仅供参考。 ———————————————————————————————————————————————— #include "reg51.h" typedef unsigned char BYTE; typedef unsigned int WORD; #define ID_ADDR_RAM 0xf1 //ID号的存放在RAM区的地址为0F1H //#define ID_ADDR_RAM 0x71 //对于只有128字节RAM的ID号的存放在RAM区的地址为071H //ID号的存放在程序区的地址为程序空间的最后7字节 //#define ID_ADDR_ROM 0x03f9 //1K程序空间的MCU(如 STC15F201EA, STC15F101EA) //#define ID_ADDR_ROM 0x07f9 //2K程序空间的MCU(如 STC15F402EACS, STC15F202EA, STC15F102EA) //#define ID_ADDR_ROM 0x0bf9 //3K程序空间的MCU(如 STC15F203EA, STC15F103EA) //#define ID_ADDR_ROM 0x0ff9 //4K程序空间的MCU(如 STC15F804EACS, STC15F404EACS, STC15F204EA, STC15F104EA) //#define ID_ADDR_ROM 0x13f9 //5K程序空间的MCU(如 STC15F205EA, STC15F105EA) //#define ID_ADDR_ROM 0x1ff9 //8K程序空间的MCU(如STC15F2K08S2, STC15F808EACS, STC15F408EACS) //#define ID_ADDR_ROM 0x27f9 //10K程序空间的MCU(如 STC15F410EACS) //#define ID_ADDR_ROM 0x2ff9 //12K程序空间的MCU(如 STC15F812EACS, STC15F412EACS) //#define ID_ADDR_ROM 0x3ff9 //16K程序空间的MCU(如STC15F2K16S2, STC15F816EACS) //#define ID_ADDR_ROM 0x4ff9 //20K程序空间的MCU(如STC15F2K20S2, STC15F820EACS) //#define ID_ADDR_ROM 0x5ff9 //24K程序空间的MCU(如 STC15F824EACS) //#define ID_ADDR_ROM 0x6ff9 //28K程序空间的MCU(如 STC15F828EACS) //#define ID_ADDR_ROM 0x7ff9 //32K程序空间的MCU(如STC15F2K32S2) //#define ID_ADDR_ROM 0x9ff9 //40K程序空间的MCU(如STC15F2K40S2) //#define ID_ADDR_ROM 0xbff9 //48K程序空间的MCU(如STC15F2K48S2) //#define ID_ADDR_ROM 0xcff9 //52K程序空间的MCU(如STC15F2K52S2) //#define ID_ADDR_ROM 0xdff9 //56K程序空间的MCU(如STC15F2K56S2) #define ID_ADDR_ROM 0xeff9 //60K程序空间的MCU(如STC15F2K60S2) //----------------------------------------- void InitUart(); void SendUart(BYTE dat); //----------------------------------------- void main() { BYTE idata *iptr; BYTE code *cptr; BYTE i; InitUart(); //串口初始化 iptr = ID_ADDR_RAM; //从RAM区读取ID号 for (i=0; i<7; i++) //读7个字节 { SendUart(*iptr++); //发送ID到串口 } cptr = ID_ADDR_ROM; //从程序区读取ID号 for (i=0; i<7; i++) //读7个字节 { SendUart(*cptr++); //发送ID到串口 } while (1); //程序终止 } /*---------------------------- 初始化串口 ----------------------------*/ void InitUart() { SCON = 0x5a; //设置串口为8位可变波特率 TMOD = 0x00; //定时器1为模式0(16位自动重载) TL1 = 0xd8; //设置波特率重装值 TH1 = 0xff; //115200 bps(65536-18432000/4/115200) TR1 = 1; //定时器1开始启动 } /*---------------------------- 发送串口数据 ----------------------------*/ void SendUart(BYTE dat) { while (!TI); //等待前面的数据发送完成 TI = 0; //清除发送完成标志 SBUF = dat; //发送串口数据 } |
你应该看看芯片手册。 如果是STC的芯片,那么最简单了。 用STC-ISP下载软件,下载一次程序,那么,在信息窗口,就会显示出这个ID号!!!!! ![]() ![]() 看到没?我的芯片ID号? |
不是每一种51单片机都有唯一ID号的。STC的单片机有,PDF说明里有详细说明和读取方法。 |