菜鳥對XARA 3D V4.0的對比和註冊碼演算法的一點心得,請多多指教!! (8千字)

看雪資料發表於2001-12-17

XARA 3D v4.0
雖然網上已有序號產生器,但本著學習的目的,我還是將它研究了一番,現寫出心得如下:
執行xara 3d,發現沒有註冊有15天限制,且作出來的圖的背景上有它的logo,看一下注冊方式,只要輸入註冊碼即可,沒有使用者名稱什麼的,再用fi偵測一下,用aspack 2.1加了殼,脫了它,再執行脫殼後的程式,隨便輸入幾個數字,然後啟動trw,下斷
bpx hmemcpy ,按f5回到程式,點ok,被trw斷下,bd *禁止所有斷點,pmodule回到程式的領空,然後小心的按f10,來到如下地方:
:0041F6BA  mov    eax, dword ptr [esp+00000144] //將註冊碼送到EAX
:0041F6C1  cmp    dword ptr [eax-08], 00000007 //比較註冊碼的長度是否為7
:0041F6C5  jne    0041F8CA  //不對就出錯
:0041F6CB  movsx edx, byte ptr [eax] //將註冊碼第一位送到ECX
:0041F6CE  push  edx
:0041F6CF  call  0047C3E8  //比較註冊碼第1位是否為大寫的英文字母
:0041F6D4  add    esp, 00000004
:0041F6D7  test  eax, eax  //檢查正確與否的標誌
:0041F6D9  je      0041F8CA  //不符合條件就出錯
:0041F6DF  mov    eax, dword ptr [esp+00000144] //將註冊碼送到EAX
:0041F6E6  movsx ecx, byte ptr [eax+01] //將註冊碼第二位送到ECX
:0041F6EA  push  ecx
:0041F6EB  call  0047C3E8  //比較註冊碼第2位是否為大寫的英文字母
:0041F6F0  add    esp, 00000004
:0041F6F3  test  eax, eax  //檢查正確與否的標誌
:0041F6F5  je      0041F8CA  //不符合條件就出錯
:0041F6FB  mov    edx, dword ptr [esp+00000144]//將註冊碼送到EAX
:0041F702  movsx eax, byte ptr [edx+02] //將註冊碼第三位送到ECX
:0041F706  push    eax
:0041F707  call    0047C3E8 //比較註冊碼第3位是否為大寫的英文字母
:0041F70C  add      esp, 00000004
:0041F70F  test    eax, eax  //檢查正確與否的標誌
:0041F711  je        0041F8CA  //不符合條件就出錯
:0041F717  mov      ecx, dword ptr [esp+00000144]//將註冊碼送到EAX
:0041F71E  movsx  edx, byte ptr [ecx+03] //將註冊碼第四位送到ECX
:0041F722  push    edx
:0041F723  call    0047C3E8 //比較註冊碼第4位是否為大寫的英文字母
:0041F728  add      esp, 00000004
:0041F72B  test    eax, eax  //檢查正確與否的標誌
:0041F72D  je        0041F8CA  //不符合條件就出錯
:0041F733  mov      eax, dword ptr [esp+00000144]//將註冊碼送到EAX
:0041F73A  movsx  ecx, byte ptr [eax+04] //將註冊碼第五位送到ECX
:0041F73E  push    ecx
:0041F73F  call    0047C3E8 //比較註冊碼第5位是否為大寫的英文字母
:0041F744  add      esp, 00000004
:0041F747  test    eax, eax  //檢查正確與否的標誌
:0041F749  je        0041F8CA  //不符合條件就出錯
:0041F74F  mov      edx, dword ptr [esp+00000144]//將註冊碼送到EAX
:0041F756  movsx eax, byte ptr [edx+05] //將註冊碼第六位送到ECX
:0041F75A  push eax
:0041F75B  call 0047C3E8 //比較註冊碼第6位是否為大寫的英文字母
:0041F760  add  esp, 00000004
:0041F763  test eax, eax  //檢查正確與否的標誌
:0041F765  je    0041F8CA  //不符合條件就出錯
:0041F76B  mov    ecx, dword ptr [esp+00000144]//將註冊碼送到EAX
:0041F772  movsx edx, byte ptr [ecx+06] //將註冊碼第七位送到ECX
:0041F776  push  edx
:0041F777  call  0047C3E8 //比較註冊碼第7位是否為大寫的英文字母
:0041F77C  add    esp, 00000004
:0041F77F  test    eax, eax  //檢查正確與否的標誌
:0041F781  je      0041F8CA  //不符合條件就出錯
:0041F787  mov    eax, ebp  //用EBP的值初始化EAX
:0041F789  mov    ecx, ebp  //用EBP的值初始化ECX
:0041F78B  shr    eax, 1  //將EAX的值邏輯右移1次
:0041F78D  and    eax, 55555555 //將EAX+55555555h,和放到EAX中
:0041F792  and    ecx, 55555555 //將ECX+55555555h,和放到ECX中
:0041F798  lea    ecx, dword ptr [eax+2*ecx]//將ECX*2再加上EAX,和放到ECX
:0041F79B  mov    eax, dword ptr [esp+00000144]//將註冊碼送到EAX
:0041F7A2  imul  ecx, 5678DE15 //將ECX*5678DE15h的積放到ECX
:0041F7A8  mov    bl, byte ptr [eax+01]//將註冊碼第二位放入BL中
:0041F7AB  mov    dl, byte ptr [eax+03]//將註冊碼第四位放入DL中
:0041F7AE  mov    byte ptr [esp+32], bl//將BL的值放到ESP+32
:0041F7B2  mov    bl, byte ptr [eax]//將註冊碼第一位放到BL
:0041F7B4  mov    byte ptr [esp+30], bl//將BL的值放到ESP+30
:0041F7B8  mov    bl, byte ptr [eax+05]//將註冊碼第六位放到BL
:0041F7BB  mov    byte ptr [esp+31], bl//將BL的值放到ESP+31
:0041F7BF  mov    bl, byte ptr [eax+02]//將註冊碼第三位放到BL
:0041F7C2  mov    byte ptr [esp+33], bl//將BL的值放到ESP+33
:0041F7C6  mov    bl, byte ptr [eax+06]//將註冊碼第七位放到BL
:0041F7C9  movsx eax, byte ptr [eax+04]//將註冊碼第五位放到EAX
:0041F7CD  movsx esi, bl//將BL的值,即註冊碼第七位放到ESI
:0041F7D0  lea    eax, dword ptr [eax+2*eax]//將EAX即註冊碼第五位乘以3,積放到EAX
:0041F7D3  movsx edx, dl//將DL即註冊碼第四位放到EDX
:0041F7D6  lea    eax, dword ptr [esi+8*eax]//將EAX乘以8,再加上ESI即註冊碼第七位,和放到EAX
:0041F7D9  movsx esi, byte ptr [esp+33]//將ESP+33即註冊碼第三位放到ESI
:0041F7DE  lea    eax, dword ptr [eax+2*eax]//將EAX乘以3的積放到EAX
:0041F7E1  lea    eax, dword ptr [esi+8*eax]]//將EAX乘以8,再加上ESI即註冊碼第三位,和放到EAX
:0041F7E4  movsx esi, byte ptr [esp+31]//將ESP+31即註冊碼第六位放到ESI
:0041F7E9  lea    eax, dword ptr [eax+2*eax]//將EAX乘以3的積放到EAX
:0041F7EC  lea    eax, dword ptr [esi+8*eax]]//將EAX乘以8,再加上ESI即註冊碼第六位,和放到EAX
:0041F7EF  movsx esi, byte ptr [esp+30]//將ESP+30即註冊碼第一位放到ESI
:0041F7F4  lea    eax, dword ptr [eax+2*eax]//將EAX乘以3的積放到EAX
:0041F7F7  lea    eax, dword ptr [esi+8*eax]]//將EAX乘以8,再加上ESI即註冊碼第一位,和放到EAX
:0041F7FA  movsx esi, byte ptr [esp+32]//將ESP+32即註冊碼第二位放到ESI
:0041F7FF  lea    eax, dword ptr [eax+2*eax]//將EAX乘以3的積放到EAX
:0041F802  lea    eax, dword ptr [esi+8*eax]]//將EAX乘以8,再加上ESI即註冊碼第二位,和放到EAX
:0041F805  lea    eax, dword ptr [eax+2*eax]//將EAX乘以3的積放到EAX
:0041F808  lea    eax, dword ptr [edx+8*eax-0494DE99]]//將EAX乘以8,再加上ESI即註冊碼四第位,再減去0494DE99h,最後的結果放到EAX
:0041F80F  cmp    eax, ecx  //比較EAX和ECX的值
:0041F811  jne    0041F8CA  //不相等就game over了

