初學者的東西:Transoft's Server All 1.02破解 (3千字)

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

初學者的東西:Transoft's Server All 1.02破解
――Passion在新世紀的第一個破解

    以前用過一個叫Transoft's Server All的伺服器軟體,華軍下的,能將WINNT下的任意程式轉換成NT的服務,也就是不需要登入就能自動執行。這號功能聽起來不錯,只是仍然要註冊,於是忍不住又想練練手。――高手可別笑話我這個初學者。

    說實話Transoft's Server All 1.02在高手眼裡只不過是小菜,但我對付它卻花了兩個多小時,時間就花在尋找用我輸入的使用者名稱生成註冊碼的過程。開始原想分析出註冊碼計算的演算法的,可似乎太複雜,跟了幾百個語句後放棄了。早知道這樣,不如在記憶體中尋找假註冊碼再設記憶體讀寫斷點,那樣八成更快些。
   
    還是老手段,點選單“Apply Registration Code”彈出註冊框,要輸入name、userkey和Email address,於是輸入Passion/1212121212121212/passion@email.com.cn(不過後來這個Email地址根本就沒用到)。下斷bpx hmemcpy,斷後回Server All領空,RET大概七層後來到此處:
   
:00478C95 E86276FAFF              call 004202FC

//執行到這裡,上邊這個CALL是讀取userkey的。

:00478C9A 8B45F8                  mov eax, dword ptr [ebp-08]
:00478C9D 50                      push eax
:00478C9E 8D55F4                  lea edx, dword ptr [ebp-0C]
:00478CA1 8B45FC                  mov eax, dword ptr [ebp-04]
:00478CA4 8B80FC010000            mov eax, dword ptr [eax+000001FC]
:00478CAA E84D76FAFF              call 004202FC
//這個CALL讀取NAME

:00478CAF 8B45F4                  mov eax, dword ptr [ebp-0C]
:00478CB2 5A                      pop edx

:00478CB3 E850FFFFFF              call 00478C08

//這裡肯定是生成註冊碼並判斷的,判斷結果在AL中。

:00478CB8 84C0                    test al, al
:00478CBA 0F8474030000            je 00479034  //如果跳就完了。

我以前把這裡的0F8474030000全用90來NOP掉也註冊成功了,不過這裡要找出註冊碼,因此在此處按F8進入:

:00478CB3 E850FFFFFF              call 00478C08

進入後程式段變得很複雜,不過前邊的邏輯還是稍微有些清楚,首先將輸入的name按字元分開,按ASCII碼進行迭代運算(許多乘法和浮點指令弄得我頭暈腦脹的)。後來也不知怎麼回事就出現了字串“80219520”,幸虧覺得不對頭,因為剛跟那麼一點時間就出來註冊碼,那演算法也太不成器了。再跟,又出來一個字串“10027440”。――當然還得跟。
再跟下去,這兩個字串被作為引數參與了下一輪運算。並且執行到00466757處出現字元表,估計是計算出來的值透過查表的方式生成對應字元。
具體的流程複雜得很,註冊碼計算至少經過了三大步驟,迭代運算我也搞不清有多少次,因此程式碼沒法貼出來。

:004666CB E810D6F9FF              call 00403CE0
//此處D EAX可看到第一個中間結果――字元80219520

:00466757 E888D7F9FF              call 00403EE4
//此處D EAX可看到字元表

:0046676A E871D5F9FF              call 00403CE0
//此處D EAX可看到第二個中間結果――字元10027440

最後,在00466779上下D EAX,可看見最終的註冊碼。
――這個地方對於我來說真不容易找,幾乎每一個CALL我都跟進去了。

:00466779 E87ED3F9FF              call 00403AFC
//這裡註冊碼是JNZVh,一般長度都在五六個左右。

所以我註冊時用的就是:
Name:Passion
Userkey:JNZVh
Email Address:隨便

填入自己的Name後在0167:00466779處中斷時,來一個D EAX可看見與自己的註冊名對應的、屬於自己的註冊碼。(相信大家都喜歡得到這種結果吧?)
另外我懷疑這個程式是用DELPHI寫的,因為凡是碰到取字串長度的子程式,都是在EBP-04還是類似的其他地方取一個值到EAX裡再RET回去,這是Pascal的風格,跟C的字串遍歷的方法不一樣。

相關文章