低调npc 发表于 2025-2-4 22:42:12

第二课 用易语言实现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]
查看完整版本: 第二课 用易语言实现crc32检测