史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > Hacker/Cracker 及加解密技術文件
忘記密碼?
論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2006-03-20, 07:49 AM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 同益起名大師 v3.3.7註冊機編寫

同益起名大師 v3.3.7註冊機編寫

【宣告】只是好奇,沒有別的目的,如有,我就把註冊機發表了(已經寫好了),不要發信向我要註冊機,我不會發表的,這也是看雪老大的要求,其實我覺得這篇文章已經很過份。按這篇文章,你100%可以得到正確的註冊碼。
【工具】IDA,OllyDBG
【軟體】使用我在【ACProtect 1.41 -- 同益起名大師 v3.36、v3.37、vp3.33(專業版)完美脫殼】中所完美脫殼後的 GoodName.Exe v3.37版。使用脫殼版,跟蹤比較容易,當然你也可以直接使用原版,但會困難一些。
前言:
同益起名的註冊碼驗證遍佈全程序,在主表單建立,子視窗建立,按鍵操作,對註冊碼和註冊申請碼的驗證無所不在,而且計算方法來回重複,例如獲取註冊申請碼就有三個完全相同的程序,DES 算法也有完整的兩套。我們用來分析註冊碼取的是註冊操作部分,其實在主視窗建立、子視窗建立的程序中都可以進行,因為他們是完全相同的。
這是註冊視窗(Tfxhm)VMT表中的方法表部分,(全表太長)。這些程式碼都是在 IDA 中分析得到的。




程式碼:--------------------------------------------------------------------------------......0055647F TfxhmMethodTable dw 600556481 dw 16h00556483 dd offset Tfxhm@suiButton2Click ;結束按鍵00556487 aSuibutton2click db 0Fh,'suiButton2Click'00556497 dw 10h00556499 dd offset Tfxhm@FormClose ;關閉視窗0055649D aFormclose_0 db 9,'FormClose'005564A7 dw 11h005564A9 dd offset Tfxhm@FormCreate ;建立視窗005564AD aFormcreate_0 db 0Ah005564AD db 'FormCreate'005564B8 dw 16h005564BA dd offset Tfxhm@suiButton1Click ;註冊按鍵005564BE aSuibutton1cli ck db 0Fh,'suiButton1Click'005564CE dw 0Fh005564D0 dd offset Tfxhm@get_text ;suiButton1Click 使用的校驗註冊申請碼 ;和註冊碼並註冊的子程序005564D4 aGet_text db 8,'get_text'005564DD dw 0Fh005564DF dd offset Tfxhm@FormShow ;顯示視窗005564E3 aFormshow_0 db 8,'FormShow'005564EC Tfxhm db 5,'Tfxhm' ;類名005564F2 word_5564F2 dw 5005564F4 dd offset TsuiForm@VMT@Prt ;父輩 TsuiForm 的 VMT 表游標位址......--------------------------------------------------------------------------------
我們分析的所有程式碼都是屬於 Tfxhm@get_text 程序和它的子程序的。 Tfxhm@get_text 起始位址: 0055986C

一、 獲取註冊碼第28位
確定你想註冊姓氏的正確筆劃數(必須和同益資料庫中 slzik 所查到的相同,以繁體字筆畫數為準,同益庫中有些字的筆畫數並不正確,這時你可以在同益起名的姓名分析中獲得姓氏的筆畫數)。在下面的字串串中從左到右查尋,得到第 28 位註冊碼:例如,呂:繁體字為 7 劃。(從0開始數)
0123456 7 89012345678901234567890
0AH6CD3 B EF4TRS2PUV5K1MN78YZ9GIJ
得到的字母為 B,這樣我們的註冊碼有如下形式:(31 位)下面是我們的起始註冊碼
123456789012345678901234567 8 901
123456789ABCDEFGHIJKLMNOPQR S TUV
加入第 28 個字母 B,得如下註冊碼:
123456789ABCDEFGHIJKLMNOPQR B TUV
根據 moon 提出的換位法(4*i+1位和4*(i+1)位互換,i=0,1,2,...,末尾不足4位時,最後兩位互換),25<->28位對調,這個B應該在第25 位
為了便於調位,寫了幾句Delphi的小程序來完成這種操作,還是彙編容易,所以實際還是彙編寫的)


