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