好了,現在將它的演算法總結如下:
設 EBP=ECFAD166(不同的機器EBP因該不同)    B=0494DE99
註冊碼:M  我暫且將M從高位到低位,每一位上的數字設為M1,M2,M3,M4,M5,M6,M7
他們滿足下面這個等式:(其中的shr()代表邏輯右移一次,以下所有等式中的數,如沒有特別說明,都為16進位制)
[(EBP+55555555)*2+(shr(EBP)+55555555)]*5678de15
=  (((((M5*18+M7)*18+M3)*18+M6)*18+M1)*18+M2)*183B

上面這個等式不好看,將它作下變換,得到下面的等式:

[(EBP+55555555)*2+(shr(EBP)+55555555)]*5678de15+B
=  (M5*18^6+M7*18^5+M3*18^4+M6*18^3+M1*18^2+M2*18+M4)

這下就好看多了,B是個固定的常數,想辦法得到EBP,我們就可以計算出等式左邊的值,當然這個值是一個16進位制的數,那麼怎麼把這個16進位制的數與等式的右邊對應起來呢,仔細看看
M5*18^6+M7*18^5+M3*18^4+M6*18^3+M1*18^2+M2*18+M4
這個表示式,是不是與這個表示式(等式中的數為10進位制)
1*10^6+2*10^5+3*10^4+4*10^3+5*10^2+6*10+7
很相似呢,後面這個表示式寫成常規形式就是 123467 這個數,同理,前面那個表示式寫成常規形式就是 M5 M7 M3 M6 M1 M2 M4  ,當然這是個24進位制的7位數,到這裡,我們已經看到曙光了,將等式左邊的值轉換為24進位制的數,將我們計算得到的這個7位24進位制的數的每一位,分別與M5 M7 M3 M6 M1 M2 M4  對應上,我門就得到了註冊碼 M 每一位上的數,接下來就好說了,將每一位的順序調整一下,就得到了我們想要的註冊碼 M .不過還沒有完,我們還需要將M的每一位,對照軟體作者給定的24進位制轉換表,轉換成我門可以輸入的字元,到此才算結束了,這時才得到了真正的註冊碼。那麼作者給定的24進位制轉換表在那裡呢,我沒有找到,但我猜測這張表就是26個大寫英文字母,因為如果你的註冊碼裡面含有26個大寫英文字母以外的字元時,程式根本不會到達核心對比的地方,就已經game over了。
下面是我還沒有理解的地方:
1。那個EBP在我的機器上始終是ECFAD166 ,不知道在其它的機器上是不是這個值,我想呢,因該是不同的,可能它是根據機器的某個地方的數值計算出來的,無奈我水平有限,找了半天也沒有搞清楚這個EBP的值是怎麼來到。還請高手指教!!
2。不知道是我的演算法分析錯誤還是我的計算錯誤,我算了好幾遍也沒有算對,始終沒有得到正確的註冊碼,無奈之下,上網下載了一個序號產生器,得到我的註冊碼是LTIFVPT,可我怎麼也算不來這個值。請高手救救我啊!!
3。這是我第一次看懂軟體的演算法,可惜我不會程式設計,不知哪位高手能告訴我怎麼寫它的序號產生器,讓我這個菜鳥也過過做序號產生器的癮,哈哈,不要笑我啊!!

好了,不說了,寫的夠羅嗦的了,浪費了大家這麼多時間,有空就幫幫我吧!!

最後還說一點廢話:
1.將登錄檔中的這個鍵[HKEY_CURRENT_USER\Software\Xara\X3D4\Install]
下的key鍵刪除就又可以註冊了;
2.如果你只是想註冊的話,則只要填註冊碼時,隨便填入7個大寫的字母,然後在
0041F811  jne    0041F8CA  處下 r fl z ,不讓程式跳走,就註冊成功了,且以後也不要再註冊了,跟真正的註冊版一模一樣!

                                    Cracker:Turkey/滅害靈
                                        2001.12.17@17:40

相關文章