程式碼:--------------------------------------------------------------------------------procedure TForm1.Button2Click(Sender: TObject);var Str: String;begin Str := Edit1.Text; asm PushA Xor Edx, Edx Mov Esi, Str Mov Ecx, 7 @1: Mov Al, [Esi + Edx] Xchg Al, [Esi + Edx + 3] Xchg Al, [Esi + Edx] Dec Ecx Add Edx, 4 Cmp Ecx, 0 Jnz @1 Mov Al, [Esi + Edx + 1] Xchg Al, [Esi + Edx + 2] Xchg Al, [Esi + Edx + 1] PopA end; Edit2.Text := Str;end;--------------------------------------------------------------------------------
在 Edit1 中輸入 123456789ABCDEFGHIJKLMNOPQRBTUV,按 Button2 鍵得到下面的新註冊碼:
新註冊碼為:
123456789012345678901234 5 678901
42318675CAB9GEFDKIJHOMNL B QRPTVU
具體分析請看 moon 的解釋。

二、 獲取註冊碼 23∼27 位註冊碼
用OD載如 UNGDN.exe (脫殼後的程序)


程式碼:--------------------------------------------------------------------------------Tfxhm@get_text............0055CF7E mov eax, ds:AppIDAndName_CryHex@Prt ;註冊申請號加姓氏和1FH 異或得到的結果0055CF83 mov eax, [eax]0055CF85 call sub_4FED88 ;EncodeFunction10055CF8A lea eax, [ebp+var_94] ;這裡斷下獲取計算23-27位的三個字串0055CF8A ;按照 moon幫主的指出的算法可以獲得0055CF90 pus eax0055CF91 lea edx, [ebp+var_98]0055CF97 mov eax, ds:Serial_CryHex@Prt ;註冊號和 1FH 異或得到的結果0055CF9C mov eax, [eax]0055CF9E call CycleConversionStr ;經過 1FH 異或,即還原0055CFA3 mov eax, [ebp+var_98]0055CFA9 mov ecx, 50055CFAE mov edx, 17h0055CFB3 call LStrCopy ;取第 23∼27位0055CFB8 mov eax, [ebp+var_94]0055CFBE lea edx, [ebp+var_90]0055CFC4 call sub_4F0048 ;進行計算得到三個字串,如果和上面計算得到的三個字串相同,則過0055CFC9 mov edx, [ebp+var_90]0055CFCF mov eax, [ebp+var_C]0055CFD2 call LStrCmp ;關鍵比較,比較兩種方式和資料計算得到的三個字串0055CFD7 jnz loc_55D1570055CFDD lea eax, [ebp+var_A0]0055CFE3 push eax0055CFE4 lea edx, [ebp+var_A4]0055CFEA mov eax, ds:Serial_CryHex@Prt0055CFEF mov eax, [eax]0055CFF1 call CycleConversionStr0055CFF6 mov eax, [ebp+var_A4]0055CFFC mov ecx, 50055D001 mov edx, 17h ;取註冊號23~270055D006 call LStrCopy0055D00B mov eax, [ebp+var_A0]0055D011 lea edx, [ebp+var_9C]0055D017 call sub_4F00480055D01C mov edx, [ebp+var_9C]0055D022 mov eax, [ebp+var_C]0055D025 call LStrCmp ;關鍵比較,比較兩種方式和資料計算得到的三個字串,和前面相同0055D02A jnz loc_55D0EA0055D030 lea eax, [ebp+var_A8]0055D036 push eax0055D037 lea edx, [ebp+var_AC]0055D03D mov eax, ds:Serial_CryHex@Prt0055D042 mov eax, [eax]0055D044 call CycleConversionStr0055D049 mov eax, [ebp+var_AC]0055D04F mov ecx, 30055D054 mov edx, 1Dh ;取註冊號 29~31 位0055D059 call LStrCopy0055D05E mov eax, [ebp+var_A8]0055D064 call 31decimalToHex ;對29∼31位註冊碼進行31進制到十六進制的轉換0055D069 mov ebx, eax0055D06B lea eax, [ebp+var_B0]0055D071 push eax0055D072 lea edx, [ebp+var_B4]0055D078 mov eax, ds:Serial_CryHex@Prt ;取註冊號(經過1FH異或處理)0055D07D mov eax, [eax]0055D07F call CycleConversionStr ;經過相同的程序還原0055D084 mov eax, [ebp+var_B4]0055D08A mov ecx, 1Ch0055D08F mov edx, 1 ;取註冊號 1~28 位0055D094 call LStrCopy0055D099 mov eax, [ebp+var_B0]0055D09F call SumSerial_1to28 ;做 1∼28 位累加(中間還有判斷是否大於27000,見moon幫主的解釋)0055D0A4 cmp ebx, eax ;關鍵比較,將前面進制轉換得到的數和累加和比較,在這裡下斷點0055D0A6 jnz loc_55D157 ;因為註冊碼沒有完成,為了能夠繼續,暫時將這句 Nop 掉0055D0AC mov eax, offset a111_2 ; "111"0055D0B1 call CheckSerial_17to22 ;這裡是獲取 17∼22 位註冊碼的入口0055D0B6 mov [ebp+var_1], al0055D0B9 cmp [ebp+var_1], 00055D0BD jz short loc_55D0CC0055D0BF lea eax, [ebp+var_C]0055D0C2 mov edx, offset a111_2 ;"111"0055D0C7 call LStrLAsg0055D0CC0055D0CC loc_55D0CC:0055D0CC cmp [ebp+var_1], 00055D0D0 jz loc_55D1570055D0D6 mov eax, [ebp+var_C]0055D0D9 mov edx, offset a111_2 ;"111"0055D0DE call LStrCmp0055D0E3 jnz short loc_55D0EA0055D0E5 call CheckSerial_1to16 ;這裡是獲取 1∼16 位註冊碼的入口--------------------------------------------------------------------------------
在0055CF8A 處下斷點,F9 執行,出現同益啟動畫面後選『註冊』->『輸入註冊碼',註冊申請碼是不能修改的,由你的機器的 CPU 和硬碟的參數變化而來。在【起名的姓氏】中輸入你的姓氏,我這裡是輸入『呂』,在【輸入註冊碼】中將上面的 123456789ABCDEFGHIJKLMNOBWRSTUV 註冊碼拷貝到輸入視窗。按【註冊】鍵,中斷在 0055CF8A ,清除斷點(或關閉),由 [ebp - c] 中的內容,得到三個字串 VRB,記錄下這三個字串,用moon幫主指出的方法:


