打印
[代码反篡改]

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

[复制链接]
1406|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2023-10-25 14:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#include <stdio.h>  
#include <stdint.h>
#include "stm32f10x.h"

const uint32_t CRC32Array[8] = {//菜农HotPower@163.com
//全局数组,在Flash里
        0x55555555,//头数据,为注册机提供搜索位置,改写即篡改非零
        0xAAAAAAAA,//头数据,为注册机提供搜索位置,改写即篡改非零
        0x12345678,//头数据,为注册机提供搜索位置,改写即篡改非零
        0x20231025,//多项式可以是随机数,例如今天是2023.10.25
        FLASH_BASE,//Flash基地址
        0x1170,//HEX长度
        0x7238F872,//CRC32初值1
        0x560A27BA //CRC32初值2
};
uint32_t CRC32Val(uint32_t input, uint32_t poly, uint32_t init, uint32_t xorout)
{//菜农HotPower@163.com
        uint32_t ch;
        int i;
        input ^= init;
        if ((poly & 1) > 0)
        {
                for (i = 0; i < 32; i++)
                {
                        ch = input & 0x80000000;
                        input <<= 1;
                        if (ch > 0)
                        {
                                input ^= poly;
                        }
                }
        }
        else
        {
                for (i = 0; i < 32; i++)
                {
                        ch = input & 1;
                        input >>= 1;
                        if (ch > 0)
                        {
                                input ^= poly | 0x80000000;
                        }
                }
        }
        if ((poly & 0x80000001) == 0)
        {
                input ^= poly ^ 0x80000001;
        }
        input ^= xorout;
        return input;
}

uint32_t CRC32Valx(uint32_t output, uint32_t poly, uint32_t init, uint32_t xorout)
{//菜农HotPower@163.com
        int i;
        output ^= xorout;
        if ((poly & 0x80000001) == 0)
        {
                output ^= poly ^ 0x80000001;
        }
        if ((poly & 1) > 0)
        {
                for (i = 0; i < 32; i++)
                {
                        if ((output & 1) > 0)
                        {
                                output ^= poly;
                                output >>= 1;
                                output |= 0x80000000;
                        }
                        else
                        {
                                output >>= 1;
                        }
                }
        }
        else
        {
                for (i = 0; i < 32; i++)
                {
                        if ((output & 0x80000000) > 0)
                        {
                                output ^= poly;
                                output <<= 1;
                                output |= 1;
                        }
                        else
                        {
                                output <<= 1;
                        }
                }
        }
        output ^= init;
        return output;
}

void SetCRC32Init(uint32_t* init1, uint32_t* init2)
{//菜农HotPower@163.com
        //volatile
        uint32_t* FlashAddr = (uint32_t*)CRC32Array[4];
        uint32_t len = CRC32Array[5] / 4;
        uint32_t CRC32Init;
        uint32_t crc32;
        uint32_t crcpoly = CRC32Array[3];
        int pos1 = (int)(((uint32_t)&CRC32Array[6] - CRC32Array[4]) / 4);
        int pos2 = (int)(((uint32_t)&CRC32Array[7] - CRC32Array[4]) / 4);
        CRC32Init = 0;
        int i;
        for(i = len - 1;i >= 0;i--)
        {
                crc32 = FlashAddr[i];
                if(!(i == pos1 || i == pos2))
                {
                        CRC32Init = CRC32Valx(CRC32Init, crcpoly, crc32, 0);
                }
        }
        *init1 = CRC32Init;
        CRC32Init = 0;
        for(i = 0;i < len;i++)
        {
                crc32 = FlashAddr[i];
                if(!(i == pos2))
                {
                        CRC32Init = CRC32Valx(CRC32Init, crcpoly, crc32, 0);
                }
        }
        *init2 = CRC32Init;       
}

