搜索
bottom↓
回复: 78

最近老看到芯片唯一ID的加密,那我也发我的程序

  [复制链接]

出0入0汤圆

发表于 2012-4-15 12:29:33 | 显示全部楼层 |阅读模式
// 把地址直接减去一个数是不要在程序中直接出现这个地址
#define STM32_ID_D  352525   // 任意的一个数
volatile u32 STM32_ID_addr[3]={0x1ffff7e8 - STM32_ID_D,0x1ffff7ec + STM32_ID_D,0x1ffff7f0 - STM32_ID_D};
/********************************************************************
函数功能:读出ID
入口参数:p
返    回:
备    注:
********************************************************************/
volatile void STM32_Read_ID(volatile u32 *p)
{
   volatile u32 Addr;
// 因为不想让程序在反汇编后直接找到这个地址,所以这个地址是运算出来的,
// 跟STM32_ID_addr反运算,当然了也可以用高级的算法,注意不能让编译器优化这个地址
   Addr = STM32_ID_addr[0] + STM32_ID_D;
   p[0] = *(vu32*)(Addr);
   Addr = STM32_ID_addr[1] - STM32_ID_D;
   p[1] = *(vu32*)(Addr);
   Addr = STM32_ID_addr[2] + STM32_ID_D;
   p[2] = *(vu32*)(Addr);
}
/********************************************************************
函数功能:加密ID并保存
入口参数:
返    回:
备    注:
********************************************************************/
void STM32_Encrypted_ID(void)
{
   u32 stm32ID[4],dat;   
   STM32_Read_ID(stm32ID);
   // 这里可以用其它一些高级的算法,但解和加要一样
   stm32ID[3] = STM32_ID_D;        
   dat = stm32ID[0] + stm32ID[1] - (stm32ID[2]/stm32ID[3]);
   
   FLASH_Unlock();
   FLASH_ErasePage  (STM32FLASH_EN_ID_START_ADDR);     //
   FLASH_ProgramWord(STM32FLASH_EN_ID_START_ADDR,dat); // 保存这个数,写进32位
   FLASH_Lock();
}

/********************************************************************
函数功能:比较加密ID,正确返回0
入口参数:
返    回:1:不正确,0:正确
备    注:
********************************************************************/
u32 STM32_CMP_Encrypted_ID(void)
{
   u32 stm32ID[4],dat,dat2;   
   STM32_Read_ID(stm32ID);
   // 这里可以用其它一些高级的算法,但解和加要一样   
   stm32ID[3] = STM32_ID_D;      
   dat = stm32ID[0] + stm32ID[1] - (stm32ID[2]/stm32ID[3]);
   
   dat2 = *(u32*)(STM32FLASH_EN_ID_START_ADDR);
   
   if(dat == dat2){return 0;} // 相同
   else           {return 1;} // 不同
}



好了,有了上面那个程序,那下再继续