求逆方法:
1. 執行到00559D0A,然後下:d [ebp-c],記下資料區顯示的正確值x,y,z;
2. 對3個字元的正確值進行調位,得到灌水限制節a,b,c,d,e,調位方法為:
0,0,0,x7,x6,x5,x4,x3
0,0,0,x2,x1,x0,y5,y4
0,0,0,0 ,y3,y2,y1,y0
0,0,0,y7,y6,z7,z6,z5
0,0,0,z4,z3,z2,z1,z0
3. 根據灌水限制節查表"0KMT1EIJ2AB34FGH56PYZ7NRS89CDUVX",得到5位註冊碼即為23~27位。
--摘自 moon 幫主文


我用Delphi寫了幾句小程序完成這個轉換,程序如下:


程式碼:--------------------------------------------------------------------------------procedure TForm1.Button1Click(Sender: TObject);const Str = '0KMT1EIJ2AB34FGH56PYZ7NRS89CDUVX';var X1, X2: Integer; x, y, z: Char; a, b, c, d, e: string; Pin: string;begin Pin := Edit1.Text; x := Pin[1]; y := Pin[2]; z := Pin[3]; x1 := (Byte(x) shr 3) and $1F; a := Copy(Str, x1 + 1, 1); x1 := ((Byte(x) shl 2) and $1C) or ((Byte(y) shr 4) and $03); b := Copy(Str, x1 + 1, 1); x1 := Byte(y) and $0F; c := Copy(Str, x1 + 1, 1); x1 := ((Byte(y) shr 3) and $18) + ((Byte(z) shr 5) and $07); d := Copy(Str, x1 + 1, 1); x1 := (Byte(z) and $1F); e := Copy(Str, x1 + 1, 1); Edit2.Text := a + b + c + d + e;end;--------------------------------------------------------------------------------
在 Edit1 輸入 VRB 按 Button1 鍵,在 Edit2 視窗中指出我們要的結果 B8MBM 。現在來繼續完善我們的註冊碼。將得到的字串串取代原註冊碼中第 23∼27 位:
1234567890123456789012 34567 8 901
123456789ABCDEFGHIJKLM B8MBM B TUV

