⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genfunc.c

📁 简单的蚂蚁下载
💻 C
📖 第 1 页 / 共 2 页
字号:
  a = ((a << 0x06) | (a >> 0x1a)) + b; 
  d = ((~c | a) ^ b)  + le2me_32(*((uint32_t*)(param+0x2c))) + d - 0x42C50DCB;
  d = ((d << 0x0a) | (d >> 0x16)) + a; 
  c = ((~b | d) ^ a)  + le2me_32(*((uint32_t*)(param+0x08))) + c + 0x2AD7D2BB;
  c = ((c << 0x0f) | (c >> 0x11)) + d; 
  b = ((~a | c) ^ d)  + le2me_32(*((uint32_t*)(param+0x24))) + b - 0x14792C6F;
  b = ((b << 0x15) | (b >> 0x0b)) + c; 

#ifdef LOG
  printf("real: hash output: %x %x %x %x\n", a, b, c, d);
#endif
  
  a += le2me_32(*((uint32_t *)(field+0)));
  *((uint32_t *)(field+0)) = le2me_32(a);
  b += le2me_32(*((uint32_t *)(field+4)));
  *((uint32_t *)(field+4)) = le2me_32(b);
  c += le2me_32(*((uint32_t *)(field+8)));
  *((uint32_t *)(field+8)) = le2me_32(c);
  d += le2me_32(*((uint32_t *)(field+12)));
  *((uint32_t *)(field+12)) = le2me_32(d);

#ifdef LOG
  printf("real: hash field:\n");
  hexdump(field, 64+24);
#endif
}

static void call_hash (char *key, char *challenge, int len) 
{
  uint32_t *ptr1, *ptr2;
  uint32_t a, b, c, d;
  uint32_t tmp;

  ptr1=(uint32_t*)(key+16);
  ptr2=(uint32_t*)(key+20);
  
  a = le2me_32(*ptr1);
  b = (a >> 3) & 0x3f;
  a += len * 8;
  *ptr1 = le2me_32(a);
  
  if (a < (len << 3))
  {
#ifdef LOG
    printf("not verified: (len << 3) > a true\n");
#endif
    ptr2 += 4;
  }

  tmp = le2me_32(*ptr2);
  tmp += (len >> 0x1d);
  *ptr2 = le2me_32(tmp);
  a = 64 - b;
  c = 0;  
  if (a <= len)
  {

    memcpy(key+b+24, challenge, a);
    hash(key, key+24);
    c = a;
    d = c + 0x3f;
    
    while ( d < len ) {

#ifdef LOG
      printf("not verified:  while ( d < len )\n");
#endif
      hash(key, challenge+d-0x3f);
      d += 64;
      c += 64;
    }
    b = 0;
  }
  
  memcpy(key+b+24, challenge+c, len-c);
}
static void calc_response (char *ret, char *field) {

  char buf1[128];
  char buf2[128];
  int i;

  memset (buf1, 0, 64);
  *buf1 = 128;
  
  memcpy (buf2, field+16, 8);
  
  i = ( le2me_32(*((uint32_t*)(buf2))) >> 3 ) & 0x3f;
 
  if (i < 56) {
    i = 56 - i;
  } else {
#ifdef LOG
    printf("not verified: ! (i < 56)\n");
#endif
    i = 120 - i;
  }

  call_hash (field, buf1, i);
  call_hash (field, buf2, 8);

  memcpy (ret, field, 16);

}

static void calc_response_string (char *result, char *challenge) {
 
  char field[128];
  char zres[20];
  int  i;
      
  /* initialize our field */
  BE_32C (field,      0x01234567);
  BE_32C ((field+4),  0x89ABCDEF);
  BE_32C ((field+8),  0xFEDCBA98);
  BE_32C ((field+12), 0x76543210);
  BE_32C ((field+16), 0x00000000);
  BE_32C ((field+20), 0x00000000);

  /* calculate response */
  call_hash(field, challenge, 64);
  calc_response(zres,field);
 
  /* convert zres to ascii string */
  for (i=0; i<16; i++ ) {
    char a, b;
    
    a = (zres[i] >> 4) & 15;
    b = zres[i] & 15;

    result[i*2]   = ((a<10) ? (a+48) : (a+87)) & 255;
    result[i*2+1] = ((b<10) ? (b+48) : (b+87)) & 255;
  }
}

