易语言吧

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 610|回复: 0

[技术文章] 第二课 用易语言实现crc32检测

[复制链接]

6

主题

41

帖子

2285

积分

VIP超级贵宾

Rank: 8Rank: 8

积分
2285
威望
0
易币
2244
贡献
0
积分
2285
UID
40804
在线时间
23 小时
注册时间
2024-1-18
发表于 2025-2-4 22:42:12 | 显示全部楼层 |阅读模式
第二课 用易语言实现crc32检测


下面这段代码是crc32表 C++的写法,
  1. #include <windows.h>
  2. #include <stdio.h>

  3. DWORD crc32_table[256];

  4. void CRC32_Table()
  5. {
  6.           DWORD crc;
  7.           //DWORD crc32_table[256];
  8.     for (int i = 0; i < 256; i++)
  9.     {
  10.            crc = i;
  11.            for (DWORD k = 0; k < 8; k++)
  12.            {
  13.                          if (crc & 1)
  14.                                   crc = (crc >> 1) ^ 0xEDB88320;
  15.                          else
  16.                                   crc >>= 1;
  17.                   }
  18.                   crc32_table[i] = crc; //生成并存储CRC32数据表
  19.             }
  20. }
复制代码
我已经帮大家把翻译好的易语言代码粘贴到这里
  
子程序名返回值类型公开备 注
取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长度的内存地址这个范围经行检测,实际运用当中,可以根据要检测的地址随意变换

现在来看看校验逻辑
  
子程序名返回值类型公开备 注
CRC内存效验  
判断循环首 ()
如果真 (取CRC32 (内存操作.读字节集 (进程_取自进程ID (), 进制_十六到十 (“401000”), 1024)) ≠ CRC初始值)
信息框 (“检测到代码被修改!”, 0, , _启动窗口.取窗口句柄 ())
Sleep (1000)
判断循环尾 ()

我们搞个按钮,在里面启动一下crc检测
  
子程序名返回值类型公开备 注
_按钮1_被单击  
CRC线程 = 线程_启动 (&CRC内存效验, , )

销毁线程
  
子程序名返回值类型公开备 注
_按钮2_被单击  
如果真 (CRC线程 ≠ 0)
线程_销毁 (CRC线程)

写完之后用CE附加进程,随便添加一个地址比如401050,然后修改一下对应的汇编代码,你会发现程序发现了代码被篡改
学会了crc32检测,我们就可以进行程序完整性检测,也可以发挥一下自己的脑洞,写个检测crc的crc也是没有问题的

懒得打字嘛,点击右侧快捷回复 【选择右侧内容,快速回复】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

大漠插件注册码无须等1-3号

QQ|一:站内所有资源均来自互联网收集或用户上传分享,本站不拥有此类资源的版权。 作为网络服务提供者,对转载行为的发生不具备充分的监控能力。但是当版权拥有者提出侵权并出示充分的版权证明材料时,易语言吧负有移除转载作品以及停止继续传播的义务。在满足前款条件下采取移除等相应措施后不为此向原发布人承担违约责任,包括不承担因侵权不成立而给原发布人带来损害的赔偿责任。 用户免费分享产生,如果侵犯了你的权益,联系QQ:3066137757|Archiver|手机版|小黑屋|易语言吧

GMT+8, 2025-4-26 09:27 , Processed in 0.152263 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表