用前面的小程序進行調位,得新註冊碼如下:
1234567890123456789012345678901
42318675CAB9GEFDKIJH8MBLBBMMTVU

三、 獲得的 17∼22 位註冊碼:
在OD中按 Ctrl-F2組合鍵,重新執行程序,將 0055D0A6 的 jnz loc_55D157 Nop 掉


程式碼:--------------------------------------------------------------------------------0055D0A6 jnz loc_55D157 ;因為註冊碼沒有完成,為了能夠繼續,暫時將這句 Nop 掉0055D0AC mov eax, offset a111_2 ;"111"0055D0B1 call CheckSerial_17to22 ;這裡是獲取 17∼22 位註冊碼的入口跟進 0055D0B1 call CheckSerial_17to22............ 省略0050C705 mov edx, [ebp+var_20]0050C708 mov eax, [ebp+var_1C]0050C70B call DES_EncryStr ;在這裡進行 DES 的 EncryStr 加密運算,運算結果再經過0050C70B ;另一程序處理,這個子程序我們後面還要用到0050C710 mov edx, [ebp+var_60] ;moon 文中提到在這個位置獲取 17∼22 位註冊碼,可能0050C710 ;是幫主寫文章時粗心了,正確的位置應該在下面移除第5位0050C710 ;相同字母后才取結果。0050C713 lea eax, [ebp+var_20]0050C716 call LStrLAsg0050C71B lea ecx, [ebp+var_64]0050C71E mov eax, [ebp+var_20]0050C721 mov dl, [eax+5] ;取出 EncryStr 運算結果的字串串的第 5 位0050C724 mov eax, [ebp+var_20]0050C727 call DelChr ;將 EncryStr 運算結果中凡是和第5位相同的字母移除0050C72C mov edx, [ebp+var_64]0050C72F lea eax, [ebp+var_20] ;這裡下斷點,從Edx中取前6位,即我們要的第 17-22 位............省略--------------------------------------------------------------------------------

在 0050C72C 處下斷點,按F9 執行,出現同益啟動畫面後選『註冊』->『輸入註冊碼',在【起名的姓氏】中輸入你的姓氏,我這裡是輸入『呂』,在【輸入註冊碼】中將上面的最後得到的註冊碼(42318675CAB9GEFDKIJH8MBLBBMMTVU)拷貝過去。點擊【註冊】按鍵。中斷在 0050C72F,在Edx 返回一個長度為30的字串串(這個字串串的長度是不一定為30的,要看移除相同字串的數目而定),取前 6 為,即為我們要的註冊碼的第 17∼22位,在我們的例子中得到的字串串是:DEDAHI。現在我們來修改我們的註冊碼:

1234567890123456 789012 34567 8 901
123456789ABCDEFG DEDAHI B8MBM B TUV
用前面的小程序調位後得新註冊碼:
1234567890123456789012345678901
42318675CAB9GEFDAEDD8IBHBBMMTVU


四、 獲取 1∼16 位註冊碼
我們首先來看看程序的程式碼,從前面列出的程序最後一句:


