本帖最后由 hotpower 于 2023-9-19 15:53 编辑
利用HotCRC中的初值碰撞保护版权信息不受侵害(菜农之天下无贼论)
作者:雁塔菜农HotPower
声明:本文特别为指导菜农熟悉FPGA的FPGA高手,网友“风扬”(QQ:1023174982)和网友烈火所编写。
特别注意:
菜农回复楼下网友
kutf 发表于 2019-9-15 06:41
牛皮吹的响。不如来做一道幼儿题目。来**一下这个AES加密的字符串是什么吧 a462a18a03010a31a87c51206d6d ...
菜农继续吹牛:
菜农的超级CRC计算器www.hotcrc.com自称地球第二,坐等第一来和菜农PK!!!
1.使用工具:
菜农的超级CRC计算器www.hotcrc.com
2.将要保护的版权信息:
菜农HotPower@163.com 2019.9.15于西安雁塔菜地
3.选择CRCn:
例如CRC32:
多项式:CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1
简写式:CRC32R_EDB88320_FFFFFFFF_FFFFFFFF(初值和出值随意)
4.选择输入方式HotCode(菜农自创万国字符编码):
因为版权信息包括汉字,可以选择UTF-8(每个汉字三个字节)或HotCode(每个汉字两个字节)
5.明文填入版权信息:
菜农HotPower@163.com 2019.9.15于西安雁塔菜地
6.设置出值为0
出值=00000000(0x00000000)
7.点击运算按钮
得到结果=CD8CF036(校验和0xCD8CF036)
8.设置结果为0,这个是“天下无贼论”之成功要诀。用它“大杀四方”,用它异或关键的输出和函数入口地址(改写函数指针)
结果=00000000(校验和0x00000000)
9.点击初值碰撞
得到初值=4BFAEA03(0x4BFAEA03)
10.点击运算按钮(验证)
得到结果=00000000(校验和0x00000000)
11.选择输入方式HEX:
点击还原按钮,得到版权信息的HEX
E3DCB19C486F74506F776572403136332E636F6D20323031392E392E3135AE8EE97FBB89F6C1B854E3DCB730
12.自动生成C语言源码(5种算法)
1)选择功能=CRC表格和C语言,“.C”
2)选择算法=“大表”,“算法”(移位算法)
3)点击生成按钮,得到C语言表格和算法如下:
- /*------------------------------------------------------------------------------
- 本C语言核心代码由菜农HotPower@163.com的超级CRC计算器自动生成
- Copyright 1996-2018 HotPower Software, Inc.
- 菜农HotPower@163.com 2019年9月15日 上午7:20:41 于西安雁塔菜地
- ------------------------------------------------------------------------------*/
- //CRC移位算法:
- unsigned long GetCRC32R_EDB88320_4BFAEA03_00000000(unsigned char *crcBuff, unsigned int crcLen) {
- unsigned int i, n;
- unsigned long crc = 0x4BFAEA03;//初值
- unsigned char crcTemp;
- for(i = 0; i < crcLen; i ++){
- crcTemp = crcBuff;
- for(n = 0; n < 8; n++){
- if((crcTemp ^ crc) & 0x01){
- crc >>= 1;
- crc ^= 0xEDB88320;
- }
- else crc >>= 1;
- crcTemp >>= 1;
- }
- }
- return crc;
- }
- int main(){
- //数据格式:HEX
- const unsigned char dataTable[] = {
- 0xE3, 0xDC, 0xB1, 0x9C, 0x48, 0x6F, 0x74, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x40, 0x31, 0x36, 0x33,
- 0x2E, 0x63, 0x6F, 0x6D, 0x20, 0x32, 0x30, 0x31, 0x39, 0x2E, 0x39, 0x2E, 0x31, 0x35, 0xAE, 0x8E,
- 0xE9, 0x7F, 0xBB, 0x89, 0xF6, 0xC1, 0xB8, 0x54, 0xE3, 0xDC, 0xB7, 0x30
- };//特别注意Keil C51请用code替换const
- unsigned long crc;
- crc = GetCRC32R_EDB88320_4BFAEA03_00000000((unsigned char *)dataTable, sizeof(dataTable));
- //移位函数返回crc=0x00000000,与HotWC3运算相同
- while(crc | 1);//死循环,请在此处设置断点,验证函数返回值crc是否正确!!!
- return 0;
- }
[color=rgb(51, 102, 153) !important]复制代码
13.选择功能=CRC基本运算
14.选择输入方式HotCode:
因为版权信息包括汉字,可以选择UTF-8(每个汉字三个字节)或HotCode(每个汉字两个字节)
15.明文填入篡改邮箱版权信息(篡改):
菜农HotPower@126.com 2019.9.15于西安雁塔菜地
16.点击运算按钮(验证)
得到结果=C5EA37D5(校验和0xC5EA37D5),即篡改邮箱版权信息,校验和不为0
故即可检测到“有贼来了”
17.天下无贼
菜农此生**无数,也写过注册机(**了算法),也干过暴击**(找到了分支),前者的难度大过后者。
所以程序关键处最好不要出现分支即判断语句,例如if (x == 0x250) good() else bad()
暴力**者可以有两几种方法:
1. x = 0x250;...if (x == 0x250) good() else bad();
2. if (x = 0x250) good() else bad();
3. goto good();
故应该用第10步的CRC=0x00000000来去“大杀四方”,例如,把CRC自身压缩为1个字节的CRC0(32位分4组,再一起XOR,变为1个字节的0x00)
然后,把这个1个字节的CRC0保存多份,例如8份CRC0[8],注意不要连续保存!!!
最后,在不同位置对关键XOR它。例如string=“HotPower”,那么用CRC0[8] ^ string[8]=string(因为CRC0 == 0,故string输出显示没错!!!)
假设有贼光临,那么CRC0[8] ^ string[8] !=string(因为CRC0 != 0,故string输出显示出错!!!),那么贼需要找8个CVRC0[8]
菜农“天下无贼论”原理:
1.明文长度最好不是权值的倍数,这样攻防双方都必须穷举初值
2.设置出值为0,不给反汇编插入出值的机会
3.点击运算按钮,得到密文,为初值碰撞提供密文
4.设置结果为0,这个是“天下无贼论”之成功要诀。用它“大杀四方”,用它异或关键的输出和函数入口地址(改写函数指针)
5.点击初值碰撞,给出最终的初值。(函数体内)
6.自动生成5种C语言源码
注:
移位算法(速度最慢)
查表算法:
1.大表,单表(表格256组),例如CRC8为256个字节,CRC16为256*2个字节),速度最快
2.小表,单表(表格16组),例如CRC8为16个字节,CRC16为16*2个字节),速度比移位快
3.大表,双表(双组表格256组),例如CRC16为2组256*1个字节,CRC32为2组256*2个字节),例如CRC8做CRC16
4.小表,双表(双组表格16组),例如CRC16为2组16*1个字节,CRC32为2组16*2个字节),例如CRC8做CRC16
例如16位的MCU,运算CRC32,可以用16位的数据类型如unsigned
1.选择功能=CRC表格和C语言,“.C”
2.选择算法=“双表”,“小表”(查表算法)
3.点击生成按钮,得到C语言表格和算法如下:
- /*------------------------------------------------------------------------------
- 本C语言核心代码由菜农HotPower@163.com的超级CRC计算器自动生成
- Copyright 1996-2018 HotPower Software, Inc.
- 菜农HotPower@163.com 2019年9月15日 上午7:31:46 于西安雁塔菜地
- ------------------------------------------------------------------------------*/
- /CRC双表小表查表算法:
- const unsigned short CRC32R_EDB88320_Table_Hi[16] = {//特别注意Keil C51请用code替换const
- 0x0000,0x1DB7,0x3B6E,0x26D9,0x76DC,0x6B6B,0x4DB2,0x5005,0xEDB8,0xF00F,0xD6D6,0xCB61,0x9B64,0x86D3,0xA00A,0xBDBD
- };
- const unsigned short CRC32R_EDB88320_Table_Lo[16] = {//特别注意Keil C51请用code替换const
- 0x0000,0x1064,0x20C8,0x30AC,0x4190,0x51F4,0x6158,0x713C,0x8320,0x9344,0xA3E8,0xB38C,0xC2B0,0xD2D4,0xE278,0xF21C
- };
- //CRC双表小表查表算法:
- unsigned long GetCRC32R_EDB88320_4BFAEA03_00000000_Table(unsigned char *crcBuff, unsigned int crcLen) {
- unsigned int i;
- unsigned char crcTemp;
- unsigned short crch, crcl;
- crch = 0x4BFA;
- crcl = 0xEA03;
- for(i = 0; i < (crcLen * 2); i ++){
- if (i & 1) crcTemp = crcBuff[i >> 1] >> 4;
- else crcTemp = crcBuff[i >> 1] & 0x0F;
- crcTemp = (crcl & 0x0F) ^ crcTemp;
- crcl = ((crcl >> 4) | (crch << 12)) ^ CRC32R_EDB88320_Table_Lo[crcTemp];
- crch = (crch >> 4) ^ CRC32R_EDB88320_Table_Hi[crcTemp];
- }
- return (unsigned long)(crch << 16) | crcl;
- }
- int main(){
- //数据格式:HEX
- unsigned long crc;
- const unsigned char dataTable[] = {
- 0xE3, 0xDC, 0xB1, 0x9C, 0x48, 0x6F, 0x74, 0x50, 0x6F, 0x77, 0x65, 0x72, 0x40, 0x31, 0x36, 0x33,
- 0x2E, 0x63, 0x6F, 0x6D, 0x20, 0x32, 0x30, 0x31, 0x39, 0x2E, 0x39, 0x2E, 0x31, 0x35, 0xAE, 0x8E,
- 0xE9, 0x7F, 0xBB, 0x89, 0xF6, 0xC1, 0xB8, 0x54, 0xE3, 0xDC, 0xB7, 0x30
- };//特别注意Keil C51请用code替换const
- crc = GetCRC32R_EDB88320_4BFAEA03_00000000_Table((unsigned char *)dataTable, sizeof(dataTable));
- //表格函数返回crc=0x00000000,与HotWC3运算相同
- while(crc | 1);//死循环,请在此处设置断点,验证函数返回值crc是否正确!!!
- return 0;
- }
可以看到表格数据类型长度减半,特别适合:
8位MCU做CRC16,16位MCU做CRC32,32位MCU做CRC64
菜农HotPower@163.com 2019.9.15于西安雁塔菜地[/td][/tr]
|