权中正 发表于 2017-5-16 11:55:05

关于AVR的程序保护问题

最近用AVR M88V做项目,老板要求做一下程序保护工作。不知道各位大神有什么好的方法,如果原程序被取出来反汇编难不难呢?谢谢。

网上找了一下,AVR解密才几百块钱。看样子AVR的保密性也不太好吧。


有没有什么方法可以让IC自己擦掉程序的?

ztrx 发表于 2017-5-16 13:10:33

我是用M88的唯一系列号,代码校验不允许改代码

ycheng2004 发表于 2017-5-16 14:43:49

上微星做的最新版AVR单片机,加密或许会好点,

daicp 发表于 2017-5-16 15:33:56

LZ的名字好熟悉:{:titter:}

HCS301

                                                                                        此令 蒋中正

权中正 发表于 2017-5-17 11:24:44

ycheng2004 发表于 2017-5-16 14:43
上微星做的最新版AVR单片机,加密或许会好点,

能提供一下最新的型号吗?

ycheng2004 发表于 2017-5-17 11:35:00

上微芯主页看,
做PIC这个公司

权中正 发表于 2017-5-17 11:38:10

ycheng2004 发表于 2017-5-17 11:35
上微芯主页看,
做PIC这个公司

我想在EEPROM中写入密码,开机时读取这个密码。但是好像EEPROM也是被读出来的。感没什么用处。

yoursnemo 发表于 2017-5-17 11:38:46

如果自己无软件加密的办法,押宝在MCU厂商的加密,只能选冷门料。现在解密确实容易,通用料他们经常解,轻车熟路,所以几百元就可以解,成功率也N高。但冷门料,他们可能只解过一两回或者没解过,一来解密费用高,二来他们解密工作量也大,甚至解完得重新做一个临时烧录器。

权中正 发表于 2017-5-17 11:41:00

ztrx 发表于 2017-5-16 13:10
我是用M88的唯一系列号,代码校验不允许改代码

不太明白,能说得具体一点吗?谢谢

t3486784401 发表于 2017-5-17 17:54:20

本帖最后由 t3486784401 于 2017-5-17 17:59 编辑

AVR 支持Bootloader,所以在特定的条件下程序擦除自身,即自宫,是可行的.......

不过这就牵涉到程序如何判断处于正常工作/处于被解密工作状态下了,直观思路可以检测板载硬件信号。
当然带来一定的风险,就是板子可能莫名其妙就意外自宫了

但是话说回来,如果采用开盖解密,那就无论如何都不能防止机器码被读出了。

---------------------------------------------------------------------------------------------------

从机器码到程序,也就是反汇编,IDA分分钟的事情,但是需要有经验的AVR电工才能分析程序的流程,
或者作出改程序这样的工作。直接反汇编到 C 几乎不可能。

权中正 发表于 2017-5-17 18:15:48

t3486784401 发表于 2017-5-17 17:54
AVR 支持Bootloader,所以在特定的条件下程序擦除自身,即自宫,是可行的.......

不过这就牵涉到程序如何 ...

如果IC加一个高电压或者反接一个高于工作电压的把IC烧坏了还能读出程序吗?或者烧坏编程的那几个IO口。

ztrx 发表于 2017-5-17 18:30:13

权中正 发表于 2017-5-17 11:41
不太明白,能说得具体一点吗?谢谢

用88PA,有唯一系列号.在程序中比较这个系列号.
把关键代码CRC校验,检查校验是否正确

t3486784401 发表于 2017-5-17 18:40:57

权中正 发表于 2017-5-17 18:15
如果IC加一个高电压或者反接一个高于工作电压的把IC烧坏了还能读出程序吗?或者烧坏编程的那几个IO口。 ...

针对不开盖读程序的解密,烧坏编程脚、烧坏片子都是可以防止解密的;

针对开盖读程序的解密,烧编程脚、烧坏片子(FLASH没烧坏的情况),全都没用,金相显微镜直接读取FLASH状态;


烧坏FLASH、自宫这两种比较彻底,一旦宫了所有解密都无效,但是前提是你得能有加电的机会.........
万一有人买来设备,拆下来片子从不加电就开盖破解,那真的防不住

权中正 发表于 2017-5-18 08:32:31

t3486784401 发表于 2017-5-17 18:40
针对不开盖读程序的解密,烧坏编程脚、烧坏片子都是可以防止解密的;

针对开盖读程序的解密,烧编程脚、 ...

我把电路板用盒子锁起来再加个电池一直供电,一旦盒子打开就擦掉

权中正 发表于 2017-5-18 08:34:28

ztrx 发表于 2017-5-17 18:30
用88PA,有唯一系列号.在程序中比较这个系列号.
把关键代码CRC校验,检查校验是否正确 ...

这样程序还是可以读出来的吧

t3486784401 发表于 2017-5-18 14:55:46

权中正 发表于 2017-5-18 08:32
我把电路板用盒子锁起来再加个电池一直供电,一旦盒子打开就擦掉

这个可以有,类似POS机的自爆机制,开盖就销毁数据

walker 发表于 2017-5-18 19:34:01

ztrx 发表于 2017-5-17 18:30
用88PA,有唯一系列号.在程序中比较这个系列号.
把关键代码CRC校验,检查校验是否正确 ...

很久没用AVR了,后缀PA的,有Unique ID?

权中正 发表于 2017-5-19 09:43:45

t3486784401 发表于 2017-5-18 14:55
这个可以有,类似POS机的自爆机制,开盖就销毁数据

这样能烧掉FLASH吗?能不能很有效的保护?

t3486784401 发表于 2017-5-19 22:22:39

权中正 发表于 2017-5-19 09:43
这样能烧掉FLASH吗?能不能很有效的保护?

可以的,不断电情况下,检测到异常就直接自宫,完全可以干掉FLASH里全部数据。

POS机就是有这么个设计的,敏感数据的芯片被严密监控,发现开盖就直接擦除。

plb83 发表于 2017-5-19 22:35:24

t3486784401 发表于 2017-5-19 22:22
可以的,不断电情况下,检测到异常就直接自宫,完全可以干掉FLASH里全部数据。

POS机就是有这么个设计的 ...

感觉没用的,真要想破解你程序,内行人一看就知道你在盖子上动手脚,了解到是什么条件自宫后再用一台新的产品避免开盖触发自宫,或者直接CNC把盖子开一个洞,断电后再来取片破解

plb83 发表于 2017-5-19 22:43:21

不过看到过一个老外的产品,他把电池和MCU+部分外围用环氧树脂塑封在一个模块里面,PCB板拆掉这个模块就会自宫,这个破解难度就比用外壳自宫高很多了,如果在里面加一些什么光敏和温度传感器,防止火烧或者腐蚀去掉环氧树脂进行断电解密。。。。只是抛出一个思路,楼主尽情发挥想象{:lol:}

权中正 发表于 2017-5-20 00:14:10

plb83 发表于 2017-5-19 22:35
感觉没用的,真要想破解你程序,内行人一看就知道你在盖子上动手脚,了解到是什么条件自宫后再用一台新的 ...

产品不外卖只是公司自己用,怕被人偷出去仿造.机器也不难做,就是里面的思路不能让人知道

权中正 发表于 2017-5-22 11:01:18

t3486784401 发表于 2017-5-17 18:40
针对不开盖读程序的解密,烧坏编程脚、烧坏片子都是可以防止解密的;

针对开盖读程序的解密,烧编程脚、 ...

现在想通过BOOTLOADER将程序擦除,从主程序中检测到如果盒子被打开就将程序以EEPROM都清除掉,但不知道如何做,请大神们指点.

t3486784401 发表于 2017-5-22 18:18:20

权中正 发表于 2017-5-22 11:01
现在想通过BOOTLOADER将程序擦除,从主程序中检测到如果盒子被打开就将程序以EEPROM都清除掉,但不知道如何 ...

看手册就有,无非就是设置好寄存器,然后执行 SPM 指令

权中正 发表于 2017-6-1 16:30:49

t3486784401 发表于 2017-5-22 18:18
看手册就有,无非就是设置好寄存器,然后执行 SPM 指令

