詳細分析 《LRC 傻瓜編輯器 V1.1》演算法

看雪資料發表於2004-08-01

詳細分析 《LRC 傻瓜編輯器 V1.1》演算法
 

簡介:本軟體可以讓你聽完一首MP3歌曲,便可編輯完成一首LRC歌詞。並且本軟體自身還帶有MP3音樂播放和LRC歌詞播放功能。
                                                  
軟體下載地址:http://www.softreg.com.cn/shareware...F4-5E964A1486D9

開啟軟體,註冊發現有15天的限制,加了客,用工具輕鬆脫了。分析如下:

* Reference to Form2
|
0047B5CF   8B45FC                 mov     eax, [ebp-$04]

* Reference to control TForm2.Edit1 : TEdit
|
0047B5D2   8B8004030000           mov     eax, [eax+$0304]

* Reference to: controls.TControl.GetText(TControl):TCaption;  
|
0047B5D8   E8E30CFBFF             call    0042C2C0
0047B5DD   8B45F8                 mov     eax, [ebp-$08]

* Reference to: system.@LStrLen:Integer;
|           or: system.@DynArrayLength;
|           or: system.DynArraySize(Pointer):Integer;
|
0047B5E0   E8F386F8FF             call    00403CD8
0047B5E5   8BF0                   mov     esieax    ///////使用者名稱長度--》eax
0047B5E7   85F6                   test    esiesi
0047B5E9   7E3C                   jle     0047B627
0047B5EB   BF01000000             mov     edi, $00000001
0047B5F0   8B45F8                 mov     eax, [ebp-$08]
0047B5F3   33DB                   xor     ebxebx       //////ebx清零
0047B5F5   8A5C38FF               mov     blbyte ptr [eax+edi-$01]   //////q取使用者名稱的第一個字元-》bl中
0047B5F9   8BC3                   mov     eaxebx  
0047B5FB   F7EB                   imul    ebx 
0047B5FD   F7EB                   imul    ebx     ///上面的作用是把第一個字元的asc碼進行3次方運算--》eax
0047B5FF   8945EC                 mov     [ebp-$14], eax
0047B602   DB45EC                 fild    dword ptr [ebp-$14]   ///對這個值浮點取整
0047B605   D9FA                   fsqrt                              /////在開方

* Reference to: system.@ROUND;
|
0047B607   E8D072F8FF             call    004028DC       //////////跟進,下文分析
0047B60C   8BD8                   mov     ebxeax      
0047B60E   8D55E8                 lea     edx, [ebp-$18]
0047B611   8BC3                   mov     eaxebx

* Reference to: Unit_00407618.Proc_00408590
|
0047B613   E878CFF8FF             call    00408590        ////////////跟進,下文分析
0047B618   8B55E8                 mov     edx, [ebp-$18]
0047B61B   8D45F4                 lea     eax, [ebp-$0C]

* Reference to: system.@LStrCat;
|
0047B61E   E8BD86F8FF             call    00403CE0
0047B623   47                     inc     edi
0047B624   4E                     dec     esi
0047B625   75C9                   jnz     0047B5F0
0047B627   8B45F4                 mov     eax, [ebp-$0C]

* Reference to: system.@LStrLen:Integer;
|           or: system.@DynArrayLength;
|           or: system.DynArraySize(Pointer):Integer;
|
0047B62A   E8A986F8FF             call    00403CD8
0047B62F   83F80A                 cmp     eax, +$0A       
0047B632   7E26                   jle     0047B65A
0047B634   8D45E4                 lea     eax, [ebp-$1C]
0047B637   50                     push    eax
0047B638   B90A000000             mov     ecx, $0000000A
0047B63D   BA01000000             mov     edx, $00000001
0047B642   8B45F4                 mov     eax, [ebp-$0C]

* Reference to: system.@LStrCopy;                              ////////取計算出來註冊碼的前10位
|
0047B645   E89688F8FF             call    00403EE0
0047B64A   8B55E4                 mov     edx, [ebp-$1C]
0047B64D   8D45F4                 lea     eax, [ebp-$0C]

* Possible String Reference to: '321'                  //////////////想想這是幹什麼的????
|
0047B650   B96CB74700             mov     ecx, $0047B76C