程式碼:--------------------------------------------------------------------------------0055D0E5 call CheckSerial_1to16 ;這裡是獲取 1∼16 位註冊碼的入口跟進 call CheckSerial_1to16............省略00508EEB lea edx, [ebp+var_18]00508EEE mov eax, ds:AppIDAndName_CryHex@Prt00508EF3 mov eax, [eax]00508EF5 call ConversionHex10To1600508EFA lea eax, [ebp+var_18]00508EFD lea edx, [ebp+var_8]00508F00 call ConversionHexAndFNameToStr00508F05 lea eax, [ebp+var_20]00508F08 push eax00508F09 lea edx, [ebp+var_24]00508F0C mov eax, ds:Serial_CryHex@Prt00508F11 mov eax, [eax]00508F13 call CycleConversionStr00508F18 mov eax, [ebp+var_24]00508F1B mov ecx, 10h00508F20 mov edx, 1 ;取註冊號 1~16 位00508F25 call LStrCopy00508F2A mov eax, [ebp+var_20]00508F2D lea ecx, [ebp+var_1C]00508F30 mov edx, [ebp+var_8]00508F33 call DES_DecryStr ;這是 DES 的逆運算,我們再跟進00508F38 mov eax, [ebp+var_1C]00508F3B lea edx, [ebp+var_18]00508F3E call ConversionHex10To1600508F43 lea eax, [ebp+var_18]00508F46 push eax00508F47 lea edx, [ebp+var_38]00508F4A mov eax, ds:AppIDAndName_CryHex@Prt00508F4F mov eax, [eax]00508F51 call sub_4FBA7000508F56 mov eax, [ebp+var_38]00508F59 lea edx, [ebp+var_34] ;這裡是我們要下斷點的地方............ 省略跟進 call DES_DecryStr............省略004F788E lea edx, [ebp+var_C]004F7891 mov eax, [ebp+var_4]004F7894 call sub_4E97BC004F7899 mov ecx, ebx004F789B mov edx, [ebp+var_8]004F789E mov eax, [ebp+var_C]004F78A1 call DecryStr ;DES 逆運算004F78A6 xor eax, eax ;這裡是 moon 幫主提出下斷點處,還有一些其他相應的做法 ;請看 moon 原文。............省略--------------------------------------------------------------------------------

在OD中按 Ctrl-F2,重新啟動,在00508F59下斷點,同上,將 0055D0A6 的 jnz loc_55D157 Nop 掉,按F9 執行,出現同益啟動畫面後選『註冊』->『輸入註冊碼',在【起名的姓氏】中輸入你的姓氏,我這裡是輸入『呂』,在【輸入註冊碼】中將上面的最後得到的註冊碼(42318675CAB9GEFDAEDD8IBHBBMMTVU)拷貝過去。點擊【註冊】按鍵。中斷在 00508F59,下面是堆疊內容:


程式碼:--------------------------------------------------------------------------------EBP-38 0012F910 00F303D0 ASCII "5FF51115"EBP-34 0012F914 00000000EBP-30 0012F918 00000000EBP-2C 0012F91C 00000000EBP-28 0012F920 00000000EBP-24 0012F924 00F30038 ASCII "123456789ABCDEFGDEDAHIB8MBMBTUV"EBP-20 0012F928 00F29F5C ASCII "123456789ABCDEFG"EBP-1C 0012F92C 00F3009CEBP-18 0012F930 C338FAD3EBP-14 0012F934 DD5CB3D0EBP-10 0012F938 D5D42656EBP-C 0012F93C A2BB6C94EBP-8 0012F940 00F2FFF8 ASCII "M9BJBBRIDE88TNP4"EBP-4 0012F944 00000000--------------------------------------------------------------------------------
注意: EBP-38 0 00F2A130 ASCII "5FF51115" 這是我們要的 DES 加密的明文。
EBP-8 0> 00F2FFE4 ASCII "M9BJBBRIDE88TNP4" 這是 Key。

按 moon 幫主的方法,修改兩句程式碼,進行逆運算,但我經過努力,總是沒有成功,可能是對 moon 的方法不能深刻的理解,於是決定改用其他的方法。我們注意到如下程式碼:


