allenjoe 发表于 2009-12-16 15:25:26

【寻找加密的钥匙】实际测试证实了一款有序列号的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)

dieieie 发表于 2009-12-16 17:59:18

好消息

999999 发表于 2009-12-16 18:05:20

真假?

shanyan 发表于 2009-12-16 18:05:37

加密有多了一种方法了,哈哈!

icer1 发表于 2009-12-16 18:33:55

x4档案,哈哈

dieieie 发表于 2009-12-16 20:31:34

lz多测试几种型号吧

qianhng 发表于 2009-12-16 22:32:25

mark

zhwm3064 发表于 2009-12-16 22:58:24

楼主能否提供BOOT H 我的文件里没有这个,是不是你自造的?

h2feo4 发表于 2009-12-16 23:11:16

按个爪印

watercat 发表于 2009-12-16 23:15:40

【7楼】 zhwm3064 沉伦蜗牛

楼主能否提供BOOT H 我的文件里没有这个,是不是你自造的?

============================

新版 avr-libc 里有

PS:不知道什么是 avr-libc 的话,直接装最新版本 win-avr ……

liu969610245 发表于 2009-12-16 23:51:20

zhuayin

funghome 发表于 2009-12-17 00:07:44

mark

yangyi 发表于 2009-12-17 07:23:26

怎么用于批量生产的加密?

zhifeng 发表于 2009-12-17 08:47:12

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。具体如何对比限制,就看用户自己的了。

allenjoe 发表于 2009-12-17 09:17:05

2楼
真假?
》》》》》》》》》》》》》》》
肯定是真的。
不信你试试。。。

allenjoe 发表于 2009-12-17 09:20:02

回复5楼
lz多测试几种型号吧
》》》》》》》》》》》》》》》》》》》
正在测试 MEGA32/MEGA16/MEGA88/MEGA88P/MEGA128
遇到点障碍,正在查找相关的寄存器是否存在或者名称不同。

allenjoe 发表于 2009-12-17 09:22:22

感谢9楼帮我回复7楼

WinAVR-20071221\avr\include\avr

这个目录下面就有。。。。

allenjoe 发表于 2009-12-17 09:26:55

回复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楼去看了估计也没什么帮助。。。。

neutronlmk 发表于 2009-12-17 09:47:43

哥哥,姐姐帮忙测下m16,m32有没有唯一ID?

zxq6 发表于 2009-12-17 10:14:42

貌似只有几个芯片支持这个功能?
常用的低端芯片,如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

flywater 发表于 2009-12-17 10:32:08

只要确定AVR芯片均存在唯一序列号,加密和量产应该不是问题,以下是一点愚见:
1、用户读出序列号,应该是在BOOTLOADER里进行,所以处理比对序列号应该是在BOOT里,如果读出序列号与你予存序列号不一至,你可以执行擦除FLASH,至于擦除全部还是某一部分,你自己说了算。
2、编程器写用户程序时,把序列号写到某指定FLASH地址,供BOOTLOADER比对序列号用;

在此对于量产就没什么难度了,你只要把同样BOOTLOADER程序和用户程序写入芯片即可。
至于加密,我只是提一个简单的思路,相信你完全可以做得更隐蔽些。
由于近一段较忙,没对AVR序列号问题进行过研究和测试,看到大家为此做出的无私奉献,我深感愧疚,再次感谢傻孩子和智峰,也希望大家尽早做出具有更强加密性的AVR产品来。

cowboy 发表于 2009-12-17 10:40:23

观望中...

Appcat 发表于 2009-12-17 10:50:17

抽时间测试M128,如果这个ID号可用,我们有个产品就不用这么快over了

htqxinni999 发表于 2009-12-17 10:55:49

好东东

allenjoe 发表于 2009-12-17 13:18:24

回复20楼觉得很奇怪的问题
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
我找到原因了
iom2560.h里面有include了
/* avr/iom2560.h - definitions for ATmega2560 */

#ifndef _AVR_IOM2560_H_
#define _AVR_IOM2560_H_ 1

#include <avr/iomxx0_1.h>

allenjoe 发表于 2009-12-17 13:22:53

刚刚测试了M128
首先是编译不通过
找不到SIGRD
然后找到手册和M2560相同的位置
发现这个位置在M128是保留为
把SIGRD define成5后测试,每一片M128读出的值都一样。

下面是手册截图


http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_515782.JPG
M128中SIGRD位置是保留位 (原文件名:M128.JPG)

allenjoe 发表于 2009-12-17 13:24:08

回复23楼
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
M128很有可能不行。。。。。

