【寻找加密的钥匙】实际测试证实了一款有序列号的AVR芯片 附加源代码和测试结果截图
受到这个帖子启发http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3668848&bbs_page_no=1&search_mode=4&search_text=allenjoe&bbs_id=9999
准备把手头能找到的板子都拿过来测试了一遍。
刚刚找到一个有序列号的芯片,上来通知大家一声。。。。。。
第一个测试通过的芯片型号是MEGA2560.
继续测试中。。。。。。
想象和推理还不如实际试试来的实在些。。。。。
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_515447.JPG
源代码 (原文件名:SOURCE.JPG)
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_515448.JPG
一个MEGA2560读取的序列号 (原文件名:SN1.JPG)
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_515449.JPG
另外一个MEGA2560读取的序列号 (原文件名:SN2.JPG) 好消息 真假? 加密有多了一种方法了,哈哈! x4档案,哈哈 lz多测试几种型号吧 mark 楼主能否提供BOOT H 我的文件里没有这个,是不是你自造的? 按个爪印 【7楼】 zhwm3064 沉伦蜗牛
楼主能否提供BOOT H 我的文件里没有这个,是不是你自造的?
============================
新版 avr-libc 里有
PS:不知道什么是 avr-libc 的话,直接装最新版本 win-avr …… zhuayin mark 怎么用于批量生产的加密? to:【12楼】 yangyi 看看“对于猖獗的盗版我们的下载器,我们的老版下载器再次**30元**价格出售,售完为止。 ”这个帖子曾提到读出系列号的事
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3728721&bbs_page_no=1&search_mode=4&search_text=zhifeng&bbs_id=9999
我们经过研究已能实现这个功能了。在此多谢“傻孩子”没他的提示还真不知怎么做。
我的zf-008+已基本实现这个功能了,可以用008+ 读出atmel的avr芯片系列号,然后转存到flash或eeprom。具体如何对比限制,就看用户自己的了。 2楼
真假?
》》》》》》》》》》》》》》》
肯定是真的。
不信你试试。。。 回复5楼
lz多测试几种型号吧
》》》》》》》》》》》》》》》》》》》
正在测试 MEGA32/MEGA16/MEGA88/MEGA88P/MEGA128
遇到点障碍,正在查找相关的寄存器是否存在或者名称不同。 感谢9楼帮我回复7楼
WinAVR-20071221\avr\include\avr
这个目录下面就有。。。。 回复13楼
to:【12楼】 yangyi 看看“对于猖獗的盗版我们的下载器,我们的老版下载器再次**30元**价格出售,售完为止。 ”这个帖子曾提到读出系列号的事
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3728721&bbs_page_no=1&search_mode=4&search_text=zhifeng&bbs_id=9999
我们经过研究已能实现这个功能了。在此多谢“傻孩子”没他的提示还真不知怎么做。
我的zf-008+已基本实现这个功能了,可以用008+ 读出atmel的avr芯片系列号,然后转存到flash或eeprom。具体如何对比限制,就看用户自己的了。
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
看了你的帖子
里面只提到这些:。。。。。
我们经过研究已能实现利用atmel芯片系列号加密这个功能了。在此多谢“傻孩子”没他的提示还真不知怎么做。
我的zf-008+已基本实现这个功能了,可以用008+ 读出atmel的avr芯片系列号,然后转存到flash或eeprom。具体如何对比限制,就看用户自己的了。
12楼去看了估计也没什么帮助。。。。 哥哥,姐姐帮忙测下m16,m32有没有唯一ID? 貌似只有几个芯片支持这个功能?
常用的低端芯片,如M8,M16好像都不具备这个。
测试代码如下:
#include "avr/io.h"
#include "avr/boot.h"
int main(void)
{
unsigned char sn;
unsigned char i;
for(i=0;i<10;i++)
{
sn=boot_signature_byte_get(0x07*2+i);
}
while(1)
{
;
}
}
使用m16和m32进行编译,出现如下错误:
main.c:9: error: 'SIGRD' undeclared (first use in this function)
main.c:9: error: (Each undeclared identifier is reported only once
main.c:9: error: for each function it appears in.)
说是寄存器没定义。
通过搜索include/avr文件夹
发现只有如下几个文件里面有这个定义。
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_515727.JPG
(原文件名:未命名.JPG)
是不是说,只有这些芯片才支持这个功能呢?
奇怪的是,里面没有看见有M2560(楼主测试的芯片)
ps:winavr是从sf下载的20090313 只要确定AVR芯片均存在唯一序列号,加密和量产应该不是问题,以下是一点愚见:
1、用户读出序列号,应该是在BOOTLOADER里进行,所以处理比对序列号应该是在BOOT里,如果读出序列号与你予存序列号不一至,你可以执行擦除FLASH,至于擦除全部还是某一部分,你自己说了算。
2、编程器写用户程序时,把序列号写到某指定FLASH地址,供BOOTLOADER比对序列号用;
在此对于量产就没什么难度了,你只要把同样BOOTLOADER程序和用户程序写入芯片即可。
至于加密,我只是提一个简单的思路,相信你完全可以做得更隐蔽些。
由于近一段较忙,没对AVR序列号问题进行过研究和测试,看到大家为此做出的无私奉献,我深感愧疚,再次感谢傻孩子和智峰,也希望大家尽早做出具有更强加密性的AVR产品来。 观望中... 抽时间测试M128,如果这个ID号可用,我们有个产品就不用这么快over了 好东东 回复20楼觉得很奇怪的问题
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
我找到原因了
iom2560.h里面有include了
/* avr/iom2560.h - definitions for ATmega2560 */
#ifndef _AVR_IOM2560_H_
#define _AVR_IOM2560_H_ 1
#include <avr/iomxx0_1.h> 刚刚测试了M128
首先是编译不通过
找不到SIGRD
然后找到手册和M2560相同的位置
发现这个位置在M128是保留为
把SIGRD define成5后测试,每一片M128读出的值都一样。
下面是手册截图
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_515782.JPG
M128中SIGRD位置是保留位 (原文件名:M128.JPG) 回复23楼
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
M128很有可能不行。。。。。 最新消息
M32也不行
情况和M128相同 建议论坛上的朋友一起来测,集众人之力,做一份完整的列表。 有图有真相
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_515787.JPG
(原文件名:signature.JPG) 我只是给你指出90USB的官方文档有明确的序列号。剩下的都是你们自己的劳动成果。
Have a good time. 呵呵,论坛里不是有些“牛B的人”会直接反汇编HEX的,这种“低级”的加密方式对这些“牛B的人”应该没什么用啊。 回复30楼
>>>>>>>>>>
我用的AVR STDIO是 4.18
WINAVR是WinAVR-20071221比较老了
马上准备换WinAVR-20090313-install.exe 了. 回复31楼
>>>>>>>>>>>>>>>>>>>>>>>>>>>
你那段我也看到了
可惜的是这段写的是用下载线或者编程器读取.
而不是自己读自己. 回复32楼
>>>>>>>>>>>>>>>>>>>>>>>>>>
源头是从你那里来的,还是很感谢.... 回复33楼
呵呵,论坛里不是有些“牛B的人”会直接反汇编HEX的,这种“低级”的加密方式对这些“牛B的人”应该没什么用啊。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
序列号这个东西,牛人完全可以把它加密的很高级,各显神通了,
这点在这个论坛上已经有很多讨论了,
绝对可以做到解密成本很高而且量产方便,我也还在研究中,暂时不多发表意见.......
当然也欢迎继续讨论. 直接反汇编,这种作用也不大 mik 猜想pa后缀的都带,有空去试下,结果会公布出来 回复40楼
猜想pa后缀的都带,有空去试下,结果会公布出来
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
我刚刚测试了MEGA88PA
结果很崩溃啊.
测试了几片读出来都是一样的.......
截图如下:
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_515836.JPG
(原文件名:MEGA88PA.JPG) To【41楼】 allenjoe
我测试了我手头的M88PA,读出来的SN和你的不同,大概是不同批次的SN不同,不是每块芯片SN不同。我手头只有一块M88PA特意买过来测试这个用的
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_515852.JPG
(原文件名:88test.JPG) 大家也测试一下手头的M88PA看是否不同 没定义SIGRD的自己定义SIGRD=5即可,应该所有AVR都一样的。 记号... 我只有低端的芯片,多半是不会有的了。 hex 到 asm 都不太容易做的。
目前只做51的反汇编和avr的汇编。
一般来说,如果在编译器上边不做手脚的话,hex是较容易攻破的。
全局变量泄漏的可能性要高于局部变量的。
尽管多数时候gcc-avr 都能很好的工作并且效率也不差,但是在某些情况下面临更换CPU系列的窘境。这个时候如果用汇编做一些模块可能更能够节省时间。不过这样做显然是以后续的可升级性做代价的。
下面代码是在mega8515,16m时钟上实现将 8位1M sps的数据写入16个连续的32Kbytes 空间,要求没有相位噪声。这用C是无法实现的。
#include <avr/io.h>
.section .text
.global vHighSpeedADC
.global vMidSpeedADC
.global cLowSpeedADC
.global cMemoryTest
vHighSpeedADC:
cli
push r0
push r1
push r2
push r3
push r16
push r30
push r31
clr r0
clr r1
clr r2
clr r3
ldi r30,0x00 ;Z low
ldi r31,0x80 ;Z Hi
mov r3,r31 ;Ram Address Hi
clr r0
ldi r16,0x0f
out 0x18,r0 ;PORTB
out 0x17,r16 ;DDRB
clr r0
ldi r16,0x07
; ldi r16,0x09
out 0x25,r0 ;ICR1H
out 0x24,r16 ;ICR1L
clr r0
ldi r16,0x02
out 0x2b,r0 ;OCR1AH
out 0x2a,r16 ;OCR1AL
clr r0
out 0x29,r0 ;OCR1BH
out 0x28,r16 ;OCR1BL
clr r0
out 0x2d,r0 ;TCNT1H
out 0x2c,r0 ;TCNT1L
ldi r16,0x50 ;
out 0x2f,r16 ;TCCR1A
ldi r16,0x19 ;
out 0x2e,r16 ;TCCR1B
ldi r16,0x06
out 0x06,r16 ;DDRE
ldi r16,0xe0
out 0x11,r16 ;DDRD
clr r30
ldi r31,0x80
mov r3,r31
clr r16
delay:
inc r16
cpi r16,20
brne delay ;2
clr r2
out 0x18,r2 ;PORTB
; wdr
; wdr
; wdr
; wdr
rjmp la0
la7:
ldi r16,0x80
mov r3,r16
la9:
clr r0
wdr
ori r31,0x80
la12:
out 0x18,r2
la0:
lds r1,0x4000 ;2 ;2
st z+,r1 ;2 ;2
ori r31,0x80
cpse r30,r0 ;1 ;2
rjmp la7 ;2 ;
cpse r31,r3 ;1 ;2
rjmp la9 ;2 ;
inc r2 ;1 ;1
sbrs r2,0x04 ;1
rjmp la12 ;2 ;
clr r16
out 0x2e,r16 ;TCCR1B
out 0x2f,r16 ;TCCR1A
pop r31
pop r30
pop r16
pop r3
pop r2
pop r1
pop r0
sei
ret MARK!关注!!! 关注!!! 如果,程序很大,估计反汇编就没信心了 mark 这个要顶! mark 发现MEGA88PA数据手册一处错误
在第285页有提到SPMCSR中的SIGRD,但是在SPMCSR的描述中却没有SIGRD,5的位置是保留的. 好贴留名 楼主啊,对那些会动嘴皮子的“牛B的人”,你什么牛B的加密法都没有用的,因为他们只要动嘴巴就可以了。
其实吧,要个序列号还是挺容易的,我做过试验的,同一批次的6个芯片,其四个时钟校正值都是不同的,用这个当序列号用就可以了。
没必要费这个力去找有专用序列号的片子。 mark 回复56楼
》》》》》》》》》》》》》》》》》
如果时钟校准值的差异性确实比较大,是可以作为序列号。
这点大家也可以一起测试一下。。。。
这些芯片大家手头应该都有。 以下是这四个校准字的位置 大家一起来测试
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_516090.JPG
(原文件名:OSCCAL-4.JPG) 校准字的读取代码
osccal_all = boot_signature_byte_get(0x01);
osccal_all = boot_signature_byte_get(0x03);
osccal_all = boot_signature_byte_get(0x05);
osccal_all = boot_signature_byte_get(0x07);
经过测试MEGA128无法用上面的代码读取的值都是0XC0 MEGA88PA只有一个校准字
osccal_all = boot_signature_byte_get(0x01);
可以读取到这个校准字的不同
意外的发现
osccal_all = boot_signature_byte_get(0x05);
测试的两片也能读到不同的值。。。。。。。 太帅了~~ 时钟校正值,在m88里测试过,50片左右,重复的值只有3-4片,用来加密挺合适的。 63楼,要四位一起看,单一的一位,理论值也才1/255。 单片机端只能读出一个,4个是没用的,只要那个默认的有用 这是分析一款序列号加密的小程序,读出序列号:
loc_486A:
mov r16, r24
ldi r17, 0 ;
call sub_4ED1;读芯片数据00-20 =>01a7-01c6
ldi r31, 0 ;
mov r30, r24
subi r30, 0x59 ;
sbci r31, -2 ;
st Z, r16 ; 保存数据到01A7
ldi r16, 5 ;
rcall sub_48C1;延时
inc r24
cpi r24, 0x20 ;
brcs loc_486A
ldi r16, 1 ;
ldi r17, 0 ;
call sub_4ED8;读锁定位
cpi r16, 0xcc ; 0xCC
breq loc_4884
ldi r16, 0xcc ;
call sub_4EE8;写锁定位
rjmp loc_4884
sub_4ED1: ;1.00 2.01
rcall sub_4EF1
movw r30, r16
ldi r20, 0x21 ; 0010 0001
out SPMCSR, r20
.dw 0x95D8 ;elpm R0 ← (RAMPZ:Z)
mov r16, r0
rjmp sub_4EF1
; End of function sub_4ED1
sub_4ED8: ;1.Z=01 读锁定位
rcall sub_4EF1
movw r30, r16
ldi r20, 9 ;
out SPMCSR, r20 ;0000 1001
.dw 0x95D8 ;elpm
mov r16, r0
rjmp sub_4EF1
; End of function sub_4ED8
sub_4EDF:
movw r0, r18
movw r30, r16
ldi r20, 1 ; <suspicious>
in r21, SREG
cli
out SPMCSR, r20
spm
out SREG, r21
rjmp sub_4EF1
; End of function sub_4EDF
sub_4EE8:
rcall sub_4EF1
mov r0, r16;0xCC 1100 1100
ldi r20, 9 ;
in r21, SREG;
cli
out SPMCSR, r20;0000 1001
spm
out SREG, r21
rjmp sub_4EF1
; End of function sub_4EE8
sub_4EF1:
in r18, SPMCSR ;SPMCSR 存贮程序存储控制器和状态寄存器包括了控制Boot Loader 操作所需的控制位
sbrc r18, 0 ; 若寄存器的某一位清零即跳过下面的
rjmp sub_4EF1
ret mark 记号 progisp 读出m8,m16的系列号
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_516603.jpg
(原文件名:sn.jpg) zhifeng,赶快升级,支持读取序列号,同时用序列号和校准字加密你的固件,让盗版消失。 记号,很有用的 65楼已经帮我回复64楼了,MEGA8,MEGA16使用单片机读取自己的时钟校准确实只能读到一个。
用编程器才可以读到4个。
应用场合不同。。。。 mark mark 研究的真够深入!
佩服! 关注 记下,继续关注。很有用 有用的东西要记号的~~~~~~~~ mark ma...r..k 具有序列号的型号:
1、AT90PWM81
2、AT90SCR100
3、ATmega1284P
4、ATmega128RFA1
5、ATmega16M1
6、ATmega16U4
7、ATmega32C1
8、ATmega32HVB
9、ATmega32M1
10、ATmega32U4
11、ATmega32U6
12、ATmega406
13、ATmega64C1
14、ATmega64M1
15、ATmega640
16、Atmega1280
17、ATmega1281
18、ATmega2560
19、ATmega2561
20-23、ATmega164P/324P/644P and ATmega644
24、ATmega8HVA
25、ATmega16HVA
26、ATtiny167
27、ATtiny87
28、AT90USB82
29、AT90USB162
30、AT90USB646
31、AT90USB647
32、AT90USB1286
33、AT90USB1287 mark 好贴啊。终于不会被赖账了 的却不错 remark 关注........ mark 很好!支持一下! mark mark xmega芯片有没有这个东东啊 MARK mark 加密中。。。 这个信息很有用,以前校准值很容易被绕过 mark mark mark 记号 mark加密中。。。 mark
页:
[1]
2