屏保自己做2.61版演算法分析! (7千字)

看雪資料發表於2002-02-18

屏保自己做2.61版演算法分析:(請按照①②③的順序來看破解過程)
下載地址:http://ln.skycn.net/down/ScreenSaver_DIY261.zip
工具:TRW(雖說高手們都說用SOFTICE好,但我是菜鳥,又懶,湊合湊合吧)
開啟TRW,再右擊桌面,調出屬性對話方塊,選ScrnSaver_DIY,點設定,調出主程式,在註冊處填入註冊名和註冊碼,點“註冊”,??????????沒有提示?好,我用bpx hmemcpy攔,攔住後,按F10往前走(走了多少路就不說了,直接來到關鍵處):
:0048FC59 8B45F8                  mov eax, dword ptr [ebp-08]      ①取使用者名稱
:0048FC5C E83343F7FF              call 00403F94                    取使用者名稱長度
:0048FC61 8BF0                    mov esi, eax                      ESI=使用者名稱長度
:0048FC63 85F6                    test esi, esi                    是否為空
:0048FC65 7E3C                    jle 0048FCA3                      為空跳,不為空繼續走
:0048FC67 BF01000000              mov edi, 00000001                把EDI置為1,關於這一行的作用參見③和⑤

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048FCA1(C)
|
:0048FC6C 8B45F8                  mov eax, dword ptr [ebp-08]      ②取使用者名稱
:0048FC6F 33DB                    xor ebx, ebx                      把EBX清0
:0048FC71 8A5C38FF                mov bl, byte ptr [eax+edi-01]    ③取第EDI位使用者名稱的ACDSII十進位制值給EBX(目前EDI為1,則取第1位)
:0048FC75 8BC3                    mov eax, ebx                      把EBX的值給EAX
:0048FC77 F7EB                    imul ebx                          EAX=EAX*EBX
:0048FC79 F7EB                    imul ebx                          再乘一次EBX,這樣,EAX等於EBX的三次方
:0048FC7B 8945EC                  mov dword ptr [ebp-14], eax      [ebp-14]=EAX
:0048FC7E DB45EC                  fild dword ptr [ebp-14]          把[ebp-14]壓棧(其實也就是使用者名稱的三次方)
:0048FC81 D9FA                    fsqrt                            開平方(也就是使用者名稱某一位的ASCII值的三次方的平方根)
:0048FC83 E80C2FF7FF              call 00402B94                    取出這個數
:0048FC88 8BD8                    mov ebx, eax                     
:0048FC8A 8D55E8                  lea edx, dword ptr [ebp-18]
:0048FC8D 8BC3                    mov eax, ebx
:0048FC8F E8588DF7FF              call 004089EC                    轉換成十進位制,設為CODEA
:0048FC94 8B55E8                  mov edx, dword ptr [ebp-18]
:0048FC97 8D45F4                  lea eax, dword ptr [ebp-0C]      ④把CODEA給EAX
:0048FC9A E8FD42F7FF              call 00403F9C                    這個CALL的作用是:把註冊名每一位算出來的CODEA一個一個接起來,比如說,註冊名算得的CODEA分別為1000、1001、1002,則接完之後,則變成100010011002,設累加完後的這個字串為CODEB
:0048FC9F 47                      inc edi                          ⑤EDI加1,這樣如果算沒完的話,回到④處取下一位
:0048FCA0 4E                      dec esi                          ESI減1(ESI為使用者名稱長度)
:0048FCA1 75C9                    jne 0048FC6C                      如果ESI不為0(沒算完),則跳②回處算下一位,如果ESI為0(算完了),則不跳,往下走。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048FC65(C)
|
:0048FCA3 8B45F4                  mov eax, dword ptr [ebp-0C]      ⑥取CODEB
:0048FCA6 E8E942F7FF              call 00403F94                    取CODEB的長度
:0048FCAB 83F80A                  cmp eax, 0000000A                是不是大於十位
:0048FCAE 7E26                    jle 0048FCD6                      是的話直接跳到48FCD6處,開始比較註冊碼,不是的話不跳,往下走
:0048FCB0 8D45E4                  lea eax, dword ptr [ebp-1C]
:0048FCB3 50                      push eax
:0048FCB4 B90A000000              mov ecx, 0000000A
:0048FCB9 BA01000000              mov edx, 00000001
:0048FCBE 8B45F4                  mov eax, dword ptr [ebp-0C]
:0048FCC1 E8D644F7FF              call 0040419C                    把CODEB擷取前十位,設為CODEC,比如前面舉的例子,CODEB為100010011002,則截完後,CODEC為1000100110
:0048FCC6 8B55E4                  mov edx, dword ptr [ebp-1C]
:0048FCC9 8D45F4                  lea eax, dword ptr [ebp-0C]