allenjoe 发表于 2009-12-17 13:24:48

最新消息
M32也不行
情况和M128相同

allenjoe 发表于 2009-12-17 13:29:28

建议论坛上的朋友一起来测,集众人之力,做一份完整的列表。

dreampet 发表于 2009-12-17 13:32:23

有图有真相
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_515787.JPG
(原文件名:signature.JPG)

Gorgon_Meducer 发表于 2009-12-17 13:37:47

我只是给你指出90USB的官方文档有明确的序列号。剩下的都是你们自己的劳动成果。
Have a good time.

YaoHui 发表于 2009-12-17 13:48:13

呵呵,论坛里不是有些“牛B的人”会直接反汇编HEX的,这种“低级”的加密方式对这些“牛B的人”应该没什么用啊。

allenjoe 发表于 2009-12-17 13:55:40

回复30楼
>>>>>>>>>>
我用的AVR STDIO是 4.18
WINAVR是WinAVR-20071221比较老了
马上准备换WinAVR-20090313-install.exe 了.

allenjoe 发表于 2009-12-17 13:57:13

回复31楼
>>>>>>>>>>>>>>>>>>>>>>>>>>>
你那段我也看到了
可惜的是这段写的是用下载线或者编程器读取.
而不是自己读自己.

allenjoe 发表于 2009-12-17 13:58:44

回复32楼
>>>>>>>>>>>>>>>>>>>>>>>>>>
源头是从你那里来的,还是很感谢....

allenjoe 发表于 2009-12-17 14:03:54

回复33楼
呵呵,论坛里不是有些“牛B的人”会直接反汇编HEX的,这种“低级”的加密方式对这些“牛B的人”应该没什么用啊。


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

序列号这个东西,牛人完全可以把它加密的很高级,各显神通了,
这点在这个论坛上已经有很多讨论了,
绝对可以做到解密成本很高而且量产方便,我也还在研究中,暂时不多发表意见.......
当然也欢迎继续讨论.

lixun00 发表于 2009-12-17 14:27:18

直接反汇编,这种作用也不大

XU_MAJIA 发表于 2009-12-17 14:32:04

mik

dieieie 发表于 2009-12-17 15:49:29

猜想pa后缀的都带,有空去试下,结果会公布出来

allenjoe 发表于 2009-12-17 16:02:36

回复40楼
猜想pa后缀的都带,有空去试下,结果会公布出来
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
我刚刚测试了MEGA88PA
结果很崩溃啊.
测试了几片读出来都是一样的.......
截图如下:

http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_515836.JPG
(原文件名:MEGA88PA.JPG)

lookavr 发表于 2009-12-17 16:55:58

To【41楼】 allenjoe
我测试了我手头的M88PA,读出来的SN和你的不同,大概是不同批次的SN不同,不是每块芯片SN不同。我手头只有一块M88PA特意买过来测试这个用的
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_515852.JPG
(原文件名:88test.JPG)

lookavr 发表于 2009-12-17 16:57:16

大家也测试一下手头的M88PA看是否不同

qianhng 发表于 2009-12-17 17:08:11

没定义SIGRD的自己定义SIGRD=5即可,应该所有AVR都一样的。

hy317 发表于 2009-12-17 17:11:59

记号...

phone 发表于 2009-12-17 19:18:20

我只有低端的芯片,多半是不会有的了。

nano 发表于 2009-12-17 20:35:44

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

plc_avr 发表于 2009-12-17 21:46:09

MARK!关注!!!

hzpyl 发表于 2009-12-17 22:05:45

关注!!!

zhifeng 发表于 2009-12-17 22:08:26

如果,程序很大,估计反汇编就没信心了

shdzbsl 发表于 2009-12-17 22:52:17

mark

youpeng 发表于 2009-12-18 00:08:10

这个要顶!

wchuxin 发表于 2009-12-18 01:48:23

mark

allenjoe 发表于 2009-12-18 09:22:17

发现MEGA88PA数据手册一处错误
在第285页有提到SPMCSR中的SIGRD,但是在SPMCSR的描述中却没有SIGRD,5的位置是保留的.

yyyytttt12 发表于 2009-12-18 09:24:40

好贴留名

YaoHui 发表于 2009-12-18 09:27:16

楼主啊,对那些会动嘴皮子的“牛B的人”,你什么牛B的加密法都没有用的,因为他们只要动嘴巴就可以了。


其实吧,要个序列号还是挺容易的,我做过试验的,同一批次的6个芯片,其四个时钟校正值都是不同的,用这个当序列号用就可以了。
没必要费这个力去找有专用序列号的片子。