uint32_t GetCRC32Init12()
{//菜农HotPower@163.com
        uint32_t* FlashAddr = (uint32_t*)CRC32Array[4];
        uint32_t len = CRC32Array[5] / 4;
        uint32_t CRC32Init;
        uint32_t crc32;
        uint32_t crcpoly = CRC32Array[3];
        int pos1 = (int)(((uint32_t)&CRC32Array[6] - CRC32Array[4]) / 4);
        int pos2 = (int)(((uint32_t)&CRC32Array[7] - CRC32Array[4]) / 4);
        int i;
        CRC32Init = CRC32Array[6];
        for(i = 0;i < len;i++)
        {
                crc32 = FlashAddr[i];
                if(!(i == pos1 || i == pos2))
                {
                        CRC32Init = CRC32Val(crc32, crcpoly, CRC32Init, 0);
                }
        }
        CRC32Init ^= CRC32Array[7];
        for(i = len - 1;i >= 0;i--)
        {
                crc32 = FlashAddr[i];
                if(!(i == pos2))
                {
                        CRC32Init = CRC32Val(crc32, crcpoly, CRC32Init, 0);
                }
        }
        return CRC32Init;
}

uint32_t GetCRC32Init1()
{//菜农HotPower@163.com
        uint32_t* FlashAddr = (uint32_t*)CRC32Array[4];
        uint32_t len = CRC32Array[5] / 4;
        uint32_t CRC32Init;
        uint32_t crc32;
        uint32_t crcpoly = CRC32Array[3];
        int pos1 = (int)(((uint32_t)&CRC32Array[6] - CRC32Array[4]) / 4);
        int pos2 = (int)(((uint32_t)&CRC32Array[7] - CRC32Array[4]) / 4);
        int i;
        CRC32Init = CRC32Array[6];
        for(i = 0;i < len;i++)
        {
                crc32 = FlashAddr[i];
                if(!(i == pos1 || i == pos2))
                {
                        CRC32Init = CRC32Val(crc32, crcpoly, CRC32Init, 0);
                }
        }
        return CRC32Init;
}

uint32_t GetCRC32Init2()
{//菜农HotPower@163.com
        uint32_t* FlashAddr = (uint32_t*)CRC32Array[4];
        uint32_t len = CRC32Array[5] / 4;
        uint32_t CRC32Init;
        uint32_t crc32;
        uint32_t crcpoly = CRC32Array[3];
        int pos2 = (int)(((uint32_t)&CRC32Array[7] - CRC32Array[4]) / 4);
        int i;
        CRC32Init = CRC32Array[7];
        for(i = len - 1;i >= 0;i--)
        {
                crc32 = FlashAddr[i];
                if(!(i == pos2))
                {
                        CRC32Init = CRC32Val(crc32, crcpoly, CRC32Init, 0);
                }
        }
        return CRC32Init;
}
int main(void)
{//菜农HotPower@163.com
        uint32_t init1;//填入CRC32Array[6]的CRC32初值1
        uint32_t init2;//填入CRC32Array[7]的CRC32初值2
        volatile uint32_t init12;
        SetCRC32Init(&init1, &init2);//结果填入CRC32初值1(第1次),CRC32初值2(第2次),需要编译运行两次!!!
        init12 = GetCRC32Init12();//被篡改非零!!!可以篡改CRC32Array[0],CRC32Array[1],CRC32Array[2]
        init1 = GetCRC32Init1();//被篡改非零!!!可以篡改CRC32Array[0],CRC32Array[1],CRC32Array[2]
        init2 = GetCRC32Init2();//被篡改非零!!!可以篡改CRC32Array[0],CRC32Array[1],CRC32Array[2]
  while (1) {
    printf ("Hello World\n");   /* Print "Hello World" */
  }
       
}
































stm32反篡改未篡改数据.png (87.44 KB )

stm32反篡改未篡改数据.png

stm32反篡改未篡改时.png (366.25 KB )

stm32反篡改未篡改时.png

stm32反篡改被篡改数据.png (86.63 KB )

stm32反篡改被篡改数据.png

stm32反篡改被篡改时.png (291.75 KB )

stm32反篡改被篡改时.png

ReadAddress.rar

259.6 KB

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

1460

主题

21619

帖子

506

粉丝