首页
社区
课程
招聘
[求助]单向CRC求逆可行不
发表于: 2015-9-23 11:05 6401

[求助]单向CRC求逆可行不

2015-9-23 11:05
6401
遇到一CRC转化算法,输入是8字节数组,输出是个dword。算法如下:
int __stdcall myCRC(char * in)
{
  signed int i; 
  char * chBuf; 
  int out; 
  int outa;

  out = 0;
  chBuf = in;
  for ( i = 0; i < 8; ++i )
  {
    outa = 16 * out;  //左移四位
    if ( isalpha(*(_BYTE *)chBuf) ) //判断是不是字符
      out = outa + *(_BYTE *)chBuf++ - 55;
    else
      out = outa + *(_BYTE *)chBuf++ - 48;
  }
  return out;
}


我知道对于一个dword,比如0x1a8b2d5f,可能有很多8字节字符串执行此函数结果都是它。现在我只需要其中一个字符串来控制校验结果就行,不知道有没有啥办法?

如果dword结果为纯数字非常简单,比如0x12345678,其输入字符串设置成"12345678"就行了。但是如果有字符,就不知道该怎么弄了。

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 293
活跃值: (287)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <stdlib.h>


int __stdcall myCRC(unsigned char * chBuf)
{
    int out = 0;
    for ( int i = 0; i < 8; ++i )
    {
        if ( isalpha(chBuf[i]) ) 
            out = (out<<4) + chBuf[i] - 55;
        else
            out = (out<<4) + chBuf[i] - 48;
    }
    return out;
}


unsigned char* __stdcall myValue(unsigned int ival, unsigned char* outbuf, int rann = 30)
{
    int out = 0, i = 0;
    int tival = ival;

    for (i=8; i>0; i--)
    {
        unsigned int tmpval = tival + 55;
        unsigned char tv = (tmpval&0xF);
        tmpval = tmpval>>4;
        tv = tv + (((tmpval&0xF)-rann)<<4);

        if (isalpha(tv))
        {
            outbuf[i-1] = tv;
        }
        else
        {
            outbuf[i-1] = tv - 7;
        }
        tival = (tival+55-outbuf[i-1])>>4;
    }
    if ( ival != myCRC(outbuf) )
    {
        // 如果不行,换一个key 
        return myValue(ival, outbuf, rann+1);
    }
    return outbuf;
}


int main(int argc, char* argv[])
{
    unsigned char buf[8] = {0};
    srand(time(NULL));
    
    for (int i=0; i<999999; i++)
    {
        for (int j=0; j<8; j++)
        {
            buf[j] = rand()&0xFF;
        }
        
        int vv = myCRC(buf);

        myValue(vv, buf);

        if (myCRC(buf) != vv)
        {
            printf("No OK!\n");
        }
    }
    
	return 0;
}
2015-9-23 14:41
0
雪    币: 393
活跃值: (150)
能力值: (RANK:110 )
在线值:
发帖
回帖
粉丝
3
感谢大牛!
2015-9-24 09:14
0
雪    币: 129
活跃值: (1095)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
http://www.21ic.com/tools/HotWC3_V1.11.html

HotWC3最大的特点是有可逆运算!!!
很少见有可逆的CRC运算器。
2015-9-26 15:58
0
游客
登录 | 注册 方可回帖
返回
//