/*  Phone Code by IMEI
    For Siemens CL50

    Reversing from PhoneLock Generator v 1.0 for Siemens CL50
    by SEN (aka sendel in www.siemen-club.ru)
    sendel2000@hotbox.ru
    (C)VIOLATORS group. 1995-2003


    HELP ME!!! I want make it for ALL SIEMENS:)))

    Sources: C++ Builder
    for other C must change header
*/

//---------------------------------------------------------------------------

#pragma hdrstop

//---------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <windows.h>
#pragma argsused
int IMEI_code(char* IMEI, char *std);

int main(int argc, char* argv[])
{
  printf("CL 50 UNLOCK ALL\n");
  if (argc<2)
 {
  printf("USAGE: %s <IMEI>",argv[0]);
  exit(0);
 }
  printf("Code for NCKKN is : **00012*");
  IMEI_code(argv[1],"NCKKN");
  printf("#\n");


  printf("Code for NSCKN is : **00022*");
  IMEI_code(argv[1],"NSCKN");
  printf("#\n");

    printf("Code for SPCKS is : **00032*");
  IMEI_code(argv[1],"SPCKS");
  printf("#\n");

    printf("Code for CKCCK is : **00042*");
  IMEI_code(argv[1],"CKCCK");
  printf("#\n");

    printf("Code for PCKKP is : **00053*");
  IMEI_code(argv[1],"PCKKP");
  printf("#\n");



}


int IMEI_code(char* IMEI, char *std)
{

 //IMEI here
 //char IMEI[]="351736001251143";
 //char *IMEI=argv[1];

 char IMEI_PATCH[17],IMEI74[17],IMEI9C[17];
 char IMEICC[33];
 //char std[]="PCKKP";
 char std1[]="DG1";
 //char std2[]="PCKKP";
 char dest[16];//std3[]="DG1";
 int b=0;
 int i;




//init date   ------------------------
 for (i=0;i<16;i++)
   dest[i]=0;


 for (i=0;i<37;i++)
  IMEICC[i]=0;

  strcpy(dest,std1);
//end init date  --------------------



 for(i=0;i<8;i++)
 {
  b+=IMEI[i+6];
  IMEI_PATCH[i]=IMEI[i+6];
 }
 //printf("%x\n",b);
 for(i=0;i<8;i++)
 {
  IMEI_PATCH[i+8]=0x64-IMEI_PATCH[i];
 }

//это нули в конец массивов
//nulls for end array
//aka IMEI_PATCH[9]=0;
//Not used
//Не используем:)

int var50=0;
IMEI_PATCH[16]=0;

// printf("%s\n",IMEI_PATCH);


switch(b%3)
{
 default:
 case 0: for(i=0;i<16;i++)
 {
  IMEI74[i]=IMEI_PATCH[i];
 };break;

//0x1  Реверсирование (REVERSING)
 case 1: for(i=0;i<16;i++)
 {
  IMEI74[15-i]=IMEI_PATCH[i];
 };break;
//0x2
  case 2:
 for(i=0;i<16;i++)
 {
  if(!(i%2)) //Проверка на четность (is i/2 ???)
  {
    IMEI74[i]=IMEI_PATCH[i+1];
  }
  else
  {
  IMEI74[i]=IMEI_PATCH[i-1];
  }
 };


}


  strcat(dest,std);
  strcat(dest,std1);
  strcat(dest,std);

//printf("HASH: %s\n",dest);

for(i=0;i<16;i++)
{
 IMEI9C[i]=(IMEI74[i]+dest[i])%100;
}

//printf("%s\n",IMEI74);
//printf("%s\n",IMEI9C);
IMEI74[16]=0;
IMEI9C[16]=0;

//это нули в конец массивов
//nulls for end array
int var64=0,var78=0,var8c=0;

switch(b%10)
{
 case 1:
 for(i=0;i<8;i++)
{
 IMEICC[i*4]=(IMEI74[i*2]|dest[i*2]|IMEI9C[i*2]|IMEI9C[i*2])%10;
}
 break;
 case 2:
  for(i=0;i<8;i++)
{
 IMEICC[i*4]=(IMEI74[(i*2)+1]|dest[(i*2)+1]|IMEI9C[(i*2)+1]|IMEI9C[(i*2)+1])%10;
}
  break;
 case 3:
  for(i=0;i<8;i++)
{
 IMEICC[i*4]=((IMEI74[i*2]|dest[i*2])&IMEI9C[i*2]|IMEI9C[i*2])%10;
}
break;
 case 4:
 for(i=0;i<8;i++)
{

 IMEICC[i*4]=((IMEI74[(i*2)+1]|dest[(i*2)+1])&IMEI9C[(i*2)+1]|IMEI9C[(i*2)+1])%10;
}
 break;
 case 5:
 for(i=0;i<8;i++)
{
 IMEICC[i*4]=((IMEI74[i*2]|dest[i*2]|IMEI9C[i*2])&IMEI9C[i*2])%10;
}
 break;
 case 6:
 for(i=0;i<8;i++)
{
 IMEICC[i*4]=((IMEI74[(i*2)+1]|dest[(i*2)+1]|IMEI9C[(i*2)+1])&IMEI9C[(i*2)+1])%10;
}
 break;
 case 7:
 for(i=0;i<8;i++)
{
  IMEICC[i*4]=((IMEI74[i*2]&dest[i*2])|IMEI9C[i*2]|IMEI9C[i*2])%10;
}
 break;
 case 8:
 for(i=0;i<8;i++)
{
 IMEICC[i*4]=((IMEI74[(i*2)+1])&dest[(i*2)+1]|IMEI9C[(i*2)+1]|IMEI9C[(i*2)+1])%10;
}
 break;
 case 9:
 for(i=0;i<8;i++)
{
 IMEICC[i*4]=(((IMEI74[i*2]&dest[i*2])|IMEI9C[i*2])&IMEI9C[i*2])%10;
}
 break;
 default:
  for(i=0;i<8;i++)
{
 IMEICC[i*4]=(((IMEI74[(i*2)+1]&dest[(i*2)+1])|IMEI9C[(i*2)+1])&IMEI9C[(i*2)+1])%10;
}

}

//printf("CODE is ");
 for(i=0;i<8;i++)
  printf("%d",IMEICC[i*4]);


}
//---------------------------------------------------------------------------