void real_calc_response_and_checksum (char *response, char *chksum, char *challenge) 
{
  int   ch_len, table_len, resp_len;
  int   i;
  char *ptr;
  char  buf[128];

  /* initialize return values */
  memset(response, 0, 64);
  memset(chksum, 0, 34);

  /* initialize buffer */
  memset(buf, 0, 128);
  ptr=buf;
  BE_32C(ptr, 0xa1e9149d);
  ptr+=4;
  BE_32C(ptr, 0x0e6b3b59);
  ptr+=4;

  /* some (length) checks */
  if (challenge != NULL)
  {
    ch_len = strlen (challenge);

    if (ch_len == 40) /* what a hack... */
    {
      challenge[32]=0;
      ch_len=32;
    }
    if ( ch_len > 56 ) ch_len=56;
    
    /* copy challenge to buf */
    memcpy(ptr, challenge, ch_len);
  }
  
  if (sdd_XorTable != NULL)
  {
    table_len = strlen(sdd_XorTable);

    if (table_len > 56) table_len=56;

    /* xor challenge bytewise with sdd_XorTable */
    for (i=0; i<table_len; i++)
      ptr[i] = ptr[i] ^ sdd_XorTable[i];
  }

  calc_response_string (response, buf);

  /* add tail */
  resp_len = strlen (response);
  strcpy (&response[resp_len], "01d0a8e3");

  /* calculate checksum */
  for (i=0; i<resp_len/4; i++)
    chksum[i] = response[i*4];
}
int GetStartText(char *buf,int sizebuf)
{
    int i;
	//?buf[i + 1] will overflow when i eq (sizebuf - 1)
	//for(i = 0;i <= sizebuf-1;++i)
    for(i = 0;i <= sizebuf-2;++i)
	{
        if(buf[i]=='\n'&&
		  !(buf[i+1] >= 'a'&&buf[i+1] <= 'z'||
			buf[i+1] >= 'A'&&buf[i+1] <= 'Z'))break;
  
    }
    return i+3;
}


int ReadEn(int sock,int n)
{
    fd_set rfdset;
    struct timeval tv;
    tv.tv_sec=n;
    tv.tv_usec=0;
    int readen=0;
    FD_ZERO(&rfdset);
    FD_SET(sock,&rfdset);
    
    readen=select(sock+1,&rfdset,NULL,NULL,&tv);

    return readen;
}

int ConnectHttp(char* host,int iport)
{
    int sd;
    struct sockaddr_in pin;
    struct hostent *nlp_host;

    if((nlp_host = gethostbyname(host))==0)
		sdd_ErrReturn("Error resolving local host\n",0);

    bzero(&pin,sizeof(pin));
    pin.sin_family = AF_INET;
    pin.sin_addr.s_addr = ((struct in_addr*)(nlp_host->h_addr))->s_addr;
    pin.sin_port = htons(iport);
    
    if((sd=socket(PF_INET,SOCK_STREAM,0))==-1)
		sdd_ErrReturn("Error opening socket\n",0);
    if(connect(sd,(struct sockaddr*)&pin,sizeof(pin))==-1)
		sdd_ErrReturn("Error connecting to socket\n",0);

    return sd;
}
//obsolete name
//int GetThreadSize(void)
int GetThreadSize(void){    int threadsize;    int ntemp;    int i;    if((threadsize=(filelength/nthread))>=2048){        ntemp=threadsize/2048;        threadsize=ntemp*2048;    }    else{        threadsize=2048;//the least size of each thread        for(i=1;i<=nthread;i++){	  if(i*threadsize>=filelength){	      nthread=i;	      break;	  }        }    }    return threadsize;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -