首页
社区
课程
招聘
[己解决]根据CRC32值,是否能够快速获得其原始值?
发表于: 2008-6-18 08:32 15211

[己解决]根据CRC32值,是否能够快速获得其原始值?

2008-6-18 08:32
15211

有一个CRC32的值,是否能够快速获取其原始值?
CRC是多对一映射,能够回复其中的n个就可以了

查了一些资料,没找到其源码,恳请大侠指教


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (17)
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
看看王小云的MD5破解论文 你会受益匪浅的
2008-6-18 10:39
0
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
3
除了穷举好像没别的好办法了吧。
2008-6-18 12:40
0
雪    币: 11705
活跃值: (975)
能力值: ( LV12,RANK:779 )
在线值:
发帖
回帖
粉丝
4
由crchead, crcfinal可快速得出1个32bit的值,这个32 bit是可逆的。
附件是我写的一个工具。
比如:
crchead =  0xFFFFFFFF;
crcfianl = 0xDEADBEEF;
5 byte, 每个byte范围 0 - FF,
则符合值为:
004E3726D4
01D80721A3
026256283A
...
FE55E8238E
FFC3D824F9

它们的crc都是
0xDEADBEEF

参考:
http://www.pediy.com/bbshtml/BBS6/pediy6937.htm
上传的附件:
2008-6-18 17:04
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
5
太强了, 膜拜
2008-6-18 17:54
0
雪    币: 47147
活跃值: (20460)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
6
这工具收下来了,准备更新到主页上去
2008-6-18 19:27
0
雪    币: 205
活跃值: (171)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
强人,我看鬼子的软件实现了这样的算法,在网上也找到了一些e文资料,正琢磨是啃资料还是逆向哪个更省劲呢。没想到您已经做的这么完美了,谢谢您的工具,也谢谢能所给的引用,它比消化哪个e文资料轻松多了。
2008-6-18 22:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
认真学习一下
2008-6-19 09:33
0
雪    币: 590
活跃值: (177)
能力值: ( LV9,RANK:680 )
在线值:
发帖
回帖
粉丝
9
还用不到,但是以后用得着时就方便了,呵呵,谢谢,收下了!
2008-6-19 11:40
0
雪    币: 114
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼上的头像好像在哪见过.
2008-6-19 13:04
0
雪    币: 205
活跃值: (171)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
那篇引用帖子不是太好琢磨啊,兄弟能否给发一份crc 求逆的代码?
2008-6-19 16:34
0
雪    币: 11705
活跃值: (975)
能力值: ( LV12,RANK:779 )
在线值:
发帖
回帖
粉丝
12
下面是crc32/ crc16求逆的代码。
其实就是DonQuixote的: CRC32碰撞的实现。做了以下改进。
以前看过一个软件注册算法用到了crc16的逆,crc16的逆就更简单了。

全部采用的查表法,速度较快。
首先构造tab/ rf_tab。rf_tab是求逆的表。

typedef unsigned char      BYTE;
typedef unsigned short     WORD;
typedef unsigned int       DWORD;

#define LOWORD(l)           ((WORD)(l))
#define HIWORD(l)           ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
#define LOBYTE(w)           ((BYTE)(w))
#define HIBYTE(w)           ((BYTE)(((WORD)(w) >> 8) & 0xFF))
#define MAKEWORD(a, b)      ((WORD)(((BYTE)(a)) | ((WORD)((BYTE)(b))) << 8))
#define MAKEDWORD(a, b)     ((DWORD)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))

#define MakeWord(a,b)    MAKEWORD(b,a)
#define MakeDWord(a,b)   MAKEDWORD(b,a)

// crc32/ crc16 funs
#define CRC32_NEW   (0xFFFFFFFFUL)
#define CRC32_POLY  (0xEDB88320UL)
#define CRC16_NEW   (unsigned short)(0xFFFF)
#define CRC16_POLY  (unsigned short)(0x8408)
#define CRC16_STD_POLY  (unsigned short)(0xA001)

unsigned int crc32_tab[256];
unsigned short crc16_tab[256];

unsigned char crc32_rf[256];
unsigned char crc16_rf[256];

void init_crc32_table(unsigned int poly)
{
    unsigned int i,j;
    unsigned int crc;
    for( i = 0; i < 256; i ++ ) {
        crc = i;
        for( j = 0; j < 8; j ++ ){
            if(crc & 1) crc = (crc >> 1) ^ poly;
            else crc >>= 1;
        }
        crc32_tab[i] = crc;
    }
    return;
}

void init_crc32_rf_table(void)
{
    unsigned int i,j;
   
    for(i=0; i<256; i++) {
        j = HIBYTE(HIWORD(crc32_tab[i]));
        crc32_rf[j] = i;
    }
    return;
}

