先將MagicWin 98 1.30f的序號產生器貼上來。。等我解決了前面那個問題,再貼跟蹤過程部分。

看雪資料發表於2000-11-13

MagicWin 98 1.30f 序號產生器:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define BUF_LEN 30
#define HEAD_SIZE 3
    /* 前三個字元不作處理,Serial Number的長度要大於這個值 */
#define MOV_SIZE 4 
    /* 對Serial Number處理時,間隔4個位元組相互替換 */
void int2str(int n, char *pt);
    /* 好久沒用TC20了,所以不知道怎麼將Int型的值轉換成字串 */

main () {
  char S_N[BUF_LEN];      /* Serial Number 存放的陣列 */
  char User_Name[BUF_LEN]; /* 使用者名稱存放的陣列 */
  char *pstr, ch;         
  unsigned int sum = 0;

  pstr = S_N;

  printf("Please Enter your Serials Number: ");
  scanf("%s",S_N);

  if (strlen(S_N) > HEAD_SIZE) {
    printf("\nPlease Enter your Name: ");
    scanf("%s",User_Name);
    if ((sum = strlen(User_Name)) > 0) {
      pstr = User_Name;      /* 將使用者名稱字元的ASCII */
      sum += pstr;          /* 值累加,並加上使用者名稱 */
      while (*pstr++ != '\0') /* 長度。            */
        sum += *pstr;         

      int2str(sum, User_Name); /* 求出這個Int對應的字串 */

      pstr = S_N + HEAD_SIZE;
      while (strlen(pstr) > MOV_SIZE) { /* 每隔4個字元xchg */
        ch = *pstr;
        *pstr = *(pstr + MOV_SIZE);
        *(pstr + MOV_SIZE) = ch;
        pstr++;
      }
      while (*pstr != '\0' && *(pstr + 1) != '\0') {
        ch = *pstr;               
        *pstr = *(pstr+1);
                  /* 將最後不大於4長度的字元迴圈左移一位 */

        *(pstr+1) = ch;
        pstr++;
      }
      pstr = S_N + HEAD_SIZE;
      sum = HEAD_SIZE;
      while (*pstr != '\0') {/* 從第四個字元起將轉換了得  */
        *pstr += sum;  /* 字串依次加上0x10 + 在  */
        *pstr += 0x10;  /* 字串中該字元的位置。注:*/
        pstr++;        /* 第一個字元的位置為0,以此 */
        sum++;          /* 類推                    */
}

strcat(S_N, User_Name); /* 將User_Name字串(轉變後的) */
                        /* 接到S_N字串的後面,此時的  */
                        /* S_N字串就是正確的Code了    */
      printf ("\nThe MagicWin 98 1.30f software Code is: %s \n",S_N);
    }
    else {
      printf ("Name can't be NULL.");
    }
  }
  else {
    printf ("Serials Number Must be %d char or more.\n",HEAD_SIZE+1);
  }
}

void int2str(int n, char *pt) {
  int k = 0;
  ldiv_t lx;
  lx.quot = n;
  while (lx.quot != 0) {
    lx = ldiv(lx.quot, 10L);
    *(pt+k) = lx.rem + 0x30;
    k++;
  }
  *(pt+k) = '\0';
  strrev(pt);
}

相關文章