【原創】星空視訊俱樂部 V1.75註冊演算法簡析

看雪資料發表於2015-11-15

小弟的第一篇破文。。。大家鼓勵鼓勵阿。。。

[目標]星空視訊俱樂部  V1.75

[軟體簡介]《星空視訊俱樂部》:最值得信賴的網路電影電視軟體,新增超強音量控制功能,400多個國內外電視臺,一千多部電影、寫真集、電視劇、綜藝節目,速度快質量高的精彩視訊,專人實時跟蹤更新升級,本軟體具有自動升級功能。 通過獨特的合作資源,提供超過400套超高清晰的衛星電視節目,高速HBO大片,BBC新聞,日本MM、港臺鳳凰、華娛、星空、TVB系列,國內中央及各省衛星電視節目;性感寫真;搞笑小電影。

[工具]W32ASM無級版+OD+windows自帶計算器

[保護方式]  採用硬體序列號,一機一註冊碼

[加入時間] 2005-1-12


Loading...........
PS:
我的機器碼:B5016392
我嘗試的註冊碼:78787878

先試著著註冊一下,發現提示錯誤提示為”你輸入的註冊碼78787878不正確,請與作者聯絡。“
用W32ASM無級版開啟查詢字串,找到後進去,來到這裡。。。

* Possible StringData Ref from Code Obj ->"你輸入的註冊碼"
                                  |
----->:0047BD99 68BCBF4700              push 0047BFBC
:0047BD9E 8D55D4                  lea edx, dword ptr [ebp-2C]
:0047BDA1 8B45FC                  mov eax, dword ptr [ebp-04]
:0047BDA4 8B8008030000            mov eax, dword ptr [eax+00000308]
:0047BDAA E80927FCFF              call 0043E4B8
:0047BDAF FF75D4                  push [ebp-2C]

發現前面不是跳轉過來的,那就是說是正確就跳走。。

好,來看前面那句:

:0047BD91 3B0540394C00            cmp eax, dword ptr [004C3940]
:0047BD97 7438                    je 0047BDD1

那我們可以想象,前面的比較肯定就是,註冊碼的比較拉。。。
用OD開啟,0047BD91下斷,載入軟體,隨便註冊一下,在這裡斷下,看到下面的就是比較的兩組資料:
DS:[004C3940]=00023F3A
EAX=FF570443
看不出什麼意思。。。。呵呵。。。是啊,那我們下前面點。。。
回來看看W32ASM,哦呵,看這裡:
* Possible StringData Ref from Code Obj ->" 您輸入的註冊碼無效,請從新輸入。"
                                  |
:0047BD14 B884BF4700              mov eax, 0047BF84
:0047BD19 E86A01FBFF              call 0042BE88
:0047BD1E E9BC010000              jmp 0047BEDF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047BD12(C)
|
:0047BD23 8D45E4                  lea eax, dword ptr [ebp-1C];就這裡了,從這裡開始吧
估計上面就是因為註冊碼有效才跳這裡來的,不然就會顯示註冊碼無效了。。呵呵

0047BD23下斷,從來。。。

斷下,一直按F8粗跟蹤,密切關注右邊的資料。。。
:0047BD23 8D45E4                  lea eax, dword ptr [ebp-1C]//我們輸入的註冊碼
:0047BD26 50                      push eax
:0047BD27 8D55E0                  lea edx, dword ptr [ebp-20]
:0047BD2A 8B45FC                  mov eax, dword ptr [ebp-04]
:0047BD2D 8B8004030000            mov eax, dword ptr [eax+00000304]
:0047BD33 E88027FCFF              call 0043E4B8

計算後的資料:
EAX 00000008
ECX 0012F9A8
EDX 7FFE0304
EBX 00D2FE54

:0047BD38 8B45E0                  mov eax, dword ptr [ebp-20]//機器序列號
:0047BD3B B906000000              mov ecx, 00000006
:0047BD40 BA01000000              mov edx, 00000001
:0047BD45 E84A88F8FF              call 00404594