可以在主程序中擦除程序吗?还有如果使用了BOOTLOADER        功能是不我的程序更新也是要通过BOOTLOADER?

krdzw 发表于 2017-6-1 16:37:46

权中正 发表于 2017-5-18 08:32
我把电路板用盒子锁起来再加个电池一直供电,一旦盒子打开就擦掉

装个二踢脚不是更牛逼

权中正 发表于 2017-6-1 16:39:29

krdzw 发表于 2017-6-1 16:37
装个二踢脚不是更牛逼

飞出宇宙,哈哈

zhifeng 发表于 2017-6-1 16:43:21

可以使用特定下载器 利用芯片的的特性进行软件算法加密。即使破解出来目标码,仍需要进程软件解密。

krdzw 发表于 2017-6-1 16:48:31

zhifeng 发表于 2017-6-1 16:43
可以使用特定下载器 利用芯片的的特性进行软件算法加密。即使破解出来目标码,仍需要进程软件解密。 ...

修改读取ID的地址指向空白FALSH更改FALSH为破解ID

权中正 发表于 2017-6-1 16:49:19

zhifeng 发表于 2017-6-1 16:43
可以使用特定下载器 利用芯片的的特性进行软件算法加密。即使破解出来目标码,仍需要进程软件解密。 ...

我用的是ZF-209请问有这个功能吗?

su33691 发表于 2017-6-1 18:01:56

楼主的产品不外卖,要防止破解太简单了。楼主还是要好好考虑保护自己的电脑,当心源代码被有心人得到。

HYLG 发表于 2017-6-1 21:00:50

楼主听说过LGT吗,LGT8F328P最新型号。兼容MEGA328,青出于蓝胜于蓝。
LGT前期模拟性能很差,现在的328P很不错了。

HYLG 发表于 2017-6-1 21:03:04

TQFP-32单价2.8元,TQFP-48单价2.9元。

权中正 发表于 2017-6-1 21:09:11

HYLG 发表于 2017-6-1 21:00
楼主听说过LGT吗,LGT8F328P最新型号。兼容MEGA328,青出于蓝胜于蓝。
LGT前期模拟性能很差,现在的328P很 ...

国产的?

权中正 发表于 2017-6-1 21:12:29

t3486784401 发表于 2017-5-22 18:18
看手册就有,无非就是设置好寄存器,然后执行 SPM 指令

我只要在BOOTLOADER中执行擦除的命令,程序我还是想从编程下载.可以这样做吗?

t3486784401 发表于 2017-6-1 21:36:30

权中正 发表于 2017-6-1 21:12
我只要在BOOTLOADER中执行擦除的命令,程序我还是想从编程下载.可以这样做吗? ...

编程器每次下载,就会擦除全部的FLASH,包括BOOTLOADER区。

非要仅在 BOOTLOADER 区擦除,那就是用编程器下载的固件,应该包括 BOOTLOADER 区内容,这样即使全片擦除,也可以保持 BOOTLOADER 区存在。

由于 BOOTLOADER 的位置比较靠后,一般和用户程序距离很远,故 HEX 文件内容复制粘贴一下就行。

HYLG 发表于 2017-6-1 21:38:58

LGT没有读出这个功能。

权中正 发表于 2017-6-2 09:21:09

t3486784401 发表于 2017-6-1 21:36
编程器每次下载,就会擦除全部的FLASH,包括BOOTLOADER区。

非要仅在 BOOTLOADER 区擦除,那就是用编程 ...

谢谢,我已经找到你之前的贴子了

权中正 发表于 2017-6-2 10:04:17

HYLG 发表于 2017-6-1 21:03
TQFP-32单价2.8元,TQFP-48单价2.9元。

哪里可以买到?完全与AVR一样吗?

HYLG 发表于 2017-6-2 10:14:54

指令兼容引脚兼容,下载方式不一样,EEPROM不一样。
程序肯定是要局部修改的。先看下手册吧

HYLG 发表于 2017-6-2 10:18:40

淘宝就有。厂家直销的。

权中正 发表于 2017-6-2 15:46:19

t3486784401 发表于 2017-6-1 21:36
编程器每次下载,就会擦除全部的FLASH,包括BOOTLOADER区。