* Reference to: system.@LStrCat3;
|
0047B655   E8CA86F8FF             call    00403D24
0047B65A   8D55E0                 lea     edx, [ebp-$20]

* Reference to Form2
|
0047B65D   8B45FC                 mov     eax, [ebp-$04]

* Reference to control TForm2.Edit2 : TEdit
|
0047B660   8B8010030000           mov     eax, [eax+$0310]

* Reference to: controls.TControl.GetText(TControl):TCaption;
|
0047B666   E8550CFBFF             call    0042C2C0
0047B66B   8B55E0                 mov     edx, [ebp-$20]    ////////這裡進行了明文比較。
0047B66E   8B45F4                 mov     eax, [ebp-$0C]

* Reference to: system.@LStrCmp;
|
0047B671   E87287F8FF             call    00403DE8
0047B676   0F85A0000000           jnz     0047B71C     //////關鍵跳轉,相等則  '您已經註冊,多謝支援!',下面寫入到登錄檔

* Reference to Form2
|
0047B67C   8B45FC                 mov     eax, [ebp-$04]

* Reference to control TForm2.Label1 : TLabel
|
0047B67F   8B80F4020000           mov     eax, [eax+$02F4]

* Possible String Reference to: '您已經註冊,多謝支援!'
|
0047B685   BA78B74700             mov     edx, $0047B778

* Reference to: controls.TControl.SetText(TControl;TCaption);
|
0047B68A   E8610CFBFF             call    0042C2F0

* Reference to Form2
|
0047B68F   8B45FC                 mov     eax, [ebp-$04]

* Reference to control TForm2.Label2 : TLabel
|
0047B692   8B80F8020000           mov     eax, [eax+$02F8]
0047B698   33D2                   xor     edxedx

* Reference to: controls.TControl.SetVisible(TControl;Boolean);
|
0047B69A   E8390BFBFF             call    0042C1D8

* Reference to TForm1 instance
|
0047B69F   A124024800             mov     eaxdword ptr [$00480224]
0047B6A4   8B00                   mov     eax, [eax]

* Reference to control TForm1.Timer3 : TTimer
|
0047B6A6   8B8084030000           mov     eax, [eax+$0384]
0047B6AC   33D2                   xor     edxedx

* Reference to: extctrls.TTimer.SetEnabled(TTimer;Boolean);
|
0047B6AE   E84515FDFF             call    0044CBF8
0047B6B3   B201                   mov     dl, $01

* Reference to class TRegistry
|
0047B6B5   A1A0B64400             mov     eaxdword ptr [$0044B6A0]

* Reference to: Unit_0044B640.Proc_0044B7A0
|
0047B6BA   E8E100FDFF             call    0044B7A0
0047B6BF   8BD8                   mov     ebxeax
0047B6C1   BA01000080             mov     edx, $80000001
0047B6C6   8BC3                   mov     eaxebx

* Reference to: Unit_0044B640.Proc_0044B840
|
0047B6C8   E87301FDFF             call    0044B840

* Possible String Reference to: 'software\gcbjq'                           /////登錄檔裡的東東
|
0047B6CD   BA98B74700             mov     edx, $0047B798
0047B6D2   8BC3                   mov     eaxebx

* Reference to: Unit_0044B640.Proc_0044BD08
|
0047B6D4   E82F06FDFF             call    0044BD08
0047B6D9   84C0                   test    alal
0047B6DB   750C                   jnz     0047B6E9

* Possible String Reference to: 'software\gcbjq'
|
0047B6DD   BA98B74700             mov     edx, $0047B798
0047B6E2   8BC3                   mov     eaxebx

* Reference to: Unit_0044B640.Proc_0044B8A4
|
0047B6E4   E8BB01FDFF             call    0044B8A4
0047B6E9   33C9                   xor     ecxecx

* Possible String Reference to: 'software\gcbjq'
|
0047B6EB   BA98B74700             mov     edx, $0047B798
0047B6F0   8BC3                   mov     eaxebx

* Reference to: Unit_0044B640.Proc_0044B980
|
0047B6F2   E88902FDFF             call    0044B980

