找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5258|回复: 10
收起左侧

怎么读取52单片机的id号,用于程序加密。

[复制链接]
ID:382454 发表于 2018-10-9 21:02 来自手机 | 显示全部楼层 |阅读模式
每块单片机都有一个唯一的编码,可以用来加密或者用户跟踪,这就是其序列号,怎样读取这个ID号呢?用于加密。谢谢!
回复

使用道具 举报

ID:387733 发表于 2018-10-10 07:05 | 显示全部楼层
不是每一种51单片机都有唯一ID号的。STC的单片机有,PDF说明里有详细说明和读取方法。
回复

使用道具 举报

ID:164602 发表于 2018-10-10 08:39 | 显示全部楼层
你应该看看芯片手册。
如果是STC的芯片,那么最简单了。
用STC-ISP下载软件,下载一次程序,那么,在信息窗口,就会显示出这个ID号!!!!! 1.jpg

2.jpg

看到没?我的芯片ID号?
回复

使用道具 举报

ID:330198 发表于 2018-10-10 09:10 | 显示全部楼层
程序仅供参考。
————————————————————————————————————————————————
#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;                 //发送串口数据
}
回复

使用道具 举报

ID:382454 发表于 2018-10-10 09:15 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-10-10 08:39
你应该看看芯片手册。
如果是STC的芯片,那么最简单了。
用STC-ISP下载软件,下载一次程序,那么,在信息 ...

谢谢!
回复

使用道具 举报

ID:382454 发表于 2018-10-10 09:46 | 显示全部楼层
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、可通过不断优化完善系统,快速升级固件和产品,赢得客户。
回复

使用道具 举报

ID:382454 发表于 2018-10-10 10:15 | 显示全部楼层
好像这个挺难破的,这个是怎么搞的,大家看看。
https://download.csdn.net/download/cangfang2006/8291469

                                                                            读取STC单片机ID号,用CRC-ITU算法加密 完整源代码                                                                                                                                                                                                                                                        读取STC单片机 ID号,利用CRC-ITU算法存入EEPROM,在应用程序中比较单片机ID号和EEPROM中的CRC数据,两者符合规定算法才运行程序执行,这样将达到程序坚不可摧的目的!(在具体应用中,可以灵活修改 生成多项式0X1021的值,防止被破解算法)                                                                    


回复

使用道具 举报

ID:407393 发表于 2018-10-10 10:36 | 显示全部楼层

每块单片机都有一个唯一的编
回复

使用道具 举报

ID:382454 发表于 2018-12-19 17:46 | 显示全部楼层
本帖最后由 univers 于 2018-12-19 18:03 编辑
zhanghyg 发表于 2018-10-10 09:10
程序仅供参考。
—————————————————————————————————————————— ...

#define ID_ADDR_RAM 0xf1        //ID号的存放在RAM区的地址为0F1H
RAM这个0xf1地址是对的,手上的芯片是STC89C52RC,我读出来7位,再累加求和,示显出在数码管里。每片芯片都不一样。
但是我想读ROM的ID号,读出来是错的,地址是看说明书找到的,#define ID_ADDR_ROM 0x1ff9
几个芯片读出来全都是一样的,好晕。
请问楼主STC89C52RC的程序区ROM   ID首地址是在那里哦??
谢谢!!!
捕获.PNG
回复

使用道具 举报

ID:382454 发表于 2018-12-19 22:37 来自手机 | 显示全部楼层
手上有STC8A8K64SA13的开发板,我读了一个ram区的id与rom区的
回复

使用道具 举报

ID:382454 发表于 2018-12-19 22:37 来自手机 | 显示全部楼层
手上有STC8A8K64SA13的开发板,我读了一个ram区的id与rom区的id是一至的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表