* Possible StringData Ref from Code Obj ->"asd"
                                  |
:0048FCCC B970FE4800              mov ecx, 0048FE70
:0048FCD1 E80A43F7FF              call 00403FE0                    這個CALL的作用是:把CODEC的後面加上asd這三個字母,設為CODED,比如上面的例子,CODEC為1000100110,則過此處CODED為1000100110asd

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048FCAE(C)
|
:0048FCD6 8D55E0                  lea edx, dword ptr [ebp-20]
:0048FCD9 8B45FC                  mov eax, dword ptr [ebp-04]
:0048FCDC 8B8074030000            mov eax, dword ptr [eax+00000374]
:0048FCE2 E871FEF9FF              call 0042FB58                    ⑦取真註冊碼和假註冊碼
:0048FCE7 8B55E0                  mov edx, dword ptr [ebp-20]      EDX=假碼
:0048FCEA 8B45F4                  mov eax, dword ptr [ebp-0C]      EAX=真碼
:0048FCED E8B243F7FF              call 004040A4                    比較,按F8進入
:0048FCF2 0F8528010000            jne 0048FE20                      ⑨對就不跳,不對則跳
:0048FCF8 8B45FC                  mov eax, dword ptr [ebp-04]
:0048FCFB 8B8080030000            mov eax, dword ptr [eax+00000380]
*************************************************************************************************
48FCED處,進入:
:004040A4 53                      push ebx
:004040A5 56                      push esi
:004040A6 57                      push edi
:004040A7 89C6                    mov esi, eax
:004040A9 89D7                    mov edi, edx
:004040AB 39D0                    cmp eax, edx                      ⑧比較假碼和真碼
:004040AD 0F848F000000            je 00404142                      對就跳,不對不跳
:004040B3 85F6                    test esi, esi
:004040B5 7468                    je 0040411F
:004040B7 85FF                    test edi, edi
:004040B9 746B                    je 00404126
:004040BB 8B46FC                  mov eax, dword ptr [esi-04]
:004040BE 8B57FC                  mov edx, dword ptr [edi-04]
:004040C1 29D0                    sub eax, edx
:004040C3 7702                    ja 004040C7
:004040C5 01C2                    add edx, eax
*************************************************************************************************
總結:由以上分析可知,這個軟體的演算法是:
分別取出使用者名稱的每一位的ASCII十進位制值,三次方後平方根,把每一位的使用者名稱這樣運算之後,一個一個接起來,如果不大於十位的話,直接比較;如果大於十位的話,取前十位,再在後面接上“asd”這個字串,再比較。
舉例:我的使用者名稱是alifriend的話,則a的ASCII十進位制值是97,三次方的平方根是955……依此類推,每一位都這樣算之後,串起來為95511221076103012171086101511541000,因為大於10位,取前十位為9551122107,在後面串上“asd”,所以我的註冊碼為9551122107asd。
*************************************************************************************************
外話:脫殼篇:
破這個東西其實不用脫殼的,但脫了殼抓程式碼比較方便,於是我就開始脫殼。用FI查出它是ASPACK加的殼,可是它是個SCR檔案,我先用PROCDUMP脫,結果PROCDUMP罷工。自動脫殼不行我就用BW+TRW大法,執行它,用BW找到了入口為0049AFA4,我再用TRW載入,結果TRW也罷工。我倒,明明是可執行檔案,裝什麼蒜啊?我把它的副檔名由SCR改成EXE,再用TRW載入,呵呵,OK了,g 0049AFA4,PEDUMP,OK,成功脫殼!
破解:波導終結者[BCG][CNCG]

相關文章