ck2003 发表于 2009-12-18 09:28:23

mark

allenjoe 发表于 2009-12-18 10:37:09

回复56楼
》》》》》》》》》》》》》》》》》
如果时钟校准值的差异性确实比较大,是可以作为序列号。
这点大家也可以一起测试一下。。。。
这些芯片大家手头应该都有。

allenjoe 发表于 2009-12-18 10:52:42

以下是这四个校准字的位置 大家一起来测试


http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_516090.JPG
(原文件名:OSCCAL-4.JPG)

allenjoe 发表于 2009-12-18 11:10:23

校准字的读取代码


        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

allenjoe 发表于 2009-12-18 11:15:33

MEGA88PA只有一个校准字
        osccal_all = boot_signature_byte_get(0x01);

可以读取到这个校准字的不同

意外的发现

        osccal_all = boot_signature_byte_get(0x05);

测试的两片也能读到不同的值。。。。。。。

qilin3 发表于 2009-12-18 11:17:00

太帅了~~

dieieie 发表于 2009-12-18 12:57:19

时钟校正值,在m88里测试过,50片左右,重复的值只有3-4片,用来加密挺合适的。

YaoHui 发表于 2009-12-18 12:59:58

63楼,要四位一起看,单一的一位,理论值也才1/255。

zhifeng 发表于 2009-12-19 16:07:40

单片机端只能读出一个,4个是没用的,只要那个默认的有用

88488848 发表于 2009-12-19 16:24:10

这是分析一款序列号加密的小程序,读出序列号:
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

liyfmc 发表于 2009-12-19 16:54:58

mark

yangyb 发表于 2009-12-19 19:04:39

记号

zhifeng 发表于 2009-12-19 20:33:29

progisp 读出m8,m16的系列号

http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_516603.jpg
(原文件名:sn.jpg)

skoo 发表于 2009-12-20 00:19:30

zhifeng,赶快升级,支持读取序列号,同时用序列号和校准字加密你的固件,让盗版消失。

z_zt 发表于 2009-12-20 14:45:30

记号,很有用的

allenjoe 发表于 2009-12-21 16:53:59

65楼已经帮我回复64楼了,MEGA8,MEGA16使用单片机读取自己的时钟校准确实只能读到一个。
用编程器才可以读到4个。
应用场合不同。。。。

bjj9217 发表于 2009-12-21 16:56:37

mark

zhangliang 发表于 2009-12-22 13:08:18

mark

yanrz 发表于 2009-12-29 13:35:20

研究的真够深入!
佩服!

astudent 发表于 2009-12-30 19:05:09

关注

hfcjxdr 发表于 2010-1-2 20:48:29

记下,继续关注。很有用

pangzitiancai 发表于 2010-1-3 15:41:33

有用的东西要记号的~~~~~~~~

huatuizh 发表于 2010-1-8 22:42:17

mark

song1km 发表于 2010-1-8 23:18:16

ma...r..k

pengshipower 发表于 2010-1-12 16:28:25

具有序列号的型号:
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

shdzbsl 发表于 2010-1-15 02:05:56

mark

ju748 发表于 2010-1-15 04:26:20

好贴啊。终于不会被赖账了

chenloveyj 发表于 2010-1-15 08:47:22

的却不错

RF_Xu 发表于 2010-2-3 00:40:48

remark

flywater 发表于 2010-2-10 14:59:26

关注........

alan8918 发表于 2010-2-10 16:14:22

mark

WaterToSea 发表于 2010-2-11 09:11:51

很好!支持一下!

AVR_DIY 发表于 2010-2-11 09:47:02

mark

blueagle 发表于 2010-2-11 10:15:12

mark

haolxy 发表于 2010-2-11 14:42:43

xmega芯片有没有这个东东啊

Akiyer 发表于 2010-2-11 15:05:46

MARK

Sendzimir 发表于 2010-2-11 15:21:15

mark

daicp 发表于 2010-3-10 11:46:24

加密中。。。

dianzidog 发表于 2010-3-22 14:32:53

这个信息很有用,以前校准值很容易被绕过

cuikai12345 发表于 2010-3-22 19:43:30

mark

moon0213 发表于 2010-3-23 00:34:22

mark

benlippen 发表于 2010-7-11 11:03:03

mark

yaya001 发表于 2010-7-11 23:55:51

记号

benlippen 发表于 2010-8-19 11:05:50

mark加密中。。。

rose8421 发表于 2011-4-11 19:58:28

mark
页: [1] 2
查看完整版本: 【寻找加密的钥匙】实际测试证实了一款有序列号的AVR芯片 附加源代码和测试结果截图