[代码反篡改] stm32反篡改源码下载(菜农独创双向CRC初值碰撞反篡改)

[复制链接]
 楼主| 发表于 2023-10-25 14:04 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>  
  2. #include <stdint.h>
  3. #include "stm32f10x.h"

  4. const uint32_t CRC32Array[8] = {//菜农HotPower@163.com
  5. //全局数组,在Flash里
  6.         0x55555555,//头数据,为注册机提供搜索位置,改写即篡改非零
  7.         0xAAAAAAAA,//头数据,为注册机提供搜索位置,改写即篡改非零
  8.         0x12345678,//头数据,为注册机提供搜索位置,改写即篡改非零
  9.         0x20231025,//多项式可以是随机数,例如今天是2023.10.25
  10.         FLASH_BASE,//Flash基地址
  11.         0x1170,//HEX长度
  12.         0x7238F872,//CRC32初值1
  13.         0x560A27BA //CRC32初值2
  14. };
  15. uint32_t CRC32Val(uint32_t input, uint32_t poly, uint32_t init, uint32_t xorout)
  16. {//菜农HotPower@163.com
  17.         uint32_t ch;
  18.         int i;
  19.         input ^= init;
  20.         if ((poly & 1) > 0)
  21.         {
  22.                 for (i = 0; i < 32; i++)
  23.                 {
  24.                         ch = input & 0x80000000;
  25.                         input <<= 1;
  26.                         if (ch > 0)
  27.                         {
  28.                                 input ^= poly;
  29.                         }
  30.                 }
  31.         }
  32.         else
  33.         {
  34.                 for (i = 0; i < 32; i++)
  35.                 {
  36.                         ch = input & 1;
  37.                         input >>= 1;
  38.                         if (ch > 0)
  39.                         {
  40.                                 input ^= poly | 0x80000000;
  41.                         }
  42.                 }
  43.         }
  44.         if ((poly & 0x80000001) == 0)
  45.         {
  46.                 input ^= poly ^ 0x80000001;
  47.         }
  48.         input ^= xorout;
  49.         return input;
  50. }

  51. uint32_t CRC32Valx(uint32_t output, uint32_t poly, uint32_t init, uint32_t xorout)
  52. {//菜农HotPower@163.com
  53.         int i;
  54.         output ^= xorout;
  55.         if ((poly & 0x80000001) == 0)
  56.         {
  57.                 output ^= poly ^ 0x80000001;
  58.         }
  59.         if ((poly & 1) > 0)
  60.         {
  61.                 for (i = 0; i < 32; i++)
  62.                 {
  63.                         if ((output & 1) > 0)
  64.                         {
  65.                                 output ^= poly;
  66.                                 output >>= 1;
  67.                                 output |= 0x80000000;
  68.                         }
  69.                         else
  70.                         {
  71.                                 output >>= 1;
  72.                         }
  73.                 }
  74.         }
  75.         else
  76.         {
  77.                 for (i = 0; i < 32; i++)
  78.                 {
  79.                         if ((output & 0x80000000) > 0)
  80.                         {
  81.                                 output ^= poly;
  82.                                 output <<= 1;
  83.                                 output |= 1;
  84.                         }
  85.                         else
  86.                         {
  87.                                 output <<= 1;
  88.                         }
  89.                 }
  90.         }
  91.         output ^= init;
  92.         return output;
  93. }

  94. void SetCRC32Init(uint32_t* init1, uint32_t* init2)
  95. {//菜农HotPower@163.com
  96.         //volatile
  97.         uint32_t* FlashAddr = (uint32_t*)CRC32Array[4];
  98.         uint32_t len = CRC32Array[5] / 4;
  99.         uint32_t CRC32Init;
  100.         uint32_t crc32;
  101.         uint32_t crcpoly = CRC32Array[3];
  102.         int pos1 = (int)(((uint32_t)&CRC32Array[6] - CRC32Array[4]) / 4);
  103.         int pos2 = (int)(((uint32_t)&CRC32Array[7] - CRC32Array[4]) / 4);
  104.         CRC32Init = 0;
  105.         int i;
  106.         for(i = len - 1;i >= 0;i--)
  107.         {
  108.                 crc32 = FlashAddr[i];
  109.                 if(!(i == pos1 || i == pos2))
  110.                 {
  111.                         CRC32Init = CRC32Valx(CRC32Init, crcpoly, crc32, 0);
  112.                 }
  113.         }
  114.         *init1 = CRC32Init;
  115.         CRC32Init = 0;
  116.         for(i = 0;i < len;i++)
  117.         {
  118.                 crc32 = FlashAddr[i];
  119.                 if(!(i == pos2))
  120.                 {
  121.                         CRC32Init = CRC32Valx(CRC32Init, crcpoly, crc32, 0);
  122.                 }
  123.         }
  124.         *init2 = CRC32Init;       
  125. }

  126. uint32_t GetCRC32Init12()
  127. {//菜农HotPower@163.com
  128.         uint32_t* FlashAddr = (uint32_t*)CRC32Array[4];
  129.         uint32_t len = CRC32Array[5] / 4;
  130.         uint32_t CRC32Init;
  131.         uint32_t crc32;
  132.         uint32_t crcpoly = CRC32Array[3];
  133.         int pos1 = (int)(((uint32_t)&CRC32Array[6] - CRC32Array[4]) / 4);
  134.         int pos2 = (int)(((uint32_t)&CRC32Array[7] - CRC32Array[4]) / 4);
  135.         int i;
  136.         CRC32Init = CRC32Array[6];
  137.         for(i = 0;i < len;i++)
  138.         {
  139.                 crc32 = FlashAddr[i];
  140.                 if(!(i == pos1 || i == pos2))
  141.                 {
  142.                         CRC32Init = CRC32Val(crc32, crcpoly, CRC32Init, 0);
  143.                 }
  144.         }
  145.         CRC32Init ^= CRC32Array[7];
  146.         for(i = len - 1;i >= 0;i--)
  147.         {
  148.                 crc32 = FlashAddr[i];
  149.                 if(!(i == pos2))
  150.                 {
  151.                         CRC32Init = CRC32Val(crc32, crcpoly, CRC32Init, 0);
  152.                 }
  153.         }
  154.         return CRC32Init;
  155. }

  156. uint32_t GetCRC32Init1()
  157. {//菜农HotPower@163.com
  158.         uint32_t* FlashAddr = (uint32_t*)CRC32Array[4];
  159.         uint32_t len = CRC32Array[5] / 4;
  160.         uint32_t CRC32Init;
  161.         uint32_t crc32;
  162.         uint32_t crcpoly = CRC32Array[3];
  163.         int pos1 = (int)(((uint32_t)&CRC32Array[6] - CRC32Array[4]) / 4);
  164.         int pos2 = (int)(((uint32_t)&CRC32Array[7] - CRC32Array[4]) / 4);
  165.         int i;
  166.         CRC32Init = CRC32Array[6];
  167.         for(i = 0;i < len;i++)
  168.         {
  169.                 crc32 = FlashAddr[i];
  170.                 if(!(i == pos1 || i == pos2))
  171.                 {
  172.                         CRC32Init = CRC32Val(crc32, crcpoly, CRC32Init, 0);
  173.                 }
  174.         }
  175.         return CRC32Init;
  176. }

  177. uint32_t GetCRC32Init2()
  178. {//菜农HotPower@163.com
  179.         uint32_t* FlashAddr = (uint32_t*)CRC32Array[4];
  180.         uint32_t len = CRC32Array[5] / 4;
  181.         uint32_t CRC32Init;
  182.         uint32_t crc32;
  183.         uint32_t crcpoly = CRC32Array[3];
  184.         int pos2 = (int)(((uint32_t)&CRC32Array[7] - CRC32Array[4]) / 4);
  185.         int i;
  186.         CRC32Init = CRC32Array[7];
  187.         for(i = len - 1;i >= 0;i--)
  188.         {
  189.                 crc32 = FlashAddr[i];
  190.                 if(!(i == pos2))
  191.                 {
  192.                         CRC32Init = CRC32Val(crc32, crcpoly, CRC32Init, 0);
  193.                 }
  194.         }
  195.         return CRC32Init;
  196. }
  197. int main(void)
  198. {//菜农HotPower@163.com
  199.         uint32_t init1;//填入CRC32Array[6]的CRC32初值1
  200.         uint32_t init2;//填入CRC32Array[7]的CRC32初值2
  201.         volatile uint32_t init12;
  202.         SetCRC32Init(&init1, &init2);//结果填入CRC32初值1(第1次),CRC32初值2(第2次),需要编译运行两次!!!
  203.         init12 = GetCRC32Init12();//被篡改非零!!!可以篡改CRC32Array[0],CRC32Array[1],CRC32Array[2]
  204.         init1 = GetCRC32Init1();//被篡改非零!!!可以篡改CRC32Array[0],CRC32Array[1],CRC32Array[2]
  205.         init2 = GetCRC32Init2();//被篡改非零!!!可以篡改CRC32Array[0],CRC32Array[1],CRC32Array[2]
  206.   while (1) {
  207.     printf ("Hello World\n");   /* Print "Hello World" */
  208.   }
  209.        
  210. }
































stm32反篡改被篡改时.png
stm32反篡改被篡改数据.png
stm32反篡改未篡改时.png
stm32反篡改未篡改数据.png

ReadAddress.rar

259.6 KB, 下载次数: 9

您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:[url=http://www.21ic.com/tools/HotWC3_V1.23.html]

1460

主题

21619

帖子

508

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