//===================ID加密控制=====================================================================
  //   
   if(STM32_CMP_Encrypted_ID())
   {
      // 量产时给一些条件,条件满足就对ID加密,加密完后,你也可以让它自宫。
      if(XXXXXX)
      {
         STM32_Encrypted_ID();   // 加密ID
         自宫
    }


//===================正常运行时==================================  

// 校验一下ID是否正确,
   if(STM32_CMP_Encrypted_ID())
   {
      来到这里嘛,当然不正确咯,你别让程序死在这哦,太明显了,很容易找到是你干的,
    那么,一个系统肯定有一些参数才能运行的,你可以改变一些参数,这可以让系统
    有时正常有时不正常,,呵呵,要查也不是那么容易的事了

}





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

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

出0入0汤圆

 楼主| 发表于 2012-4-15 12:30:26 | 显示全部楼层
一些个人想法,不正确请指正

出0入0汤圆

 楼主| 发表于 2012-4-15 12:31:53 | 显示全部楼层
对了上面可以直接用在STM32上,别的MCU思路一样的。。。

出0入0汤圆

发表于 2012-4-15 12:34:00 | 显示全部楼层
葵花宝典之要想成功,必先自宫。顶楼主

出0入0汤圆

发表于 2012-4-15 13:16:31 | 显示全部楼层
设置数据断点, 神马都是浮云

出0入0汤圆

发表于 2012-4-15 13:25:44 | 显示全部楼层
量产后jtag也没法用吧?

出0入0汤圆

发表于 2012-4-15 13:41:35 | 显示全部楼层
复位后jtag默认启用的

出0入0汤圆

 楼主| 发表于 2012-4-15 13:58:02 | 显示全部楼层
shangdawei 发表于 2012-4-15 13:16
设置数据断点, 神马都是浮云

主要的是程序知道了是不合法,别让程序挂掉,这样很容易怀疑哪个地方出了问题,如果你修改一些参数,让程序时而正常时而不怎么正常,这就产生了是一生不稳定的现像出来。那他的怀疑起码多了一点,难度也大了一点。其实没有破解不了和东西,只是想办法加大破解难度。。。再说了,如果一个参数这么多程序去修改他用它,要猜那个是鬼,也得多花时间了。

出0入0汤圆

发表于 2012-4-15 17:46:36 | 显示全部楼层
mark 多谢

出0入0汤圆

发表于 2012-4-15 18:04:59 | 显示全部楼层
MARK
多谢

出0入0汤圆

发表于 2012-4-15 19:54:42 | 显示全部楼层
多谢楼主共享.

出0入0汤圆

发表于 2012-4-15 20:14:41 | 显示全部楼层
// 把地址直接减去一个数是不要在程序中直接出现这个地址
lz这个想的周密

出0入0汤圆

发表于 2012-4-15 20:14:48 | 显示全部楼层
本人测试, 即使经过地址变换, 甚至使用环回技术, 调速器设置的数据读写断点还是能够捕捉到.
只要你在读 CPUID, 人家就开始从这里分析你的代码.

出0入0汤圆

发表于 2012-4-15 22:16:43 | 显示全部楼层
程序里面有意无意频繁的读取ID, 不失为一个办法.

出0入0汤圆

发表于 2012-4-16 00:09:09 | 显示全部楼层
本帖最后由 mig29 于 2012-4-16 00:23 编辑

我也一直好奇到底这种‘唯一ID’要怎么用起来?


以前8位机年代,如果有了.hex or .bin,是可以直接装载进仿真器调试的,不知道现在xx-link之类是否还支持这样干。

既然被破解了,也就是得到.hex or .bin。

那么,先用trace功能找到读写STM32_ID_addr[3]的地方(这个地址值,从STM32的规格书上就能找到),很快定位到p[0] = *(vu32*)(Addr); 这一行,然后上下看若干行,得到STM32_Read_ID的地址,继续trace, 就能看到 STM32_CMP_Encrypted_ID(),直接将其修改成) {return 0;} // 相同
的指令。搞定。。。


在汇编一级调试过程序的人都能理解我上面的措辞吧?
总之,代码里要操作到存这个唯一ID的地址,而这个地址是公开的,反汇编,或者动态跟踪进去,很快就能找到相关指令。


加上14搂的思路倒是有点效果,比如再读了第87回ID后,才开始正式用来算。。。。

出0入0汤圆

发表于 2012-4-16 01:19:07 | 显示全部楼层
shangdawei 发表于 2012-4-15 22:16
程序里面有意无意频繁的读取ID, 不失为一个办法.

频繁读取外, 读取正确的,一部分返回 1 。 一部分返回 0 。然后再确认

出0入0汤圆

发表于 2012-4-16 05:50:45 | 显示全部楼层
量产时,不太好生产。

出0入0汤圆

 楼主| 发表于 2012-4-16 22:44:57 | 显示全部楼层
STM32供应商 发表于 2012-4-16 14:48
我要重力提拔你

是不是有芯片送啊

出0入0汤圆

发表于 2012-4-16 23:22:37 | 显示全部楼层

STM32,既然要重力提拔,就送东西啦。

哈哈,谢谢楼主分享。

出0入0汤圆

发表于 2012-4-17 08:33:40 | 显示全部楼层
先存起来。

出0入0汤圆

发表于 2012-4-17 08:53:40 | 显示全部楼层
学习了,多谢分享

出0入0汤圆

发表于 2012-4-18 11:45:36 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-4-18 12:04:10 | 显示全部楼层
高,我也想到了用芯片的ID来加密程序,一直找不到方法!顶一下!

出0入0汤圆

发表于 2012-4-18 12:59:07 | 显示全部楼层
mig29 发表于 2012-4-16 00:09
我也一直好奇到底这种‘唯一ID’要怎么用起来?

以前8位机年代,如果有了.hex or .bin,是可以直接装载进仿真器调试的,不知道现在xx-link之类是否还支持这样干。




既然被破解了,也就是得到.hex or .bin。




那么,先用trace功能找到读写STM32_ID_addr[3]的地方(这个地址值,从STM32的规格书上就能找到),很快定位到p[0] = *(vu32*)(Addr); 这一行,然后上下看若干行,得到STM32_Read_ID的地址,继续trace, 就能看到 STM32_CMP_Encrypted_ID(),直接将其修改成) {return 0;} // 相同
的指令。搞定。。。








在汇编一级调试过程序的人都能理解我上面的措辞吧?
总之,代码里要操作到存这个唯一ID的地址,而这个地址是公开的,反汇编,或者动态跟踪进去,很快就能找到相关指令。








加上14搂的思路倒是有点效果,比如再读了第87回ID后,才开始正式用来算。。。。


至于这个可以采用其他地方来校验这段代码的校验和是否是我预存储的校验值。
在加密完成后对代码来个校验。再次存在其他地方。
如果你修改了前面的汇编程序,必定会影响校验和吧。

出0入0汤圆

发表于 2012-4-18 13:01:57 | 显示全部楼层
当然,你还可以说,我把你判断校验和的地方一起修改成直接返回真,你照样没辙了。。。

再复杂一点,把整个程序占用flash分成N(N大于等于2)段。A段运行前,判断B段的校验和;B段运行时判断A段校验和。。。一个校验和不对就不干活!

出0入0汤圆

发表于 2012-4-18 13:21:02 | 显示全部楼层
>> 一个校验和不对就不干活!

照样干活, 不过随机性的出现错误, 这样隐蔽些

出0入0汤圆

发表于 2012-4-18 14:24:12 | 显示全部楼层
本帖最后由 mobile01 于 2012-4-18 14:25 编辑

FLASH_ErasePage  (STM32FLASH_EN_ID_START_ADDR);  请问清除范例有多大?

有没有办法将一小段程序加壳...

出0入0汤圆

发表于 2012-4-18 15:16:29 | 显示全部楼层
加壳, 乱序执行, 突然想到了dos时代的一些软件
一边执行, 一边解密将要执行的代码,
然后再执行解密后的代码( 要在RAM运行了 )
防止静态分析, 如何能防止动态跟踪 ?
检测是否有调试器存在 ?

出0入0汤圆

发表于 2012-4-18 15:54:42 | 显示全部楼层
shangdawei 发表于 2012-4-18 15:16
加壳, 乱序执行, 突然想到了dos时代的一些软件
一边执行, 一边解密将要执行的代码,
然后再执行解密后的代 ...

哈哈~难度有点高,不过加壳站内好像有看过,如果在将ID导入,每颗的code checksum 都不一样,stm32不知道会不会检查烧入..

出0入0汤圆