/* must init_crc32_rf_table() first */
#define RF(x)   crc32_rf[(BYTE) x]
#define F(x)    HIBYTE(HIWORD(crc32_tab[(BYTE) x]))
#define G(x)    LOBYTE(HIWORD(crc32_tab[(BYTE) x]))
#define H(x)    HIBYTE(LOWORD(crc32_tab[(BYTE) x]))
#define I(x)    LOBYTE(LOWORD(crc32_tab[(BYTE) x]))

/*
given crc_head = ABCD
find abcd;
that crc(abcd) = WXYZ
*/
unsigned int rCRC32(unsigned int WXYZ,unsigned int ABCD)
{
    BYTE p,o,n,m,a,b,c,d,W,X,Y,Z,A,B,C,D;
   
    W=HIBYTE(HIWORD(WXYZ));
    X=LOBYTE(HIWORD(WXYZ));
    Y=HIBYTE(LOWORD(WXYZ));
    Z=LOBYTE(LOWORD(WXYZ));
   
    A=HIBYTE(HIWORD(ABCD));
    B=LOBYTE(HIWORD(ABCD));
    C=HIBYTE(LOWORD(ABCD));
    D=LOBYTE(LOWORD(ABCD));
   
    p=crc32_rf[W];
    o=crc32_rf[(BYTE) (X^G(p))];
    n=crc32_rf[(BYTE) (Y^G(o)^H(p))];
    m=crc32_rf[(BYTE) (Z^G(n)^H(o)^I(p))];
   
    d=m^D;
    c=n^C^I(m);
    b=o^B^H(m)^I(n);
    a=p^A^G(m)^H(n)^I(o);   
    return MakeDWord(MakeWord(a,b),MakeWord(c,d));
}

#define FF(x)  HIBYTE(crc16_tab[(unsigned char)x])
#define GG(x)  LOBYTE(crc16_tab[(unsigned char)x])

void init_crc16_table(unsigned short poly)
{
    unsigned int i,j;
    unsigned short crc;
    for( i = 0; i < 256; i ++ ) {
        crc = i;
        for( j = 0; j < 8; j ++ ){
            if(crc & 1) crc = (crc >> 1) ^ poly;
            else crc >>= 1;
        }
        crc16_tab[i] = crc;
    }
    return;
}

void init_crc16_rf_table(void)
{
    unsigned int i,j;
   
    for(i=0; i<256; i++) {
        j = HIBYTE(crc16_tab[i]);
        crc16_rf[j] = i;
    }
    return;
}

unsigned short rCRC16(unsigned short XY, unsigned short AB)
{
    BYTE X,Y,A,B,a,b,m,n;
   
    X=HIBYTE(XY);
    Y=LOBYTE(XY);
    A=HIBYTE(AB);
    B=LOBYTE(AB);
   
    n=crc16_rf[X];
    m=crc16_rf[(BYTE) (Y^GG(n))];
   
    b=m^B;
    a=n^A^GG(m);
    return MakeWord(a,b);
}
2008-6-19 21:49
0
雪    币: 11705
活跃值: (975)
能力值: ( LV12,RANK:779 )
在线值:
发帖
回帖
粉丝
13
前面的crc3x是可以指定范围的。

比如12字节,len=12
范围
'1' - '9'
CHAR:
0x31 - 0x39
想要多少个,NUM填示例数目。
比如我要5个实例,num = 5.

crc32 = 0x12345678

数据会自动保存在 crc32x-yyyymmdd-hh-mm.txt

CRC32x-20080619-2208.txt
116534385183
126488432389
131875263511
177354617145
188428597511
2008-6-19 22:02
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢你的分享
说说我的理解
文章所说的意思是:
x: CRCSTart
y: 要计算CRC值的目标数
z: 最终的CRC值
x,y,z 是int32

只要知道 x,y,z的任两个,都可以快速的求出余下的一个,我验证了以下那个程序,确实是这样

但是如何能够做到指定范围呢?如要求其逆是可见字符?正如你的工具所实现的那样
2008-6-20 09:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
膜拜强人,学习一下
2008-6-20 10:18
0
雪    币: 205
活跃值: (171)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
终于看明白了,看来脑子长久不思考真的会生锈!还是要经常磨磨的
2008-6-20 16:49
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
不错!学习一下!谢谢!
2008-6-23 12:16
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
18
膜拜一下。回头看发展一个MD5的,以后根据一个MD5值争取把一个DVD给还原出来
2008-6-23 18:57
0
游客
登录 | 注册 方可回帖
返回
//