搜索
bottom↓
回复: 46

关于AVR的程序保护问题

[复制链接]

出0入0汤圆

发表于 2017-5-16 11:55:05 | 显示全部楼层 |阅读模式
最近用AVR M88V做项目,老板要求做一下程序保护工作。不知道各位大神有什么好的方法,如果原程序被取出来反汇编难不难呢?谢谢。

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


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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入4汤圆

发表于 2017-5-16 13:10:33 | 显示全部楼层
我是用M88的唯一系列号,代码校验不允许改代码

出0入30汤圆

发表于 2017-5-16 14:43:49 | 显示全部楼层
上微星做的最新版AVR单片机,加密或许会好点,

出0入0汤圆

发表于 2017-5-16 15:33:56 | 显示全部楼层
LZ的名字好熟悉:

HCS301

                                                                                        此令 蒋中正

出0入0汤圆

 楼主| 发表于 2017-5-17 11:24:44 | 显示全部楼层
ycheng2004 发表于 2017-5-16 14:43
上微星做的最新版AVR单片机,加密或许会好点,

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

出0入30汤圆

发表于 2017-5-17 11:35:00 | 显示全部楼层
上微芯主页看,
做PIC这个公司

出0入0汤圆

 楼主| 发表于 2017-5-17 11:38:10 | 显示全部楼层
ycheng2004 发表于 2017-5-17 11:35
上微芯主页看,
做PIC这个公司

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

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2017-5-17 11:41:00 | 显示全部楼层
ztrx 发表于 2017-5-16 13:10
我是用M88的唯一系列号,代码校验不允许改代码

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

出200入2554汤圆

发表于 2017-5-17 17:54:20 | 显示全部楼层
本帖最后由 t3486784401 于 2017-5-17 17:59 编辑

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

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

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

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

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

出0入0汤圆

 楼主| 发表于 2017-5-17 18:15:48 | 显示全部楼层
t3486784401 发表于 2017-5-17 17:54
AVR 支持Bootloader,所以在特定的条件下程序擦除自身,即自宫,是可行的.......

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

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

出0入4汤圆

发表于 2017-5-17 18:30:13 | 显示全部楼层
权中正 发表于 2017-5-17 11:41
不太明白,能说得具体一点吗?谢谢

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

出200入2554汤圆

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

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

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


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

出0入0汤圆

 楼主| 发表于 2017-5-18 08:32:31 | 显示全部楼层
t3486784401 发表于 2017-5-17 18:40
针对不开盖读程序的解密,烧坏编程脚、烧坏片子都是可以防止解密的;

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

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

出0入0汤圆

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

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

出200入2554汤圆

发表于 2017-5-18 14:55:46 | 显示全部楼层
权中正 发表于 2017-5-18 08:32
我把电路板用盒子锁起来再加个电池一直供电,一旦盒子打开就擦掉

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

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2017-5-19 09:43:45 | 显示全部楼层
t3486784401 发表于 2017-5-18 14:55
这个可以有,类似POS机的自爆机制,开盖就销毁数据

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

出200入2554汤圆

发表于 2017-5-19 22:22:39 | 显示全部楼层
权中正 发表于 2017-5-19 09:43
这样能烧掉FLASH吗?能不能很有效的保护?

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

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

出0入0汤圆

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

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

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

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2017-5-22 11:01:18 | 显示全部楼层
t3486784401 发表于 2017-5-17 18:40
针对不开盖读程序的解密,烧坏编程脚、烧坏片子都是可以防止解密的;

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

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

出200入2554汤圆

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

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

出0入0汤圆

 楼主| 发表于 2017-6-1 16:30:49 | 显示全部楼层
t3486784401 发表于 2017-5-22 18:18
看手册就有,无非就是设置好寄存器,然后执行 SPM 指令

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

出0入0汤圆

发表于 2017-6-1 16:37:46 | 显示全部楼层
权中正 发表于 2017-5-18 08:32
我把电路板用盒子锁起来再加个电池一直供电,一旦盒子打开就擦掉

装个二踢脚不是更牛逼

出0入0汤圆

 楼主| 发表于 2017-6-1 16:39:29 | 显示全部楼层
krdzw 发表于 2017-6-1 16:37
装个二踢脚不是更牛逼

飞出宇宙,哈哈

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2017-6-1 18:01:56 | 显示全部楼层
楼主的产品不外卖,要防止破解太简单了。楼主还是要好好考虑保护自己的电脑,当心源代码被有心人得到。

出0入0汤圆

发表于 2017-6-1 21:00:50 | 显示全部楼层
楼主听说过LGT吗,LGT8F328P最新型号。兼容MEGA328,青出于蓝胜于蓝。
LGT前期模拟性能很差,现在的328P很不错了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2017-6-1 21:03:04 | 显示全部楼层
TQFP-32单价2.8元,TQFP-48单价2.9元。

出0入0汤圆

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

国产的?

出0入0汤圆

 楼主| 发表于 2017-6-1 21:12:29 | 显示全部楼层
t3486784401 发表于 2017-5-22 18:18
看手册就有,无非就是设置好寄存器,然后执行 SPM 指令

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

出200入2554汤圆

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

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

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

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

出0入0汤圆

发表于 2017-6-1 21:38:58 | 显示全部楼层
LGT没有读出这个功能。

出0入0汤圆

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

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

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

出0入0汤圆

 楼主| 发表于 2017-6-2 10:04:17 | 显示全部楼层
HYLG 发表于 2017-6-1 21:03
TQFP-32单价2.8元,TQFP-48单价2.9元。

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

出0入0汤圆

发表于 2017-6-2 10:14:54 | 显示全部楼层
指令兼容引脚兼容,下载方式不一样,EEPROM不一样。
程序肯定是要局部修改的。先看下手册吧

出0入0汤圆

发表于 2017-6-2 10:18:40 | 显示全部楼层
淘宝就有。厂家直销的。

出0入0汤圆

 楼主| 发表于 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
                }
        }
}

出0入0汤圆

 楼主| 发表于 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,如果是高电平就删除程序,不过是要上电复位才能全部删除

出200入2554汤圆

发表于 2017-6-3 22:29:55 | 显示全部楼层

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

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

  1. // Jump to: 0x1e00(BYTE-ADDR)=0x0f00(WORD-ADDR)
  2. ((void(*)())0x1e00)();
复制代码


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

出200入2554汤圆

发表于 2017-6-3 22:36:35 | 显示全部楼层
其实 AVR 的 SPM 指令(用于修改 FLASH 等动作)在用户区也是可以执行的(除非锁定位限制),
这样就没必要必须跳转到 BOOT 区去搞事了。

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

出0入0汤圆

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

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

出0入399汤圆

发表于 2018-2-21 06:48:49 来自手机 | 显示全部楼层
不错,防破解
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 20:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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