给你介绍96bit UID 分别是什么!有规律可循.

2019-07-20 09:09发布

本帖最后由 cl17726 于 2017-3-29 00:17 编辑

首先,有规律可循,这样大大降低破解难度.

UID0寄存器,代表的是芯片在Die 中的 X/Y 坐标.我的芯片对应位置0x1FF0F420.
UID1寄存器,代表的是芯片的Die 的编号.因为我们买了一整盘的芯片,这一位是完全相等的.我芯片对应位置0x1FF0F424.
UID2寄存器,就是Lot号,也就是真正的UID.这个和UID0是有一定计算关系和规律的.我的地址是0x1FF0F428.

我买了一盘的STM32F722,目前查到的5片规律如下.分别是UID0,UID1,UID2顺序写.我整理了一下顺序.

UID0        UID1      UID2
0025002A 30365116 33383533

0025032A 30365116 333B3533

0025042A 30365116 333C3533

0026062A 30365116 334E3533

0028082A 30365116 336F3533


UID1是不变的,UID0的坐标加1时候,UID2也加1,然后我找到了F767的原子的板子.

UID0        UID1      UID2
3341321A 31300996 3A3A6010


意思是什么,在31300996的晶圆上,切出的坐标41,32的芯片...

为了验证,FAE的指导下,我找到了这个文件.STM32Cube_FW_F7_V1.6.0ProjectsSTM32F767ZI-NucleoExamples_LLUTILSUTILS_ReadDeviceInfo

[mw_shl_code=c,true]void GetMCUInfo(void)
{
  register uint32_t size_string = 0, read_info = 0, read_info2 = 0;

  /* Display Device ID in string format */
  sprintf((char*)aShowDeviceID,"Device ID = 0x%lX", LL_DBGMCU_GetDeviceID());
  
  /* Display Revision ID in string format */
  sprintf((char*)aShowRevisionID,"Revision ID = 0x%lX", LL_DBGMCU_GetRevisionID());

  /* Display  X and Y coordinates on the wafer expressed in BCD format */
  sprintf((char*)aShowCoordinate,"X and Y coordinates = 0x%lX", LL_GetUID_Word0());
  
  /* Display Waver number and lot number in string format */
  read_info = LL_GetUID_Word1();
  read_info2 = LL_GetUID_Word2();
  sprintf((char*)aShowWaferNumber,"Wafer NB = 0x%X", (uint8_t)read_info);
  size_string = sprintf((char*)aShowLotNumber,"Lot NB = 0x%lX", read_info2);
  sprintf((char*)aShowLotNumber+size_string,"%lX", (read_info >> 8));
}[/mw_shl_code]

也就是说,利用任何一个,都不能作为唯一,ST用这种方法保证唯一性,确实很唯一,但是也是规律可寻的.

换句话,ST可以通过UID1知道你买的是什么芯片!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。