程式碼:--------------------------------------------------------------------------------004F788E lea edx, [ebp+var_C]004F7891 mov eax, [ebp+var_4]004F7894 call sub_4E97BC004F7899 mov ecx, ebx004F789B mov edx, [ebp+var_8]004F789E mov eax, [ebp+var_C]004F78A1 call DecryStr ;DES 逆運算--------------------------------------------------------------------------------
在最後一句 Call DecryStr 做的其實是DES的逆運算,前面還有一個輔助的運算,我認為,同益的程式碼中一定有一個DES的正向運算,即EncryStr,所以我找了一下,其實就在上面第三節--【獲得的 17∼22 位註冊碼】中出現過,下面我們跟進這個Call:


程式碼:--------------------------------------------------------------------------------0050C70B call DES_EncryStr跟進............省略004F781A lea ecx, [ebp+var_C] ; 返回位址004F781D mov edx, [ebp+var_8] ; Key = M9BJBBRIDE88TNP4004F7820 mov eax, [ebp+var_4] ; Str = 5FF51115004F7823 call EncryStr004F7828 mov edx, ebx004F782A mov eax, [ebp+var_C]004F782D call sub_4E63F4004F7832 xor eax, eax ;這裡下斷點............省略--------------------------------------------------------------------------------
可以看出,它和上面的程式碼正好相反,我們用下面的方法來獲得 1∼16 位的程式碼。
接前面,我們中斷在


程式碼:--------------------------------------------------------------------------------00508F59 lea edx, [ebp+var_34]--------------------------------------------------------------------------------
在程式碼視窗中按 Ctrl-G,輸入004F781A,轉移到 004F781A。按 Ctrl-*,將Eip位址改到 004F781A。
我們要做的工作其實就是修改堆疊的位址,下面是具體操作。


程式碼:--------------------------------------------------------------------------------EBP-38 0012F910 00F303D0 ASCII "5FF51115"EBP-34 0012F914 00000000EBP-30 0012F918 00000000EBP-2C 0012F91C 00000000EBP-28 0012F920 00000000EBP-24 0012F924 00F30038 ASCII "123456789ABCDEFGDEDAHIB8MBMBTUV"EBP-20 0012F928 00F29F5C ASCII "123456789ABCDEFG"EBP-1C 0012F92C 00F3009CEBP-18 0012F930 C338FAD3EBP-14 0012F934 DD5CB3D0EBP-10 0012F938 D5D42656EBP-C 0012F93C A2BB6C94 結果返回位址,這裡改為 0,程序執行時會自行分配新的記憶體EBP-8 0012F940 00F2FFF8 ASCII "M9BJBBRIDE88TNP4"EBP-4 0012F944 00000000 這裡是 Str 所以將這裡改為 00F303D0,也就是[EBP-38] 指向的位址。--------------------------------------------------------------------------------
另外,最終返回結果在 Ebx 中,而Ebx 是由上一級的程序傳送過來的參數,已經由入口程序做過啟始化,所以,必須分配一個有效的返回位址,這點和 [EBP-C] 不同,需要要注意,這裡我們將 [EBP-24] 的堆疊位址分配給 Ebx, 也就是Ebx = 0012F924

改完後堆疊如下:


程式碼:--------------------------------------------------------------------------------EBP-C 0> 00000000EBP-8 0> 00F2FFF8 ASCII "M9BJBBRIDE88TNP4" KeyEBP-4 0> 00F303D0 ASCII "5FF51115" Str在將 Ebx 的內容改為 EBP-24 的堆疊位址,即 Ebx = 0012F924 ASCII "123456789ABCDEFGDEDAHIB8MBMBTUV"--------------------------------------------------------------------------------
在 004F7832 下斷點,F9 執行,d [Ebx], [Ebx] =0VBMHYAMA260CSD1 第 1∼16 位的註冊碼

現在我們來修改我們的註冊碼:
1234567890123456 789012 34567 8 901
0VBMHYAMA260CSD1 DEDAHI B8MBM B TUV

用前面的小程序調位後得新註冊碼:
1234567890123456789012345678901
MVB0MYAH026A1SDCAEDD8IBHBBMMTVU

