/*  Phone Code by IMEI
    For Panasonic GD55 & ST55

    Insert support for Siemens ST55 by SEN

    Reversing from PhoneLock Generator v 1.0 for Siemens GD50
    by SEN (aka sendel in www.siemen-club.ru)
    sendel2000@hotbox.ru
    (C)VIOLATORS group. 1995-2003


    Tanx to gsmhosting  forum
         claudio_gsm,
         Victor;

    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 code, int model);

int main(int argc, char* argv[])
{
 // char *argv[2]={{""},{"351736001800261"}};
  //char *argv[2]={{""},{"351736001465461"}};
  int model;
  printf("Siemens ST55 UNLOCK-ALL FINDED SEED BY SEN\n");
  printf("Panasonic GD55 UNLOCK ALL\n");

  if (argc<2)
 {
  printf("USAGE: for Siemens ST55: %s <IMEI> \n for Panasonic GD55: %s <IMEI> GD55 \n\n",argv[0],argv[0]);
//  exit(0);
 }

 if (argc<3)
 model=2;
 else
 model=1;



  printf("Code for NCKKN is   : **00012*");
  IMEI_code(argv[1],"NCKKN",2,model);
  printf("#\n");

  printf("Code for NCKKN-2 is : **00013*");
  IMEI_code(argv[1],"NCKKN",1,model);
  printf("#\n");

  printf("Code for NSCKN is   : **00022*");
  IMEI_code(argv[1],"NSCKN",2,model);
  printf("#\n");

  printf("Code for NSCKN-2 is : **00023*");
  IMEI_code(argv[1],"NSCKN",1,model);
  printf("#\n");


    printf("Code for SPCKS is   : **00032*");
  IMEI_code(argv[1],"SPCKS",2,model);
  printf("#\n");

      printf("Code for SPCKS-2 is : **00033*");
  IMEI_code(argv[1],"SPCKS",1,model);
  printf("#\n");


    printf("Code for CKCCK is   : **00042*");
  IMEI_code(argv[1],"CKCCK",2,model);
  printf("#\n");

    printf("Code for CKCCK-2 is : **00043*");
  IMEI_code(argv[1],"CKCCK",1,model);
  printf("#\n");



  printf("Code for PCKKP-2 is : **00052*");
  IMEI_code(argv[1],"PCKKP",2,model);
  printf("#\n");


    printf("Code for PCKKP is   : **00053*");
  IMEI_code(argv[1],"PCKKP",1,model);
  printf("#\n");



}


int IMEI_code(char* IMEI, char *std, int code, int model)
{

 //IMEI here
 //char IMEI[]="351736001251143";
 //char *IMEI=argv[1];

 char IMEI_PATCH[17],IMEI74[17],IMEI9C[17];
 char IMEICC[65];
 //char std[]="PCKKP";
// char std1[]="ME2";
 char std1[4];
 char gd55[]="VE1";

 //any may----

 //char st55[]="OE2";
  char st55[]="CE2";
 //char std2[]="PCKKP";
 char dest[16];//std3[]="DG1";
 int b=0;
 int i;

 if(model==1)
   strcpy(std1,gd55);
 else
   strcpy(std1,st55);


//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,std);
  strcat(dest,std1);

//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%5)
{
 default:
 case 0:
  for(i=0;i<8;i++)
 IMEICC[i*4]=(((IMEI74[i*2]&dest[i*2])|IMEI9C[i*2])&IMEI9C[i*2])%10;

 for(i=0;i<8;i++)
  IMEICC[(i+16)*4]=(((IMEI74[i*2+1]&dest[i*2+1])|IMEI9C[i*2+1])&IMEI9C[i*2+1])%10;
 break;
 case 1:
  for(i=0;i<8;i++)
 IMEICC[i*4]=(IMEI74[i*2]|dest[i*2]|IMEI9C[i*2]|IMEI9C[i*2])%10;

 for(i=0;i<8;i++)
  IMEICC[(i+16)*4]=(IMEI74[i*2+1]|dest[i*2+1]|IMEI9C[i*2+1]|IMEI9C[i*2+1])%10;

 break;

 case 2:
  for(i=0;i<8;i++)
 IMEICC[i*4]=((IMEI74[i*2]|dest[i*2])&IMEI9C[i*2]|IMEI9C[i*2])%10;

 for(i=0;i<8;i++)
  IMEICC[(i+16)*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;

 for(i=0;i<8;i++)
  IMEICC[(i+16)*4]=((IMEI74[i*2+1]|dest[i*2+1]|IMEI9C[i*2+1])&IMEI9C[i*2+1])%10;

break;
 case 4:
  for(i=0;i<8;i++)
 IMEICC[i*4]=((IMEI74[i*2]&dest[i*2])|IMEI9C[i*2]|IMEI9C[i*2])%10;

 for(i=0;i<8;i++)
  IMEICC[(i+16)*4]=((IMEI74[i*2+1]&dest[i*2+1])|IMEI9C[i*2+1]|IMEI9C[i*2+1])%10;





}

//PRINT CODE
/*  for(i=0;i<8;i++)
   printf("%d",IMEICC[(i+16)*4]);
   printf(":");
  for(i=0;i<8;i++)
   printf("%d",IMEICC[i*4]);*/

if(code==1)
 for(i=0;i<8;i++)
  printf("%d",IMEICC[(i+16)*4]);
else
 for(i=0;i<8;i++)
  printf("%d",IMEICC[i*4]);
  

}
//---------------------------------------------------------------------------