发表于 2012-4-18 16:04:08 | 显示全部楼层
有兴趣的看下我发的这个贴子,共享近段时间研究防止HEX被修改的成果,CRC16 HEX文件自动修改生成器,使产品上每个HEX文件的内容均不一样,在单片机内部运算CRC16,若结果不对,程序会工作不正常.......

http://www.ourdev.cn/thread-4841408-1-1.html

我准备换到BOOT区来做,做完自宫BOOT。

出0入0汤圆

发表于 2012-5-11 06:19:48 | 显示全部楼层
plc_avr 发表于 2012-4-18 16:04
有兴趣的看下我发的这个贴子,共享近段时间研究防止HEX被修改的成果,CRC16 HEX文件自动修改生成器,使产品 ...

原老论坛附件,因未能解决下载带宽控制,暂停下载;我们会尽快解决此问题,重新开放下载

出0入0汤圆

发表于 2012-5-11 06:30:48 | 显示全部楼层
老坛子的附件,确实不能下载。期待早日修复。

出0入0汤圆

发表于 2012-8-2 17:26:06 | 显示全部楼层
有个建议,MCU制造商不公开唯一ID地址,如果MCU加密位启用了,内部自动生成一段防抄码,加在写入的HEX中,破解后的HEX写入新的片子里后,跟新片的ID一对比就复位,这样不用开发人员劳神费事的去掩饰读取ID,比对结果和防抄跳转。毕竟多数开发人员的主要精力放在开发产品上,面对解密的专业人员,加入少许防范措施也都很稚嫩,不堪一击。

出0入0汤圆

发表于 2012-8-2 17:56:57 来自手机 | 显示全部楼层
学习了,

出0入0汤圆

发表于 2012-8-2 18:02:09 | 显示全部楼层
多谢分享

出0入0汤圆

发表于 2012-8-19 21:25:40 | 显示全部楼层
学习......

出0入0汤圆

发表于 2012-8-30 12:13:44 | 显示全部楼层
有没有一种方式,可以利用唯一ID,但是又可以简化生产。生产时只提供一种BIN源码或两个BIN码,下载第一个BIN软件以后自动读取唯一ID等其它必要东东,下载另一个BIN码的时候,由自动读取的UID,算法,CRC等添加了BIN程序中下载,并且覆盖掉第一个BIN码。

出0入85汤圆

发表于 2012-8-30 12:48:00 | 显示全部楼层
自己写一段bootloader,通过判断一个固定信号,然后自宫。搞解片的不会让片子不上电就能读出程序吧

出0入0汤圆

发表于 2012-8-30 15:01:07 | 显示全部楼层
弱弱的问一句..帖子里的自宫是什么意思呢..你这种方式是不是也一定要唯一ID的么..
头像被屏蔽

出0入0汤圆

发表于 2012-8-30 15:11:55 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-8-30 15:47:52 | 显示全部楼层
学习 唯一id加密

出0入0汤圆

发表于 2012-8-30 18:16:52 | 显示全部楼层
本帖最后由 adce 于 2012-8-30 18:18 编辑

楼主...如果给您一段代码您会怎么破解呢...
其实破解很简单...根本不用去考虑算法...
只需要尝试把某个 == 改成 !=....就可以了...
==定位特别容易...肯定在入口附近...有经验的尝试几个回合就可以了...
算号器也特别简单...直接把加密解密的汇编程序截出来 嵌进去就可以了....爱用什么算法用什么算法...没必要知道...

简单点说就是....一切依靠算法的加密手段都是自欺欺人的....

出0入0汤圆

发表于 2013-11-14 16:26:11 | 显示全部楼层
唯一id加密

出0入0汤圆

发表于 2013-11-14 18:02:04 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2014-2-21 17:25:10 | 显示全部楼层
本帖最后由 chinaboy25 于 2014-2-21 17:26 编辑



感谢热情的坛友!

出0入0汤圆