五、 獲取最後 29∼31 位註冊碼
開啟註冊表編輯器:將Serial中的內容清除:
[HKEY_LOCAL_MACHINE\SOFTWARE\GoodSoft\GoodName]
"Appid"=dword:059c0935
"Serial"="MVB0MYAH026A1SDCAEDD8IBHBBMMTVU"

"Serial"="0"

在OD 中按 Ctrl-F2 重新啟動,將下面兩處 Nop 掉。


程式碼:--------------------------------------------------------------------------------0055CFD2 call LStrCmp ;關鍵比較,比較兩種方式和資料計算得到的三個字串0055CFD7 jnz loc_55D157 ;Nop 這裡
0055D025 call LStrCmp ;關鍵比較,比較兩種方式和資料計算得到的三個字串,和前面相同0055D02A jnz loc_55D0EA ;Nop這裡
0055D0A4 cmp ebx, eax ;關鍵比較,將前面進制轉換得到的數和累加和比較,在這裡下斷點--------------------------------------------------------------------------------
在上面 0055D0A4 處下斷點,F9執行,出現同益啟動畫面後選『註冊』->『輸入註冊碼',在【起名的姓氏】中輸入你的姓氏,我這裡是輸入『呂』,在【輸入註冊碼】中將上面的最後得到的註冊碼(MVB0MYAH026A1SDCAEDD8IBHBBMMTVU)拷貝過去。點擊【註冊】按鍵。中斷在 0055D0A4,記錄下Eax暫存器的內容,我這裡是 2C3AH,換算成十進制數為 11322

根據 moon 幫主的文章:

求逆方法:
1. 執行到00559E24,記下eax中的值x,或按照上面的方法計算出這個值;
2. x除以31,用餘數查表"0AH6CD3BEF4TRS2PUV5K1MN78YZ9GIJ",所得字串作為第31位;
3. 第2步的商除以31,用餘數查表,作為第30位;
4. 第3步的商查表,作為第29位。
--摘自 moon 幫主的文章


寫如下Delphi 的小程序計算最後3位註冊碼。


程式碼:--------------------------------------------------------------------------------procedure TForm1.Button3Click(Sender: TObject);const Str = '0AH6CD3BEF4TRS2PUV5K1MN78YZ9GIJ';var x1, x2: Integer; S1, S2: String;begin x2 := StrToInt(Edit1.Text); x1 := x2 mod 31; S1 := Copy(Str, x1 + 1, 1); x1 := (x2 div 31) mod 31; S2 := Copy(Str, x1 + 1, 1); S1 := S2 + S1; x1 := (x2 div 31) div 31; S2 := Copy(Str, x1 + 1, 1); Edit2.Text := S2 + S1;end;--------------------------------------------------------------------------------
在 Edit1 中輸入 11322,按 Button3 鍵,在 Edit2 中指出結果 T8B

現在我們將獲得最終的註冊號:
1234567890123456 789012 34567 8 901
0VBMHYAMA260CSD1 DEDAHI B8MBM B T8B

用前面的小程序調位後得新註冊碼:
1234567890123456789012345678901
MVB0MYAH026A1SDCAEDD8IBHBBMMTB8

在我的電腦上,註冊號為 MVB0MYAH026A1SDCAEDD8IBHBBMMTB8 ,用未脫殼的原版註冊後所有功能完全正常,公司後面的分析類似,有興趣的朋友可以自己試。

另外,對於Delphi的小程序,什麼版本都可以,但編譯開關 Huge String 要勾上,我使用的是 Delphi 7。
已脫殼版下載
附件
說明:

1、對於調位操作,字串串長度必須是 31 位(不算空格),可以帶空格輸入,這樣比較方便直接拷貝,如可以直接輸入:
"0VBMHYAMA260CSD1 DEDAHI B8MBM B T8B"
2、對於計算最後的第 29∼31 位,可以直接輸入十六進制數,不過要加 '$' 前綴,例如在我們這個例子中,可以直接輸入 $2C3A (不分大小寫)。
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
向 psac 送花的會員:
ambilelexia (2012-12-08)
感謝您發表一篇好文章
 


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 04:54 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1