又是一個CALL後的資料
EAX 0012FBEC
ECX 00000000
EDX 00000000
EBX 00D2FE54

:0047BD4A 8B4DE4                  mov ecx, dword ptr [ebp-1C]//機器碼前6位
:0047BD4D 8D45E8                  lea eax, dword ptr [ebp-18]
:0047BD50 BAB0BF4700              mov edx, 0047BFB0
:0047BD55 E82686F8FF              call 00404380//步過
:0047BD5A 8B45E8                  mov eax, dword ptr [ebp-18]//前面加了個”0x“
:0047BD5D E85AC8F8FF              call 004085BC

EAX 00B50163
ECX 00D31D00 ASCII "0xB50163"
EDX 0012FB98
EBX 00D2FE54

:0047BD62 8BF0                    mov esi, eax
:0047BD64 33C0                    xor eax, eax
:0047BD66 55                      push ebp
:0047BD67 6896BE4700              push 0047BE96
:0047BD6C 64FF30                  push dword ptr fs:[eax]
:0047BD6F 648920                  mov dword ptr fs:[eax], esp
:0047BD72 8D55DC                  lea edx, dword ptr [ebp-24]
:0047BD75 8B45FC                  mov eax, dword ptr [ebp-04]
:0047BD78 8B8008030000            mov eax, dword ptr [eax+00000308]
:0047BD7E E83527FCFF              call 0043E4B8
:0047BD83 8B45DC                  mov eax, dword ptr [ebp-24]//我們的註冊碼
:0047BD86 E831C8F8FF              call 004085BC

計算後資料:
EAX 04B23526
ECX 00D20914 ASCII "78787878"
EDX 0012FB8C
EBX 00D2FE54

:0047BD8B 8BD8                    mov ebx, eax
:0047BD8D 8BC3                    mov eax, ebx
:0047BD8F 2BC6                    sub eax, esi//EAX-0xB50163??B50163不是就是我註冊碼的前6位啊。
:0047BD91 3B0540394C00            cmp eax, dword ptr [004C3940]//

EAX=03FD33C3 DS:[004C3940]=00023F3A
我們執行多次發現都是這個數字。。。。那我們就把他當常數吧(其實我後來去另外機子除錯也是這個數字,他就是一個常數,不變的。),現在我們再總的分析一下,也就是說註冊碼計算後的值要等於0x23F3A+0xB50163=。。。計算器按幾下下。。0xB7409D
好,這樣我們關鍵就是要看他把我們的註冊碼怎麼了一下,就是去那個
:0047BD86 E831C8F8FF              call 004085BC
因為他計算了我們的註冊碼,然後和0xB7409D比較(其實是減了0xB50163和0x23F3A比較)。。

CALL下斷,重載入程式。。。。
進去了。。

:004085BC 53                      push ebx
:004085BD 56                      push esi
:004085BE 83C4F4                  add esp, FFFFFFF4
:004085C1 8BD8                    mov ebx, eax
:004085C3 8BD4                    mov edx, esp
:004085C5 8BC3                    mov eax, ebx
:004085C7 E88CA7FFFF              call 00402D58//除錯後發現是核心
:004085CC 8BF0                    mov esi, eax
:004085CE 833C2400                cmp dword ptr [esp], 00000000
:004085D2 7419                    je 004085ED
:004085D4 895C2404                mov dword ptr [esp+04], ebx
:004085D8 C64424080B              mov [esp+08], 0B
:004085DD 8D542404                lea edx, dword ptr [esp+04]
:004085E1 A1F43A4C00              mov eax, dword ptr [004C3AF4]
:004085E6 33C9                    xor ecx, ecx
:004085E8 E833F9FFFF              call 00407F20

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004085D2(C)
|
:004085ED 8BC6                    mov eax, esi
:004085EF 83C40C                  add esp, 0000000C
:004085F2 5E                      pop esi
:004085F3 5B                      pop ebx
:004085F4 C3                      ret

看起來不復雜。。。
那就看看核心吧。。
靠,太複雜了。。。
call 00402D58
:00402D58 53                      push ebx
:00402D59 56                      push esi
:00402D5A 57                      push edi
:00402D5B 89C6                    mov esi, eax
:00402D5D 50                      push eax
:00402D5E 85C0                    test eax, eax
:00402D60 746C                    je 00402DCE
:00402D62 31C0                    xor eax, eax
:00402D64 31DB                    xor ebx, ebx
:00402D66 BFCCCCCC0C              mov edi, 0CCCCCCC

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D71(C)
|
:00402D6B 8A1E                    mov bl, byte ptr [esi]
:00402D6D 46                      inc esi
:00402D6E 80FB20                  cmp bl, 20
:00402D71 74F8                    je 00402D6B
:00402D73 B500                    mov ch, 00
:00402D75 80FB2D                  cmp bl, 2D
:00402D78 7462                    je 00402DDC
:00402D7A 80FB2B                  cmp bl, 2B
:00402D7D 745F                    je 00402DDE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402DE1(U)
|
:00402D7F 80FB24                  cmp bl, 24
:00402D82 745F                    je 00402DE3
:00402D84 80FB78                  cmp bl, 78
:00402D87 745A                    je 00402DE3
:00402D89 80FB58                  cmp bl, 58
:00402D8C 7455                    je 00402DE3
:00402D8E 80FB30                  cmp bl, 30
:00402D91 7513                    jne 00402DA6
:00402D93 8A1E                    mov bl, byte ptr [esi]
:00402D95 46                      inc esi
:00402D96 80FB78                  cmp bl, 78
:00402D99 7448                    je 00402DE3
:00402D9B 80FB58                  cmp bl, 58
:00402D9E 7443                    je 00402DE3
:00402DA0 84DB                    test bl, bl
:00402DA2 7420                    je 00402DC4
:00402DA4 EB04                    jmp 00402DAA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D91(C)
|
:00402DA6 84DB                    test bl, bl//前面一堆就是在判斷是不是數字。。。
:00402DA8 742D                    je 00402DD7

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402DA4(U), :00402DC2(C)
|
|-------->  :00402DAA 80EB30                  sub bl, 30//ASCII碼-0x30,轉數字
|  :00402DAD 80FB09                  cmp bl, 09
|  :00402DB0 7725                    ja 00402DD7
|  :00402DB2 39F8                    cmp eax, edi
|  :00402DB4 7721                    ja 00402DD7
|  :00402DB6 8D0480                  lea eax, dword ptr [eax+4*eax]//*5
|  :00402DB9 01C0                    add eax, eax//*2(並上上面的,不就是*10啊)
|  :00402DBB 01D8                    add eax, ebx//加到原來的上去
|  :00402DBD 8A1E                    mov bl, byte ptr [esi]
|  :00402DBF 46                      inc esi
|  :00402DC0 84DB                    test bl, bl
--------  :00402DC2 75E6                    jne 00402DAA
整個就是一位位取數,把我們的ASCII的數字變成10進位制的。現在你看看你的EAX,是不是很熟悉啊,呵呵,就是出去我們要用的拉,0X4B23526(10進位制就是“78787878”)(啊?不會把,這麼簡單)哈,就這麼簡單。。後面也不要跟了。。。
我們也可以做序號產生器了。。。走吧,下面不要看了。。。。。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402DA2(C)
|
:00402DC4 FECD                    dec ch
:00402DC6 7409                    je 00402DD1
:00402DC8 85C0                    test eax, eax
:00402DCA 7D54                    jge 00402E20
:00402DCC EB09                    jmp 00402DD7

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402D60(C), :00402DED(C)
|
:00402DCE 46                      inc esi
:00402DCF EB06                    jmp 00402DD7

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402DC6(C)
|
:00402DD1 F7D8                    neg eax
:00402DD3 7E4B                    jle 00402E20
:00402DD5 7849                    js 00402E20

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402DA8(C), :00402DB0(C), :00402DB4(C), :00402DCC(U), :00402DCF(U)
|:00402E05(C), :00402E0C(C)
|
:00402DD7 5B                      pop ebx
:00402DD8 29DE                    sub esi, ebx
:00402DDA EB47                    jmp 00402E23

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D78(C)
|
:00402DDC FEC5                    inc ch

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402D7D(C)
|
:00402DDE 8A1E                    mov bl, byte ptr [esi]
:00402DE0 46                      inc esi
:00402DE1 EB9C                    jmp 00402D7F

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402D82(C), :00402D87(C), :00402D8C(C), :00402D99(C), :00402D9E(C)
|
:00402DE3 BFFFFFFF0F              mov edi, 0FFFFFFF
:00402DE8 8A1E                    mov bl, byte ptr [esi]
:00402DEA 46                      inc esi
:00402DEB 84DB                    test bl, bl
:00402DED 74DF                    je 00402DCE

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402E18(C)
|
:00402DEF 80FB61                  cmp bl, 61
:00402DF2 7203                    jb 00402DF7
:00402DF4 80EB20                  sub bl, 20

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402DF2(C)
|
:00402DF7 80EB30                  sub bl, 30
:00402DFA 80FB09                  cmp bl, 09
:00402DFD 760B                    jbe 00402E0A
:00402DFF 80EB11                  sub bl, 11
:00402E02 80FB05                  cmp bl, 05
:00402E05 77D0                    ja 00402DD7
:00402E07 80C30A                  add bl, 0A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402DFD(C)
|
:00402E0A 39F8                    cmp eax, edi
:00402E0C 77C9                    ja 00402DD7
:00402E0E C1E004                  shl eax, 04
:00402E11 01D8                    add eax, ebx
:00402E13 8A1E                    mov bl, byte ptr [esi]
:00402E15 46                      inc esi
:00402E16 84DB                    test bl, bl
:00402E18 75D5                    jne 00402DEF
:00402E1A FECD                    dec ch
:00402E1C 7502                    jne 00402E20
:00402E1E F7D8                    neg eax

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00402DCA(C), :00402DD3(C), :00402DD5(C), :00402E1C(C)
|
:00402E20 59                      pop ecx
:00402E21 31F6                    xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402DDA(U)
|
:00402E23 8932                    mov dword ptr [edx], esi
:00402E25 5F                      pop edi
:00402E26 5E                      pop esi
:00402E27 5B                      pop ebx
:00402E28 C3                      ret


。。OK。總結一下,演算法就是把我們輸入的註冊碼轉為10進位制,所以你必須要輸入10進位制的數字,然後J減去機器碼前6位(16進位制),必須等於0x23F3A。就這麼簡單。。
註冊碼=DEC(HEX(機器碼前6位)+0x23F3A)

PS:此外還有就是註冊碼不可以超過8位,不然就沒有上面的文章了。。。因為就不會來到我們下的斷了。


序號產生器程式碼如下(C語言版):

#include <stdio.h> 

void main()
  {
  long n1,n2=0x23f3a,serial;  
  
  printf("\t+++++++++++++4nilz Crack+++++++++++++++\n");
  printf("\t+tHis Program has FuCkEd bY 4nil......+\n");
  printf("\t+just meAn iT Is rbsh....OK share,THX.+\n");
  printf("\t+++++++++++++++++++++++++++++++++++++++\n\n");
  
  printf("Enter the machine code:");
  scanf("%6X",&n1);

  serial=n1+n2;
  printf("Serial:%d",serial);
  getch();

  }
VC++6.0下除錯通過。
也也!大功告成!
我廢話多吧,謝謝觀賞。。。。。睡覺拉,現在時刻0:24。。。困

相關文章