非要仅在 BOOTLOADER 区擦除,那就是用编程 ...

我把你的程序修改成下边这样,我用的是GCC,是不是把这个文件也像普通项目一样编译然后再复制一以的程序下面写进单片机就可以了呢?

我现在的想法是给板子一个UPS,让板子一直保持通电,一旦PC2为高电平就擦除用户程序.

#include <avr/io.h>

// 全局常量定义
        // Flash区域大小(2^N=8192)
#define AVRSZ_FLASH_LOG2        13
        // Flash页面大小
#define AVRSZ_PAGE_BYTE                64


void SpmAction(unsigned char cmd)
{
        // 执行一次SPM动作
        while(SPMCR&BV(SPMEN));
        SPMCR= (cmd);
        asm("spm");
}

void EraseFlash(void)
{
        // FLASH全片擦除(除BOOTLOADER区)
        unsigned int i;
        for(i=0; (i&_BV(AVRSZ_FLASH_LOG2))==0; i+=AVRSZ_PAGE_BYTE)
        {
                // 执行一次页面擦除
                asm("movw r30, %i");        // Z= Dst-Addr
                SpmAction( _BV(PGERS)|_BV(SPMEN) );
               
                // 重新启用RWW区域
                SpmAction( _BV(RWWSRE)|_BV(SPMEN) );
        }
}

int main()
{
        DDRC &=~_BV(PC2);//PC2为输入

        while (1)
        {
                if ((PINC & _BV(PC2)) != 0)//PC2是高电平时
                {
                        EraseFlash();//擦除所有的FLASH
                }
        }
}

权中正 发表于 2017-6-3 09:52:13

#include <avr/io.h>
#include <avr/boot.h>

// 全局常量定义
        // Flash区域大小(2^N=8192)
#define AVRSZ_FLASH_LOG2        13
        // Flash页面大小
#define AVRSZ_PAGE_BYTE                64


void EraseFlash(void)
{
        // FLASH全片擦除(除BOOTLOADER区)
        unsigned short i;
        for(i=0; (i&_BV(AVRSZ_FLASH_LOG2))==0; i+=AVRSZ_PAGE_BYTE)
        {
                // 执行一次页面擦除
                boot_page_erase (i);
                while(boot_rww_busy())
                boot_rww_enable();
        }
}

int main()
{
        DDRC |=_BV(PC2);

        while (1)
        {
                if ((PINC & _BV(PC2)) != 0)
                {
                        EraseFlash();
                }
        }
}
我把程序修改成这样子可以用了,但现在还不知道怎么样从用户程序中跳过来,研究中

一上电进入BOOTLOADER,然后检测PC2,如果是高电平就删除程序,不过是要上电复位才能全部删除

t3486784401 发表于 2017-6-3 22:29:55

权中正 发表于 2017-6-3 09:52
#include
#include



在程序中直接使用 JMP 指令就行,当然前提是你得能在 C 中内嵌汇编。

用函数指针也可以,语法大致长这样:

// Jump to: 0x1e00(BYTE-ADDR)=0x0f00(WORD-ADDR)
((void(*)())0x1e00)();

再就是喂狗了,直接 WDT 一下不管,自己就复位了

t3486784401 发表于 2017-6-3 22:36:35

其实 AVR 的 SPM 指令(用于修改 FLASH 等动作)在用户区也是可以执行的(除非锁定位限制),
这样就没必要必须跳转到 BOOT 区去搞事了。

唯一要注意的是,SPM 这个指令所在的扇区要最后擦除,自宫太早了其他扇区就擦不动了。

权中正 发表于 2017-6-4 11:31:07

t3486784401 发表于 2017-6-3 22:36
其实 AVR 的 SPM 指令(用于修改 FLASH 等动作)在用户区也是可以执行的(除非锁定位限制),
这样就没必要 ...

转到BOOTLOADER的方法对我来说更好理解一点.呵呵,谢谢.现在项目太急,以后慢慢修改.

R88 发表于 2018-2-21 06:48:49

不错,防破解
页: [1]
查看完整版本: 关于AVR的程序保护问题