开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 8565|回复: 19
收起左侧

[图文资料] CRC32校验码修改逆向

[复制链接]
发表于 2022-11-22 21:27:46 | 显示全部楼层 |阅读模式   北京市北京市

本工具可以修改 文件的CRC32值

用处:大家都知道,修改完文件后,文件的CRC32校验码会跟着改变。
用本工具就可以把 文件修改后的CRC32 修改成 文件未修改前的CRC32。
这样无论怎么修改文件,文件的CRC32 是不变的。

可以修改软件,hex文件,等等,破J时也许能用上
源码截图.gif
CRC设置演示1.gif
  
' ’————————————————生成CRC32表——————————————————
计次循环首 (256, i)
crc = i
计次循环首 (8, x)
LScrc = crc
如果 (位与 (crc, 1) > 0)
crc = 位异或 (位与 (右移 (位与 (crc, 4294967294), 1), 2147483647), 多项式)

crc = 位与 (右移 (位与 (crc, -2), 1), 2147483647)  ' 4294967294 = -2’
' .....位与 (*                       , 2147483647 = 01111111111111111111111111111111)强制左边补0’,因为负数右移后,前面补的是1 不是0’
' ’调试输出 (“crc = ” + 到文本 (LScrc) + “  假 = ” + 到文本 (crc))

计次循环尾 ()
CRCdata [i] = crc
CRC表组 [i] = crc
计次循环尾 ()

CRC设置演示2.gif




评分

参与人数 1精币 +1 收起 理由
临安 + 1 YYDS~!

查看全部评分


发表于 2024-6-12 23:05:01 | 显示全部楼层   江苏省苏州市
请问下作者这是这么回事?
QQ截图20240612230409.png
回复 支持 反对

使用道具 举报

发表于 2024-2-2 17:49:22 | 显示全部楼层   广东省汕尾市
学习咯,感谢分享
回复 支持 反对

使用道具 举报

签到天数: 20 天

发表于 2024-1-19 22:44:04 | 显示全部楼层   广东省惠州市
厉害呀,感谢分享啊!!!
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2023-12-25 20:36:08 | 显示全部楼层   河南省平顶山市
非常感谢分享
回复 支持 反对

使用道具 举报

签到天数: 8 天

发表于 2023-8-31 01:02:40 | 显示全部楼层   贵州省铜仁市
6666666666666666666666666666
回复 支持 反对

使用道具 举报

发表于 2023-3-26 03:53:04 | 显示全部楼层   新疆维吾尔自治区乌鲁木齐市
非常感谢分享
回复 支持 反对

使用道具 举报

发表于 2023-2-17 20:38:37 | 显示全部楼层   江西省赣州市
@haifutw 能发现一下源码吗
虽然网上有开源的,但是我看不懂(不知道为什么算出来的答案不一样)
地址:https://bbs.kanxue.com/thread-120018.htm
[Visual Basic] 纯文本查看 复制代码
'*************************************************************************
'**模 块 名:mCRC
'**说    明:E_mail:xa04@qq.com 版权所有2008 - 2009(C)1
'**创 建 人:瞧红尘
'**日    期:2010-09-03 02:19:08
'**修 改 人:
'**日    期:
'**描    述:
'**版    本:V1.0.0
'*************************************************************************
Option Explicit
 
 
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, Optional ByVal Length As Long = 4)
 
Private Type t_CRCdata
    num1 As Byte
    num2 As Byte
    num3 As Byte
    num4 As Byte
End Type
 
