logo资料库

STC烧断管脚加密方法公开!.pdf

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
STC烧断管脚加密方法公开! 烧断管脚加密方法公开! 芯片的解密和加密是个矛盾的问题,芯片加密方法是芯片设计公司为了提高单片机的保密性而设计的,而解密 是属于逆向分析设计的,设计公司和解密公司的竞争一直没有停止过,设计公司在不断的提高保密手段,而解 密公司也在不断的产生新的解密手段。 芯片的加密方法和手段设计好以后,在烧录的时候就自动加密(现在也有的在烧断不用的管脚来加密),从网上看到很多人提 到在使用芯片的时候采用一些方法,比如说把型号号磨掉,打上自己编的型号,在芯片外围设计陷阱电路,所有这些都是对芯 片解密不明白的人提出的,一个专业解密的技术人员,很快就能确认芯片原来的型号,如果您有这样的芯片我可以帮你,至于 外围的陷阱电路,懂的电路分析也很快就能解决,这些手段目的是为了给仿照者增加难度,其实给自己生产增加了更多的难度 和成本。谈到加密自然要谈解密方法,目前芯片解密的方法可以分为侵入式和非侵入式,也有的人把另一种叫半侵入式。目的 都是要让芯片的加密失效。因为非侵入式需要的设备比较昂贵,在市场上做解密的公司一般都不具备,只有在IC分析或做专门 的逆向的公司可能做这个方面的工作。侵入式在借助与IC分析公司的设备的帮助下,是目前比较流行的手段。当一块芯片经过 去层处理,全部暴露在了解密者面前的时候,那就只剩下找出加密位和如何能绕过加密位的问题了,这样的方法一旦成功,同 样型号的芯片以后都可以这么做。 51系列单片机在国内占领了很大一部分市场,工程师设计了一个月的程序可能在10分钟几百元就被解密公司破解了,但也不 能因噎费食而不采用,毕竟51的资源还是比较不错的。 国内宏晶公司的STC单片机是51单片机里的一枝独秀,它超强的抗干 扰和稳定的性能丰富的资源吸引着无数的工程师和生产厂家,STC的内部加密确实优于其它51单片机,目前市场上普通的51 烧断脚解密已经可以轻易的破解,而STC烧断脚的解密成本非常昂贵,难度也非常的高,建议各位开发工程师选用STC烧断脚 的方法为产品进行加密,如果竞争对手要仿你的产品,其解密费用也会让他忘而却步,再三衡量的。 有关STC烧断脚的方法我们可以免费为客户提供,也提供为客户进行非恢复性加密,具体方法如下: 1:用STC专用下载板将程序烧进STC89芯片 2:用RF2148的一个非恢复性加密的功能将你所不用的STC89的管脚烧断,这种方法不用将IC放座子上,只需将电源和地接 线出来,还有你所需要烧断的那个脚接出来,按下图放好以后,点击非恢复性加密就可以了。如果需要烧断多个脚按此方法重 做几次就可以了。 3:注:烧断脚的STC89单片机不影响程序升级及新程序的下载,建议烧断的脚位:P0.0-P0.7,P2.6,P2.7,如P口都需用到可选烧 断:PSEN,ALE,EA STC单片机IO管脚毁坏动态自检程序 /*--------------------------------------------------------- STC单片机IO管脚毁坏动态自检程序 HotPower@126.com 2005.6.6 于西安大雁塔村队部 ----------------------------------------------------------*/ #i nclude #i nclude #i nclude #i nclude #i nclude #pragma NOAREGS //STC ISP_V2.0 PCB的晶振为18.432MHz #define WdtTime_71_1mS 0x30 //71.1mS #define WdtTime_141_2mS 0x31 //141.2mS #define WdtTime_284_4mS 0x32 //284.4mS #define WdtTime_568_8mS 0x33 //568.8mS #define WdtTime_1_1377S 0x34 //1.1377S #define WdtTime_2_755S 0x35 //2.755S
#define T2_5mS -1536*5//5ms 18.432MHz /*------------------------------------------------ AT89S5X --------------------------------------------------*/ sfr AUXR = 0x8e; sfr WDTRST = 0xa6; sfr16 TIMEER2 = 0xcc; sfr16 RCAP = 0xca; /*------------------------------------------------ STC89C5XRC --------------------------------------------------*/ sfr WDT_CONTR = 0x0e1; //全局变量定义 typedef struct Systemstruct{//系统数据结构 unsigned char TimeCount; unsigned int RamTest; unsigned char SioTxCount; unsigned char SioTxSum; unsigned char SioRxCount; unsigned char SioTxBuff[32]; // unsigned char SioRxBuff[32]; }SystemData; data SystemData SystemBuffers;//申请系统数据结构 void MainInit(void);//系统初始化 void SystemInit(void);//系统初始化 void SystemSetup(void);//系统设置 void SystemIoInit(void);//系统接口初始化 void TimeInit(void);//定时器定时参数设置 void UserSetup(void);//用户运行环境设置 void ClrWdt(void);//喂狗 void IoPinTest(void); unsigned char Port0Test(void); unsigned char Port1Test(void); unsigned char Port2Test(void); unsigned char Port3Test(void); void main(void) {
MainInit();//系统初始化 while (1) {//主循环 IE |= 0xb2;//保证中断可靠EA,ET2,ES,ET0 TCON |= 0x55;//保证定时器开 PCON |= SMOD_ + GF0_ + IDL_;//进入空闲状态并喂软件狗 _nop_(); _nop_(); } } void MainInit(void) using 0//系统初始化 { ClrWdt();//清除看门狗计数器 SystemIoInit();//系统接口初始化 SystemInit();//系统上电初始化 SystemSetup();//系统运行环境设置 UserSetup();//用户运行环境设置 } void SystemInit(void) using 0//系统初始化 { if (SystemBuffers.RamTest != 0x55aa) {//内存初始化 SystemBuffers.RamTest = 0x55aa; } else { } } void SystemSetup(void) using 0//系统设置 { TimeInit(); } void SystemIoInit(void) using 0 { IE = 0x00;//关闭中断 P2 = 0xff;//P2口初始化 P0 = 0xff;//P0口初始化 P1 = 0xff;//P1口初始化 P3 = 0xff;//P3口初始化 }
void TimeInit() using 0 { // TCON = 0x55;//启动定时器 /*---------------------------------- 定时器0定时参数设置 ----------------------------------*/ TL0 = 0; TH0 = 0; TR0 = 1;//启动定时器0 /*---------------------------------- 定时器1定时参数设置 ----------------------------------*/ TMOD = 0x20; TH1 = 0xfb;//Fosc=18.432MHz th1=tl1=0xfb bps=9600 TL1 = TH1; SCON = 0xd8; PCON = 0x80;//2*bps=9600*2=19200 TR1 = 1;//启动定时器1 /*---------------------------------- 定时器2定时参数设置 ----------------------------------*/ TIMEER2 = T2_5mS; RCAP = T2_5mS; TR2 = 1;//启动定时器2 } void UserSetup(void) using 0//用户运行环境设置 { SystemBuffers.SioTxCount = 0; } void ClrWdt(void) using 0//喂狗 { WDT_CONTR = WdtTime_1_1377S;//1.1377S喂狗 } /*------------------------------------ P0端口测试 主要测试管脚接电源或地及相临管脚的短路 注意:此函数必须配合P0口上拉电阻!!!
-------------------------------------*/ unsigned char Port0Test(void) { unsigned char testval; P0 = 0x55;//奇数管脚发低电平 _nop_();//延时 testval = P0 ^ 0x55;//比较发送及接收结果 P0 = 0xaa;//偶数管脚发低电平 _nop_();//延时 testval |= P0 ^ 0xaa;//比较发送及接收结果(2次的) P0 = 0xff;//释放P0口,防止外部接入电源 return testval;//测试成功返回0 } /*------------------------------------ P1端口测试 主要测试管脚接电源或地及相临管脚的短路 -------------------------------------*/ unsigned char Port1Test(void) { unsigned char testval; P1 = 0x55;//奇数管脚发低电平 _nop_();//延时 testval = P1 ^ 0x55;//比较发送及接收结果 P1 = 0xaa;//偶数管脚发低电平 _nop_();//延时 testval |= P1 ^ 0xaa;//比较发送及接收结果(2次的) P1 = 0xff;//释放P1口,防止外部接入电源 return testval;//测试成功返回0 } /*------------------------------------ P2端口测试 主要测试管脚接电源或地及相临管脚的短路 -------------------------------------*/ unsigned char Port2Test(void) { unsigned char testval; P2 = 0x55;//奇数管脚发低电平
_nop_();//延时 testval = P2 ^ 0x55;//比较发送及接收结果 P2 = 0xaa;//偶数管脚发低电平 _nop_();//延时 testval |= P1 ^ 0xaa;//比较发送及接收结果(2次的) P2 = 0xff;//释放P2口,防止外部接入电源 return testval;//测试成功返回0 } /*------------------------------------ P3端口测试 主要测试管脚接电源或地及相临管脚的短路 -------------------------------------*/ unsigned char Port3Test(void) { unsigned char testval; P3 = 0x55;//奇数管脚发低电平 _nop_();//延时 testval = P3 ^ 0x55;//比较发送及接收结果 P3 = 0xaa;//偶数管脚发低电平 _nop_();//延时 testval |= P3 ^ 0xaa;//比较发送及接收结果(2次的) P3 = 0xff;//释放P1口,防止外部接入电源 return testval;//测试成功返回0 } void IoPinTest(void) { unsigned char i, err = 0, pin = 0; // if (pin = Port0Test()) err = 1;//如果P0口上拉可开放此行 if (pin = Port1Test()) err = 2; if (pin = Port2Test()) err = 3; if (pin = Port3Test()) err = 4; if (err) { if ((TI == 0) && (SystemBuffers.SioTxCount == 0)) { for (i = 0; i < 8; i++) { if (pin & 1) break; pin >>= 1; }
strcpy(SystemBuffers.SioTxBuff, "P0_0 is Bad!!!\n"); SystemBuffers.SioTxBuff[1] += err - 1; SystemBuffers.SioTxBuff[3] += pin; SystemBuffers.SioTxCount = strlen(SystemBuffers.SioTxBuff); SystemBuffers.SioTxSum = SystemBuffers.SioTxCount; TI = 1; } } } /*------------------------------------ 定时器T0中断服务程序 ------------------------------------*/ void t0proc() interrupt TF0_VECTOR using 1 { } /*------------------------------------ 定时器T1中断服务程序 ------------------------------------*/ void t1proc() interrupt TF1_VECTOR using 1 { } /*------------------------------------ 定时器T2中断服务程序(5mS) ------------------------------------*/ void t2proc() interrupt TF2_VECTOR using 0 { TF2 = 0; if (PCON & GF0_) {//中断是从主循环内跳入的才能喂狗 ClrWdt();//清除看门狗计数器 PCON &= ~GF0_;//清除标志 } IoPinTest(); } /*------------------------------------ 串口中断服务程序(错误报告) ------------------------------------*/ void sioproc() interrupt SIO_VECTOR using 1
{ //unsigned char i; if (RI) {//接收中断 RI = 0; } if (TI) {//发送中断 TI = 0; if (SystemBuffers.SioTxCount) {//允许串口发送数据 SBUF = SystemBuffers.SioTxBuff[SystemBuffers.SioTxSum - SystemBuffers.SioTxCount];//串口显示 SystemBuffers.SioTxCount --; } } } /*------------------------------------ 外部INT0中断服务程序 ------------------------------------*/ void int0proc() interrupt IE0_VECTOR using 0 { } /*------------------------------------ 外部INT1中断服务程序 ------------------------------------*/ void int1proc() interrupt IE1_VECTOR using 0 { } 也谈STC加密:关于用stc的id批量快速生产加密产品的问题 在单片机程序中设一ID运算的函数,得到一个结果,将此结果和STC中某FLASH段的值比较,相同既合法,不同的话,通过 串 口将ID发出,等待回应,PC机接到ID后,通过同样的运算得到结果回送给单片机,单片机将此结果存到此FLASH段,下次单 片 机再上电就能得到合法认证了。 反正每台设备生产好后都要检测的,在检测时完成上述工作就行了。 此方法可以有效的防止没文化的流氓,对于有文化的,估计就不做流氓了 ;-)
分享到:
收藏