发表于 2014-2-22 16:59:38 | 显示全部楼层
貌似,好像,可能,似乎 好用。
MARK一下,有时间好好研究一下楼主的算法,谢了。

出0入0汤圆

发表于 2014-2-24 01:49:47 | 显示全部楼层
这个很不错哦

出10入95汤圆

发表于 2014-2-24 08:43:40 | 显示全部楼层
嗯,不错!

出0入0汤圆

发表于 2014-2-24 09:19:53 | 显示全部楼层
LZ,请问如何自宫

出0入0汤圆

发表于 2014-4-16 17:59:05 | 显示全部楼层
我有个想法,能不能在生产的时候读取UID,存放到某个特定位置,这样解密的人就不知道我们的UID位置在哪里。

出0入0汤圆

发表于 2014-4-16 22:54:04 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2014-4-17 20:07:40 | 显示全部楼层
// 量产时给一些条件,条件满足就对ID加密,加密完后,你也可以让它自宫。

不是每个ID都满足条件?

出0入17汤圆

发表于 2014-4-17 20:26:46 来自手机 | 显示全部楼层
学习了,多谢分享

出0入0汤圆

发表于 2014-4-17 20:59:27 | 显示全部楼层
wkong501 发表于 2014-4-16 17:59
我有个想法,能不能在生产的时候读取UID,存放到某个特定位置,这样解密的人就不知道我们的UID位置在哪里。 ...

你终究需要读取ID的, 否则没有意义

出0入0汤圆

发表于 2014-4-17 21:37:27 | 显示全部楼层
赶紧拿本子记下来  学习   

出0入0汤圆

发表于 2014-4-18 14:21:16 | 显示全部楼层
拜读  学习了

出0入0汤圆

发表于 2014-4-18 14:27:25 | 显示全部楼层
先mark 以后有需要在自宫

出0入0汤圆

发表于 2014-5-13 15:07:48 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2014-5-13 18:47:50 | 显示全部楼层
plc_avr 发表于 2012-4-18 16:04
有兴趣的看下我发的这个贴子,共享近段时间研究防止HEX被修改的成果,CRC16 HEX文件自动修改生成器,使产品 ...

同意做个boot然后自宫,
毕竟现在反编译那么方便,你加密算法写再牛比,反编译一下全出来了。
如果挥刀自宫之后,就不怕被抓到QJ意志了。

出0入0汤圆

发表于 2014-5-18 10:58:53 | 显示全部楼层
shangdawei 发表于 2012-4-15 22:16
程序里面有意无意频繁的读取ID, 不失为一个办法.

没多大作用吧、、、一般都是在程序运行开始实现加密、、、找第一次ID读取动作点就行了、、、、不过看来也可以在程序运行中的其它关键位置多加几道加密、、、

出0入0汤圆

发表于 2014-5-20 19:02:48 | 显示全部楼层

之前就考虑过这个方法,谢谢楼主的辛苦成果

出0入0汤圆

发表于 2014-5-21 12:21:32 | 显示全部楼层
shangdawei 发表于 2012-4-18 13:21
>> 一个校验和不对就不干活!

照样干活, 不过随机性的出现错误, 这样隐蔽些 ...

不错,我就是想这么干的,照样干活,干着干着然后就复位或都输出IO不正确,死机最不好,容易发现

出0入0汤圆

发表于 2014-8-18 09:24:21 | 显示全部楼层
mak,芯片加密

出0入0汤圆

发表于 2014-8-18 12:13:35 | 显示全部楼层
学习下。。。。。。。。。。。。。。。。

出0入0汤圆

发表于 2014-12-9 01:50:27 | 显示全部楼层
楼主这个思维很不错哇

出0入0汤圆

发表于 2014-12-9 08:29:09 | 显示全部楼层
mark 多谢

出0入0汤圆

发表于 2014-12-9 08:48:43 | 显示全部楼层
我的想法就没有大家这么高级,我只是在想,写个bootload,可以从串口或者什么别的口更新固件,接下来,把和download程序有关的引脚,直接剪断,或者有没有可能通过什么特别手段,上电烧毁这些引脚

