試試這個軟體(內有下在地址及說明) (81字)

看雪資料發表於2000-06-16

用SoftICE和SmartCheck結合將這個VB6程式搞定。
註冊號是很好找的,用rtcMsgBox或MultiByteToWideChar設斷點,
看見如下的判斷:
0167:004C546D  50                          PUSH      EAX
0167:004C546E  FF1568104000        CALL      [00401068]
0167:004C5474  8B45E4                  MOV      EAX,[EBP-1C]
0167:004C5477  50                          PUSH      EAX
0167:004C5478  FF1550104000        CALL      [00401050]
0167:004C547E  8B3DB4114000        MOV      EDI,[004011B4]
0167:004C5484  8BD0                      MOV      EDX,EAX
0167:004C5486  8D4DE8                  LEA      ECX,[EBP-18]
0167:004C5489  FFD7                      CALL      EDI
0167:004C548B  8D4DE4                  LEA      ECX,[EBP-1C]
0167:004C548E  FF15FC114000        CALL      [004011FC]
0167:004C5494  8D4DD8                  LEA      ECX,[EBP-28]
0167:004C5497  FF15F8114000        CALL      [004011F8]
0167:004C549D  E85EF5FFFF          CALL      004C4A00
0167:004C54A2  8B4DE8                  MOV      ECX,[EBP-18]
0167:004C54A5  8B1528704C00        MOV      EDX,[004C7028]
0167:004C54AB  51                          PUSH      ECX                //錯誤的註冊碼
0167:004C54AC  52                          PUSH      EDX                //正確的註冊碼
0167:004C54AD  FF15D4104000        CALL      [004010D4]      //比較註冊碼
0167:004C54B3  85C0                      TEST      EAX,EAX
0167:004C54B5  0F85C5010000        JNZ      004C5680

這個軟體必須寫序號產生器,先用SoftICE跟一下,經過漫長的跟蹤後發現它在下面的地方將你的軟體編號的第k個字元乘以(k+1)。

0167:004C4B29  DB856CFFFFFF        FILD      DWORD PTR [EBP-0094]
0167:004C4B2F  C745A805000000      MOV      DWORD PTR [EBP-58],00000005
0167:004C4B36  DD9D64FFFFFF        FSTP      REAL8 PTR [EBP-009C]
0167:004C4B3C  DC8D64FFFFFF        FMUL      REAL8 PTR [EBP-009C]                  //相乘
0167:004C4B42  DD5DB0                    FSTP      REAL8 PTR [EBP-50]
0167:004C4B45  DFE0                        FSTSW  AX
0167:004C4B47  A80D                        TEST      AL,0D
0167:004C4B49  0F85A0020000          JNZ      004C4DEF

比如我的軟體編號為174078570,它在前面添個0,變成0174078570,然後就有:
0 乘以 1  =0
1 乘以 2  =2
7 乘以 3  =21
4 乘以 4  =16
0 乘以 5  =0
7 乘以 6  =42
8 乘以 7  =56
5 乘以 8  =40
7 乘以 9  =63
0 乘以 10 =0

之後用SoftICE就跟丟了。改用SmartCheck,發現它把上面的乘積串成一個字串“0221160425640630”,
然後取該串的前9個字元“022116042”,然後將該串轉換成相應的十進位制數22116042,該數對應的十六進位制表示為15176CA,再在十六進位制表示的前面和後面各加上軟體作者的姓名的聲母H、P,就得到了註冊號H15176CAP。

序號產生器:

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

void main(void)
{

    char buf[128] = "0";
    char SerialStr[128], CodeStr[128];
    int k;
    long RegCode;

    printf("請輸入你的軟體編號: ");
    gets(SerialStr);

    strcat(buf, SerialStr);
    CodeStr[0] = '\0';
    for (k = 0; k < strlen(buf); k++)
    {
        sprintf(SerialStr, "%d", ((buf[k] - '0') * (k+1)) & 0xFF);
        strcat(CodeStr, SerialStr);
    }

    CodeStr[9] = '\0';
    sscanf(CodeStr, "%lu", &RegCode);
   
    printf("你的註冊號是: ");
    printf("H%lXP\n", RegCode);
}

相關文章