|
第二课 用易语言实现crc32检测
下面这段代码是crc32表 C++的写法,
- #include <windows.h>
- #include <stdio.h>
-
- DWORD crc32_table[256];
-
- void CRC32_Table()
- {
- DWORD crc;
- //DWORD crc32_table[256];
- for (int i = 0; i < 256; i++)
- {
- crc = i;
- for (DWORD k = 0; k < 8; k++)
- {
- if (crc & 1)
- crc = (crc >> 1) ^ 0xEDB88320;
- else
- crc >>= 1;
- }
- crc32_table[i] = crc; //生成并存储CRC32数据表
- }
- }
复制代码 我已经帮大家把翻译好的易语言代码粘贴到这里
变量名 | 类 型 | 静态 | 数组 | 备 注 | crcval | 整数型 | | | 长度 | 整数型 | | | i | 整数型 | | | 结果 | 文本型 | | | 位置 | 整数型 | | | CRC | 整数型 | | | table | 整数型 | | 256 |
长度 = 取字节集长度 (字节集数据 ) 如果真 (长度 < 1 ) 返回 (“”) 变量循环首 (0, 255, 1, i ) CRC = i  变量循环首 (1, 8, 1, )  如果 (位与 (CRC, 1 ) ≠ 0 )   CRC = 位异或 (位与 (右移 (CRC, 1 ), 2147483647 ), 3988292384 )   CRC = 位与 (右移 (CRC, 1 ), 2147483647 )    变量循环尾 () table [i + 1 ] = CRC 变量循环尾 ()crcval = 4294967295 计次循环首 (长度, i ) 位置 = 位异或 (字节集数据 [i ], 位与 (crcval, 255 )) + 1  crcval = 位异或 (位与 (右移 (crcval, 8 ), 16777215 ), table [位置 ]) 计次循环尾 ()返回 (取十六进制文本 (位取反 (crcval )) )
我们必须在程序启动的第一时间计算出crc32的值,所以用如下写法(使用精易模块)
窗口程序集名 | 保 留 | 保 留 | 备 注 | 窗口程序集_启动窗口 | | | | 变量名 | 类 型 | 数组 | 备 注 | 内存操作 | 类_内存 | |
CRC初始值 = 取CRC32 (内存操作. 读字节集 (进程_取自进程ID (), 进制_十六到十 (“401000”), 1024 ))
这里为了做演示,我就以401000这个地址为起点,1024长度的内存地址这个范围经行检测,实际运用当中,可以根据要检测的地址随意变换
现在来看看校验逻辑
判断循环首 (真) 如果真 (取CRC32 (内存操作. 读字节集 (进程_取自进程ID (), 进制_十六到十 (“401000”), 1024 )) ≠ CRC初始值 ) 信息框 (“检测到代码被修改!”, 0, , _启动窗口. 取窗口句柄 ()) Sleep (1000) 判断循环尾 ()
我们搞个按钮,在里面启动一下crc检测
销毁线程
写完之后用CE附加进程,随便添加一个地址比如401050,然后修改一下对应的汇编代码,你会发现程序发现了代码被篡改
学会了crc32检测,我们就可以进行程序完整性检测,也可以发挥一下自己的脑洞,写个检测crc的crc也是没有问题的
|
|