出0入0汤圆

发表于 2014-12-9 17:52:33 | 显示全部楼层
mark!!!!!

出0入0汤圆

发表于 2015-1-23 12:42:25 | 显示全部楼层
jmsth 发表于 2012-8-2 17:26
有个建议,MCU制造商不公开唯一ID地址,如果MCU加密位启用了,内部自动生成一段防抄码,加在写入的HEX中, ...

思路很好!这种公开ID码地址的,还是在考验开发人员的水平,加密性能还是要有开发商来想办法。

出0入0汤圆

发表于 2015-1-26 15:21:41 | 显示全部楼层
哈哈,集思广益,顶楼主~

出0入0汤圆

发表于 2015-1-28 15:21:52 | 显示全部楼层
我觉得简单ID加密+周期较长的陷阱最好,等他破解第一道防线,让他量产,几个月之后再出问题。

出0入0汤圆

发表于 2015-1-28 15:50:34 | 显示全部楼层
没想到这么久远的帖子,还有人在讨论,但是讨论的所有方法,都有一个前提,就是唯一ID本身是安全的。难道大家没听说过很多MCU的唯一ID可以修改吗?人家直接把ID改成一样的。

出0入0汤圆

发表于 2015-1-28 16:24:05 | 显示全部楼层
zhikai_wu 发表于 2012-4-15 13:58
主要的是程序知道了是不合法,别让程序挂掉,这样很容易怀疑哪个地方出了问题,如果你修改一些参数,让程 ...

一个朋友的经验,
发现盗版时程序运行不同结果,最终市场结果是:没人再敢买这个产品,不管是正版还是盗版.

故事是这样,朋友花半年时间开发了一款游戏机,打广告每月花近2W.当然游戏机不大合法,至少不能正规注册生产.
因为投入大本钱,不想给别人直接解密后抄板,在程序里加密了,ID号不对,会经常有大奖产生.
刚出前三个月,卖得较红火,因为有前期广告的大量投入.
第四个月开始发现市场上有大量盗版,所有东西一模一样,售后维护电话都一样!
结果大量游戏场地找他退机,不管是之前的正版机还是别人的盗版机,都打电话叫退机.盗版机当然他不会退了,因
为不是跟他买的嘛.但正版机也退完给他,因为对于一个用户,发现别的机台有大量问题,谁还敢用这款机赚钱?用户
无法判断正品还是盗版.
结果,朋友这款产品被盗版踩烂了.

所以,最好保护自己版权的方法应该是停止运行,并提示用户这是个盗版货,存在风险.

出0入0汤圆

发表于 2015-1-28 17:48:11 | 显示全部楼层
Firman 发表于 2015-1-28 16:24
一个朋友的经验,
发现盗版时程序运行不同结果,最终市场结果是:没人再敢买这个产品,不管是正版还是盗版.

不同的行业,不同的处理。

出0入0汤圆

发表于 2015-8-22 23:44:34 | 显示全部楼层
如果我没猜错的话。市面上卖的便宜的stm32芯片,
肯定是做过手脚的。所以唯一id,作为加密手段。
肯定是不行的。很容易被破解掉。
因为源头就做好了准备,等你们上套。

出0入0汤圆

发表于 2015-8-24 17:38:33 | 显示全部楼层
Good Job+++++++++

出0入0汤圆

发表于 2015-8-25 09:36:33 | 显示全部楼层
差不多就是这个思路

出0入0汤圆

发表于 2015-8-25 09:38:47 | 显示全部楼层
Firman 发表于 2015-1-28 16:24
一个朋友的经验,
发现盗版时程序运行不同结果,最终市场结果是:没人再敢买这个产品,不管是正版还是盗版.

这个故事蛮有意思的

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-19 18:58

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

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