本帖最后由 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知道你买的是什么芯片!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>