初學者的東西: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的字串遍歷的方法不一樣。