' ******************** CRC32编码 与 编辑 ********************
'第一参数传入字节数组,
'第二个写偏移覆盖(覆盖掉4字节),
'第三个写你想反回个什么样的crc,
'四个就是你的返回值
Public Function CRC32Edit(pByte() As Byte, _
                        Optional lOffset As Long = -1, _
                        Optional lCRC32 As Long, _
                        Optional retlCRC As Long) As String
                        
    Dim crc32Result As Long
    Dim i           As Long
    Dim j           As Long
    Dim dwCrc       As Long
    Dim iLookup     As Long
    Dim Lb          As Long
    Dim Ub          As Long
 
    Dim Buffer()    As Byte
    Dim Buffer2()   As Byte
    Dim k           As Long
    Dim cr1         As t_CRCdata
    Dim cr2         As t_CRCdata
 
    '常数
    Const Num0           As Long = &H0
    Const Num1           As Long = &H1
    Const Num2           As Long = &H2
    Const Num8           As Long = &H8
    Const Num255         As Long = &HFF
    Const Num256         As Long = &H100
    Const Num16777215    As Long = &HFFFFFF
    Const dwPolynomial   As Long = &HEDB88320
    Const Num2147483647  As Long = &H7FFFFFFF
    Const NumNegative1   As Long = &HFFFFFFFF
    Const NumNegative2   As Long = &HFFFFFFFE
    Const NumNegative256 As Long = &HFFFFFF00
 
    'CRC32表
    Dim crc32Table(&HFF) As Long
    Dim CRCdata(255) As t_CRCdata
    
    '初始化CRC32表*****************************
    For i = Num0 To Num255
        dwCrc = i
        For j = Num8 To Num1 Step NumNegative1
            If (dwCrc And Num1) Then
                dwCrc = ((dwCrc And NumNegative2) \ Num2) And Num2147483647
                dwCrc = dwCrc Xor dwPolynomial
            Else
                dwCrc = ((dwCrc And NumNegative2) \ Num2) And Num2147483647
            End If
        Next
        crc32Table(i) = dwCrc
        CopyMemory CRCdata(i), crc32Table(i)
    Next
    crc32Result = NumNegative1  '初始化
 
    If lOffset < 0 Then
        lOffset = UBound(pByte) + 1
    Else
        If lOffset > UBound(pByte) Then
            lOffset = UBound(pByte) + 1
        End If
    End If
        
    If lOffset > 0 Then
        ReDim Buffer(lOffset - 1)
 
        CopyMemory Buffer(0), pByte(0), lOffset   '数据拷贝
        'Debug.Print "lOffset:", lOffset
        
        '计算CRC32码*******************************
        Lb = LBound(Buffer)
        Ub = UBound(Buffer)
        For i = Lb To Ub
            iLookup = (crc32Result And Num255) Xor Buffer(i)  '第四位 xor 新字节
            crc32Result = ((crc32Result And NumNegative256) \ Num256) And Num16777215 '前三位
            crc32Result = crc32Result Xor crc32Table(iLookup) '前三位*3 xor 表(第四位*1 xor 新字节*1)*4
        Next i
    End If
        
    CRC32Edit = Hex$(Not (crc32Result))    '计算前面的crc值,返回是什么样的
        
    '计算后面的
    k = UBound(pByte) - lOffset - 3
    If k > 0 Then   '后面是否有数据
        ReDim Buffer2(k - 1)
        CopyMemory Buffer2(0), pByte(lOffset + 4), k
        k = Not (lCRC32)
        CopyMemory cr1, k
        '反向CRC计算
 
        For j = UBound(Buffer2) To 0 Step -1
            For i = 0 To 255
                If cr1.num4 = CRCdata(i).num4 Then
                    Exit For
                End If
            Next
            If i > 255 Then
                Debug.Assert False
            End If
            
            cr1.num4 = cr1.num3 Xor CRCdata(i).num3
            cr1.num3 = cr1.Num2 Xor CRCdata(i).Num2
            cr1.Num2 = cr1.Num1 Xor CRCdata(i).Num1
            cr1.Num1 = i Xor Buffer2(j)
        Next
    Else
        k = Not (lCRC32)
        CopyMemory cr1, k
    End If
    '要得出文件CRC值=lCRC32  之前部分的CRC必须满足的条件:cr1的值
 
    '计算
    For j = 0 To 3
        For i = 0 To 255
            If cr1.num4 = CRCdata(i).num4 Then
                Exit For
            End If
        Next
'        If i > 255 Then
'            Debug.Assert False
'        End If
        
        cr1.num4 = cr1.num3 Xor CRCdata(i).num3
        cr1.num3 = cr1.Num2 Xor CRCdata(i).Num2
        cr1.Num2 = cr1.Num1 Xor CRCdata(i).Num1
        cr1.Num1 = i
    Next
    
    CopyMemory k, cr1
    k = k Xor crc32Result
    
    retlCRC = k '计算出来的是4字节覆盖的值,不是crc
End Function
回复 支持 反对

使用道具 举报

发表于 2023-2-17 04:26:12 | 显示全部楼层   河北省石家庄市
这个有点吓人6666666666
回复 支持 反对

使用道具 举报

签到天数: 7 天

发表于 2023-2-2 16:15:48 | 显示全部楼层   湖南省衡阳市
感谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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