* Possible String Reference to: 'zhuche'
|
0047B6F7   BAB0B74700             mov     edx, $0047B7B0
0047B6FC   8BC3                   mov     eaxebx

* Reference to: Unit_0044B640.Proc_0044BC60
|
0047B6FE   E85D05FDFF             call    0044BC60
0047B703   84C0                   test    alal
0047B705   750E                   jnz     0047B715
0047B707   B101                   mov     cl, $01

* Possible String Reference to: 'zhuche'                      /////////  dword型的鍵,置1表示註冊成功!!
|
0047B709   BAB0B74700             mov     edx, $0047B7B0
0047B70E   8BC3                   mov     eaxebx





0047B607   E8D072F8FF             call    004028DC    進去

004028DC  /$ 83EC 08        SUB ESP,8
004028DF  |. DF3C24         FISTP QWORD PTR SS:[ESP]      /////把剛才計算的結果取整,並出棧
004028E2  |. 9B             WAIT
004028E3  |. 58             POP EAX      ////結果轉為16進位制---》eax中
004028E4  |. 5A             POP EDX
004028E5  \. C3             RETN



0047B613   E878CFF8FF             call    00408590    進去  經過反覆的除錯發現註冊碼的計算出(這裡有一些陷阱) 

00408F02  |$ B9 0A000000    MOV ECX,0A      ////eax=a   此時eax為先前計算的值
00408F07  |> 8D75 9F        LEA ESI,DWORD PTR SS:[EBP-61]   
00408F0A  |> 31D2           /XOR EDX,EDX  
00408F0C  |. F7F1           |DIV ECX    ///eax除以eca(0ah),商->eax,餘數-》edx
00408F0E  |. 80C2 30        |ADD DL,30   edx=edx+30
00408F11  |. 80FA 3A        |CMP DL,3A   
00408F14  |. 72 03          |JB SHORT 1.00408F19    如果edx小於3a,則跳
00408F16  |. 80C2 07        |ADD DL,7  
00408F19  |> 4E             |DEC ESI      ////////esi為為註冊碼存放的棧地址
00408F1A  |. 8816           |MOV BYTE PTR DS:[ESI],DL   
00408F1C  |. 09C0           |OR EAX,EAX 
00408F1E  |.^75 EA          \JNZ SHORT 1.00408F0A   如果eax為0(即商位0),則跳出,否則迴圈




下面把演算法總結一下,取使用者名稱的第一個字元,求它的3次方,在對其開方,取整,自動轉換為16進位制的形式儲存。在對這個16進位制數不斷的除

以0ah,餘數+30 與3ah比較,如果比3ah小,則dl放入一個堆疊地址(初始是12e1a3,下次迴圈逐次減一)中;反之把dl+7,在放入一個堆疊

地址中。最後看exa是否為0,不為0,則繼續迴圈除下去。最後把堆疊地址中的資料轉換為asc碼的形式。以“u”為例,堆疊地址中的資料形式

如下:
     36   36   32   31
   36--對應的第一次迴圈的esi  12e1a2
   36-- 對應的第二次迴圈的esi  121a1  32--對應的第三次迴圈的esi  12e1a0   
  31-- 對應的第四次迴圈的esi  12e19f
                   
           asc碼為“1266”
下面在取第二個字元計算。
・・・・・・・・・・・・・・・・・・・・・・・・・・
把所有計算的asc碼拼在一起,取前10位,再在後面拼上“321”,就是真正的註冊碼了。
      如:huangrui
       1061 1266 955 1154 1045 1217 1266 1076
 取前10位,再在後面拼上“321”  即為 “1061126695321” 


最後提議下這個軟體再登錄檔裡的行為,如果沒註冊,它會生成first的鍵。它的鍵值位xx  xx  xx  xx  00 a7 02 40.(xx位隨即的)每過一

天它的另外一個鍵yesday會有變化!鍵值第五位起決定因素。00第一天,,02第二天,04第三天,偶數關係。比較有意思。其實再登錄檔中

user\software\gcbjq 下新增一個名位zhuche的dword型的鍵,置1表示註冊成功,一切就ok了!!好累啊!!!睡覺拉!!!!

相關文章