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