From Sexy Stork, 4 Years ago, written in C.
Embed
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdarg.h>
  4. #include <stdlib.h>
  5.  
  6. //#include "calcimei.h"
  7.  
  8. #define OUT_FILE "MP0B_001_NEW"
  9.  
  10. int main(int argc, char *argv[])
  11. {
  12.     char *str = "357369035621901";
  13.  
  14.  
  15.     FILE* output;
  16.     char inp_imei[15];
  17.     char out_imei[12] = {0};
  18.     int i, ret;
  19.     char *mode;
  20.  
  21.     if (argc < 2 || strlen(argv[1])!=15 || (argc==3 && strlen(argv[2])!=15))
  22.     {
  23.         fprintf(stdout, "Use: %s <IMEI_1 15 digits> [IMEI_2 15 digits]\n", argv[0]);
  24.         return 1;
  25.     }
  26.     for (i=1; i < argc; i++)
  27.     {
  28.         memset(inp_imei, 0, sizeof(inp_imei));
  29.         memset(out_imei, 0, sizeof(out_imei));
  30.  
  31.         strncpy(inp_imei, argv[i], sizeof(inp_imei));
  32.  
  33.         fprintf(stdout, "New IMEI %d (15 digits):%s\n", i, inp_imei);
  34.  
  35.         ret = calc_imei(&inp_imei, &out_imei);
  36.         if ( ret )
  37.         {
  38.             fprintf(stderr, "Invalid IMEI %d format!\n", i);
  39.             return 1;
  40.         }
  41.  
  42.         mode="w";
  43.         if (i==2)
  44.         {
  45.             mode="a";
  46.         }
  47.         output = fopen(OUT_FILE, mode);
  48.         fwrite(out_imei, 1, sizeof(out_imei), output);
  49.         fclose(output);
  50.  
  51.     }
  52.  
  53.  
  54.     fprintf(stdout, "New IMEI in file = %s\n", OUT_FILE);
  55.  
  56.     return 0;
  57. }
  58. int calc_imei(char inp_imei[15], char out_imei[12])
  59. {
  60.     char out_mask[12] = {0xAB, 0xA0, 0x6F, 0x2F, 0x1F, 0x1E, 0x9A, 0x45, 0x0, 0x0, 0x0, 0x0};
  61.     int i=0, j=0;
  62.  
  63.     for (i=0, j=0; i < 15; i++, j++)
  64.     {
  65.  
  66.         if (inp_imei[i] < '0' || inp_imei[i] > '9')
  67.         {
  68.             return 1;
  69.         }
  70.         out_imei[j] = (inp_imei[i] - '0');
  71.  
  72.         if (i >= 14)
  73.             break;
  74.  
  75.         if (inp_imei[i+1] < '0' || inp_imei[i+1] > '9')
  76.         {
  77.              return 1;
  78.         }
  79.         out_imei[j] += ((inp_imei[i+1] - '0') << 4);
  80.  
  81.         out_imei[j] = out_imei[j] ^ out_mask[j];
  82.         i++;
  83.     }
  84.  
  85.     out_imei[j] = out_imei[j] ^ out_mask[j];
  86.  
  87.     out_imei[8] = 0x57; //Может быть и 0x0, ни на что не влияет
  88.     out_imei[9] = 0xDB; //Может быть и 0x0, ни на что не влияет
  89.  
  90.     out_imei[10] = out_imei[11] = 0;
  91.  
  92.     for (i = 0; i < 10; i++)
  93.     {
  94.         if (i & 0x1)
  95.         {
  96.             out_imei[11] += out_imei[i];
  97.         }
  98.         else
  99.         {
  100.             out_imei[10] += out_imei[i];
  101.         }
  102.     }
  103.  
  104.     return 0;
  105. }