哈哈,即使用纸糊一个“盾”,也得动动脑筋才行啊,比如我在4楼糊的那个,被Hot大叔用NOP牌的矛就戳穿了 版主 发表于 2010-8-20 08:47
必须采用2级至上的防止代码被改写保护,否则简单的NOP即可搞定。
哈哈~~~有机会俺再写些如何对付虚拟机和注册机是正版软件之墓地的水文~~~
要想不用自己挨个去读,就做个bootloader
用bootloader读这个ID,用加密算法算出来个数写到内存里一个位置,
应用程序启动后,同样用这个算法算出结果和bootloader的结果去比较,不符合就不运行
bootloader读保护+写保护
这个加密算法你自己掌握就行
真是仁者见仁,智者见智。
24楼的方法 很好,也是可行的哈,又给我们提供了一种加密方法,这种方法便于生产了。
不用每个IC去读ID,然后写入
不过还真没应用过bootloader。。。再学习一下
谢谢各位了
建议不要用24楼的将结果比较之言论…
解密菜鸟的第一课就是如何对付此类加密方法。
要想不用自己挨个去读,就做个bootloader
用bootloader读这个ID,用加密算法算出来个数写到内存里一个位置,
应用程序启动后,同样用这个算法算出结果和bootloader的结果去比较,不符合就不运行
bootloader读保护+写 ...
不必自己写Bootloader,使用STM32内嵌的Bootloader就可以读出器件电子签名。
看各位高手讨论,不免心动,借机询问:
以下是stm32 usb库中的一段程序:
/* Function Name : Get_SerialNum.
* Description : Create the serial number string descriptor.
* Input : None.
* Output : None.
* Return : None.
*/
void Get_SerialNum(void)
{
uint32_t Device_Serial0, Device_Serial1, Device_Serial2;
Device_Serial0 = *(__IO uint32_t*)(0x1FFFF7E8); //器件电子签名的首地址
Device_Serial1 = *(__IO uint32_t*)(0x1FFFF7EC);
Device_Serial2 = *(__IO uint32_t*)(0x1FFFF7F0);
Device_Serial0 += Device_Serial2;
if (Device_Serial0 != 0)
//这是否意味着电子签名还是有一定规律的?或都只是我乱猜?或都是写这个例子的人有点偷懒?
{
IntToUnicode (Device_Serial0, &Joystick_StringSerial[2] , 8);
IntToUnicode (Device_Serial1, &Joystick_StringSerial[18], 4);
}
}
不明白,你凭什么说电子签名是有一定规律的?凭什么说写这个例子的人有点偷懒?
if (Device_Serial0 != 0) 这句话能说明什么?为什么?
哦,我的理解是:
if (Device_Serial0 != 0) 条件成立则执行下面的行,否则不执行。
那么编程者必须要能肯定
Device_Serial0 += Device_Serial2;
运算以后的结果是Device_Serial0不等于0。
未知我的理解是否正确?
军事秘密,只有通过至少三个id才能找到校验算法。
很难…但并非不可能。
呵呵 HOT大叔 说得是 bootloader的做法 我也发现不 可行,因为这样很容易被破
要么每个bootloader 不一样! 还是麻烦的,我现在还是打算采用副ID的形式 来做 加密性可以达到我的要求了,试验程序 就塞BUG罢 没人能搞定 要是能搞定了 就相当于看懂代码,重写代码了,呵呵
恐怕你不懂USB,所以也不知道这2行在做什么:
IntToUnicode (Device_Serial0, &Joystick_StringSerial[2] , 8);
IntToUnicode (Device_Serial1, &Joystick_StringSerial[18], 4);
这2行是要设置这个设备的USB ...
版主 发表于 2010-8-24 14:13