家庭電腦相簿系統標準版6演算法淺析

看雪資料發表於2015-11-15

【破解作者】 mejy【BCG】【DFCG】【FCG】
【作者郵箱】 yjychao@sohu.com
【使用工具】 OD,FI,W32ASM
【破解平臺】 Win9x/NT/2000/XP
【軟體名稱】 家庭相簿製作系統標準版B60
【下載地址】 http://www.skycn.com/soft/2631.html
【軟體簡介】 本軟體是為家庭電腦使用者蒐集圖片和珍藏攝影照片而專門開發的應用工具軟體。該軟體易學易用,其製作的多媒體電腦相簿具有圖片檢索、自動播放和音樂欣賞等多種功能,並能脫離原製作系統獨立執行。將生成的相簿燒錄成光碟,更可永久收藏。當然,你也可以配合其它軟體,製作出遊戲畫面集錦、風景名勝集錦、百科知識寶典、明星集錦和畢業紀念冊等多媒體光碟。企事業單位也可以利用它收藏管理圖片檔案資料。十分鐘成為電腦相簿製作大師已不是夢想。

【軟體大小】 956K
【加殼方式】 aspack2.12
【破解宣告】 我是一隻小菜鳥,偶得一點心得,願與大家分享:)如有雷同,實屬巧合!獻醜了!
--------------------------------------------------------------------------------
【破解內容】


家庭相簿製作系統演算法分析
利用FI檢測主程式Albummake.exe,利用Aspack加殼,利用自動脫殼或手動脫殼輕鬆脫去,檢測發現是DELPHI編寫的,我們進入程式試著輸入試練碼123456789-123發現程式提示"註冊失敗",我們利用DEDE反彙編,這裡利用W32ASM來反彙編,利用"字串資料參考"找到"註冊失敗"的提示,我們雙擊來到W32ASM,我們向上找到下面的位置,好了。下面利用OD來動態除錯,

004A51D8  /. 55             PUSH EBP
004A51D9  |. 8BEC           MOV EBP,ESP
………………………………………………………….省略
004A51ED  |. 55             PUSH EBP
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。省略部分
004A524A  |. 8D4D F8        LEA ECX,DWORD PTR SS:[EBP-8]
004A524D  |. 5A             POP EDX
004A524E  |. E8 4122FFFF    CALL unpak.00497494 註冊碼計算關鍵函式跟進※※※
004A5253  |. 8D95 6CFEFFFF  LEA EDX,DWORD PTR SS:[EBP-194]
004A5259  |. 8B83 1C070000  MOV EAX,DWORD PTR DS:[EBX+71C]
。。。。。。。。。。。。。。。。。。。。。。。。。。省略部分
004A5285  |. E8 1238F6FF    CALL unpak.00408A9C
004A528A  |. 8B95 68FEFFFF  MOV EDX,DWORD PTR SS:[EBP-198]
004A5290  |. 58             POP EAX  將輸入的註冊碼第二步分入棧
004A5291  |. E8 22F8F5FF    CALL unpak.00404AB8比較正確的註冊碼與第二步分
004A5296     0F85 A8010000  JNZ unpak.004A5444
004A529C  |. 8D95 60FEFFFF  LEA EDX,DWORD PTR SS:[EBP-1A0]
004A52A2  |. A1 9C9B4A00    MOV EAX,DWORD PTR DS:[4A9B9C]
004A52A7  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]
004A52A9  |. E8 2AA4FBFF    CALL unpak.0045F6D8
004A52AE  |. 8B85 60FEFFFF  MOV EAX,DWORD PTR SS:[EBP-1A0]
004A52B4  |. 8D95 64FEFFFF  LEA EDX,DWORD PTR SS:[EBP-19C]
004A52BA  |. E8 1D3FF6FF    CALL unpak.004091DC
004A52BF  |. 8B85 64FEFFFF  MOV EAX,DWORD PTR SS:[EBP-19C]
004A52C5  |. 8D55 FC        LEA EDX,DWORD PTR SS:[EBP-4]
004A52C8  |. E8 CF37F6FF    CALL unpak.00408A9C
004A52CD  |. 8D85 5CFEFFFF  LEA EAX,DWORD PTR SS:[EBP-1A4]
004A52D3  |. B9 4C554A00    MOV ECX,unpak.004A554C           ;  ASCII "data3"
將註冊成功後的資料寫入安裝目錄下的data3中,
004A52D8  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
以下略。
※※※※※※※※※※※※※※※※註冊碼計算函式※※※※※※※※※※※※※※
00497494  /$ 55             PUSH EBP
00497495  |. 8BEC           MOV EBP,ESP
00497497  |. 51             PUSH ECX
00497498  |. B9 07000000    MOV ECX,7
0049749D  |> 6A 00          /PUSH 0
0049749F  |. 6A 00          |PUSH 0
004974A1  |. 49             |DEC ECX
004974A2  |.^75 F9          JNZ SHORT unpak.0049749D
004974A4  |. 874D FC        XCHG DWORD PTR SS:[EBP-4],ECX
004974A7  |. 53             PUSH EBX
004974A8  |. 56             PUSH ESI
004974A9  |. 8BF1           MOV ESI,ECX
004974AB  |. 8955 F8        MOV DWORD PTR SS:[EBP-8],EDX 
輸入註冊碼的前一部分
004974AE  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX  EAX為機器號
004974B1  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004974B4  |. E8 A3D6F6FF    CALL unpak.00404B5C
004974B9  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
004974BC  |. E8 9BD6F6FF    CALL unpak.00404B5C
004974C1  |. 33C0           XOR EAX,EAX
004974C3  |. 55             PUSH EBP
004974C4  |. 68 BD764900    PUSH unpak.004976BD
004974C9  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
004974CC  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
004974CF  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
004974D2  |. 50             PUSH EAX
004974D3  |. 8D55 E8        LEA EDX,DWORD PTR SS:[EBP-18]
004974D6  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004974D9  |. E8 BE15F7FF    CALL unpak.00408A9C
004974DE  |. 8B45 E8        MOV EAX,DWORD PTR SS:[EBP-18]
004974E1  |. B9 0B000000    MOV ECX,0B  引數
004974E6  |. BA 03000000    MOV EDX,3    引數
004974EB  |. E8 DCD6F6FF    CALL unpak.00404BCC  
從機器號的第三位開始取長度為0xB的字串。我得  ASCII "49602621006"  下面多次呼叫了這個函式進行求子字串,記結果為字串①
004974F0  |. 8D45 F0        LEA EAX,DWORD PTR SS:[EBP-10]
004974F3  |. 50             PUSH EAX
004974F4  |. B9 06000000    MOV ECX,6
004974F9  |. BA 06000000    MOV EDX,6
004974FE  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]
00497501  |. E8 C6D6F6FF    CALL unpak.00404BCC  從"49602621006"字串中的第六位取長度為6的字串,因為DELPHI的陣列下標從1開始的所以結果為"621006"字串②
00497506  |. 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]
EAX中是上面的字串,利用下面的函式將字串轉化成數字並且轉化成十進位制結果儲存在EAX中
00497509  |. E8 BE18F7FF    CALL unpak.00408DCC將機器號得後六位轉化成十六進位制
0049750E  |. 8BD8           MOV EBX,EAX
00497510  |. 8BC3           MOV EAX,EBX
00497512  |. B9 03000000    MOV ECX,3
00497517  |. 99             CDQ
00497518  |. F7F9           IDIV ECX 將上面得十六進位制數除以3商儲存在EAX
0049751A  |. 8BD8           MOV EBX,EAX  將商轉移給EBX中
0049751C  |. EB 06          JMP SHORT unpak.00497524
0049751E  |> 8BC3           /MOV EAX,EBX
00497520  |. 03C0           |ADD EAX,EAX
00497522  |. 8BD8           |MOV EBX,EAX
00497524  |> 8D55 E4         LEA EDX,DWORD PTR SS:[EBP-1C]
00497527  |. 8BC3           |MOV EAX,EBX
00497529  |. E8 BE17F7FF    |CALL unpak.00408CE
C將商EBX中數轉化成10進位制並且轉化為字串  ASCII "207002" 記為字串③
0049752E  |. 8B45 E4        |MOV EAX,DWORD PTR SS:[EBP-1C]
00497531  |. E8 3ED4F6FF    |CALL unpak.00404974取得字串的長度
00497536  |. 83F8 06        |CMP EAX,6    和6比較
00497539  |.^7C E3          JL SHORT unpak.0049751E
如果小於6跳回,將上面計算的餘數乘2,接著轉化直到其長度大於等於6
0049753B  |. 8D55 F0        LEA EDX,DWORD PTR SS:[EBP-10]
0049753E  |. 8BC3           MOV EAX,EBX
00497540  |. E8 A717F7FF    CALL unpak.00408CEC
00497545  |. 8D45 F0        LEA EAX,DWORD PTR SS:[EBP-10]
00497548  |. 50             PUSH EAX
00497549  |. B9 06000000    MOV ECX,6
0049754E  |. BA 01000000    MOV EDX,1
00497553  |. 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]
00497556  |. E8 71D6F6FF    CALL unpak.00404BCC 如果上面的字串長度超過6則從第一個位置開始取長度為6的字串,這裡長度剛好等於6所以結果為"207002"
0049755B  |. 8D45 EC        LEA EAX,DWORD PTR SS:[EBP-14]
0049755E  |. 50             PUSH EAX
0049755F  |. B9 05000000    MOV ECX,5
00497564  |. BA 01000000    MOV EDX,1
00497569  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]
0049756C  |. E8 5BD6F6FF    CALL unpak.00404BCC
從機器號去掉B6後的第1位開始取長度為5的字串。也就是剩餘的字串0ASCII "49602"
字串④
00497571  |. 8D55 E0        LEA EDX,DWORD PTR SS:[EBP-20]
00497574  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
看見輸入註冊嗎的第一部分"123456789"
00497577  |. E8 2015F7FF    CALL unpak.00408A9C 
0049757C  |. 8B45 E0        MOV EAX,DWORD PTR SS:[EBP-20]
0049757F  |. E8 4818F7FF    CALL unpak.00408DCC 將上面的數字轉化為十六進位制數
00497584  |. 8BD8           MOV EBX,EAX轉化的結果儲存在EBX中
00497586  |. 8B45 EC        MOV EAX,DWORD PTR SS:[EBP-14] 
00497589  |. E8 3E18F7FF    CALL unpak.00408DCC將上面的字串4轉化為十六進位制
0049758E  |. 03D8           ADD EBX,EAX  將上面轉化後的數相加結果儲存在EBX中
00497590  |. D1FB           SAR EBX,1算術右移1位,也就是將EBX/2
00497592  |. 79 0A          JNS SHORT unpak.0049759E
00497594  |. 83D3 00        ADC EBX,0
00497597  |. EB 05          JMP SHORT unpak.0049759E
00497599  |> 8D045B         /LEA EAX,DWORD PTR DS:[EBX+EBX*2]
0049759C  |. 8BD8           |MOV EBX,EAX
0049759E  |> 8D55 DC         LEA EDX,DWORD PTR SS:[EBP-24]
004975A1  |. 8BC3           |MOV EAX,EBX
004975A3  |. E8 4417F7FF    |CALL unpak.00408CEC
轉化成十進位制字串ASCII "61753195"
004975A8  |. 8B45 DC        |MOV EAX,DWORD PTR SS:[EBP-24]
004975AB  |. E8 C4D3F6FF    |CALL unpak.00404974得到字串的長度
004975B0  |. 83F8 06        |CMP EAX,6
004975B3  |.^7C E4          JL SHORT unpak.00497599小於6跳走
如果長度小於6則將EBX的值乘上3繼續轉化
004975B5  |. 8D55 EC        LEA EDX,DWORD PTR SS:[EBP-14]
004975B8  |. 8BC3           MOV EAX,EBX
004975BA  |. E8 2D17F7FF    CALL unpak.00408CEC
004975BF  |. 8D45 EC        LEA EAX,DWORD PTR SS:[EBP-14]
004975C2  |. 50             PUSH EAX
004975C3  |. B9 06000000    MOV ECX,6
004975C8  |. BA 01000000    MOV EDX,1
004975CD  |. 8B45 EC        MOV EAX,DWORD PTR SS:[EBP-14]
004975D0  |. E8 F7D5F6FF    CALL unpak.00404BCC因為上面字串長度為8>6所以取上面字串從第一位開始長度為6的子字串結果為 ASCII "617531"
004975D5  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
004975D8  |. 8B4D EC        MOV ECX,DWORD PTR SS:[EBP-14]
004975DB  |. 8B55 F0        MOV EDX,DWORD PTR SS:[EBP-10]取前6位
004975DE  |. E8 DDD3F6FF    CALL unpak.004049C0將上面求得的字串連線起來
0012F9AC  0119B724  ASCII "207002617531"
004975E3  |. 8D45 F0        LEA EAX,DWORD PTR SS:[EBP-10]
004975E6  |. E8 D1D0F6FF    CALL unpak.004046BC
004975EB  |. 8D45 EC        LEA EAX,DWORD PTR SS:[EBP-14]
004975EE  |. E8 C9D0F6FF    CALL unpak.004046BC
004975F3  |. BB 01000000    MOV EBX,1
下面計算註冊嗎的第一部分,前面取偶數位連線起來
004975F8  |> 8BC3           /MOV EAX,EBX
004975FA  |. D1F8           |SAR EAX,1 算術右移1位 EAX=EAX/2
004975FC  |. 79 03          |JNS SHORT unpak.00497601
004975FE  |. 83D0 00        |ADC EAX,0
00497601  |> 03C0           |ADD EAX,EAX 也就是EAX*2因為大家知道在C++或者DELPHI中,如果對一個整數進行先除以2再乘2,若是偶數其結果和原來資料的相同,若是奇數則結果不想等,這裡就是根據這個來得
00497603  |. 3BD8           |CMP EBX,EAX
00497605  |. 75 37          |JNZ SHORT unpak.0049763E
00497607  |. 8D45 D0        |LEA EAX,DWORD PTR SS:[EBP-30]
0049760A  |. 50             |PUSH EAX
0049760B  |. B9 01000000    |MOV ECX,1
00497610  |. 8BD3           |MOV EDX,EBX
00497612  |. 8B45 F4        |MOV EAX,DWORD PTR SS:[EBP-C]
00497615  |. E8 B2D5F6FF    |CALL unpak.00404BCC
0049761A  |. 8B4D D0        |MOV ECX,DWORD PTR SS:[EBP-30]
0049761D  |. 8D45 D4        |LEA EAX,DWORD PTR SS:[EBP-2C]
00497620  |. 8B55 F0        |MOV EDX,DWORD PTR SS:[EBP-10]
00497623  |. E8 98D3F6FF    |CALL unpak.004049C0連線函式
00497628  |. 8B45 D4        |MOV EAX,DWORD PTR SS:[EBP-2C]
0049762B  |. 8D55 D8        |LEA EDX,DWORD PTR SS:[EBP-28]
0049762E  |. E8 6914F7FF    |CALL unpak.00408A9C
00497633  |. 8B55 D8        |MOV EDX,DWORD PTR SS:[EBP-28]
00497636  |. 8D45 F0        |LEA EAX,DWORD PTR SS:[EBP-10]
00497639  |. E8 16D1F6FF    |CALL unpak.00404754 連線求得的每位字元
0049763E  |> 43             |INC EBX
0049763F  |. 83FB 0D        |CMP EBX,0D看看是否已經完成
00497642  |.^75 B4          JNZ SHORT unpak.004975F8
00497644  |. BB 01000000    MOV EBX,1
取字串的偶數位(注意第一位下標為1),並逐位連線結果為: ASCII "002151"
00497649  |> 8BC3           /MOV EAX,EBX
0049764B  |. D1F8           |SAR EAX,1 右移1位
0049764D  |. 79 03          |JNS SHORT unpak.00497652
0049764F  |. 83D0 00        |ADC EAX,0
00497652  |> 03C0           |ADD EAX,EAX
00497654  |. 3BD8           |CMP EBX,EAX  和上面一樣這裡取奇數位然後連線
00497656  |. 74 37          |JE SHORT unpak.0049768F
00497658  |. 8D45 C4        |LEA EAX,DWORD PTR SS:[EBP-3C]
0049765B  |. 50             |PUSH EAX
0049765C  |. B9 01000000    |MOV ECX,1
00497661  |. 8BD3           |MOV EDX,EBX
00497663  |. 8B45 F4        |MOV EAX,DWORD PTR SS:[EBP-C]
00497666  |. E8 61D5F6FF    |CALL unpak.00404BCC
0049766B  |. 8B4D C4        |MOV ECX,DWORD PTR SS:[EBP-3C]
0049766E  |. 8D45 C8        |LEA EAX,DWORD PTR SS:[EBP-38]
00497671  |. 8B55 EC        |MOV EDX,DWORD PTR SS:[EBP-14]
00497674  |. E8 47D3F6FF    |CALL unpak.004049C0
00497679  |. 8B45 C8        |MOV EAX,DWORD PTR SS:[EBP-38]
0049767C  |. 8D55 CC        |LEA EDX,DWORD PTR SS:[EBP-34]
0049767F  |. E8 1814F7FF    |CALL unpak.00408A9C
00497684  |. 8B55 CC        |MOV EDX,DWORD PTR SS:[EBP-34]
00497687  |. 8D45 EC        |LEA EAX,DWORD PTR SS:[EBP-14]
0049768A  |. E8 C5D0F6FF    |CALL unpak.00404754
0049768F  |> 43             |INC EBX
00497690  |. 83FB 0D        |CMP EBX,0D比較
00497693  |.^75 B4          JNZ SHORT unpak.00497649迴圈2
結果位ASCII "270673"
00497695  |. 8BC6           MOV EAX,ESI
00497697  |. 8B4D EC        MOV ECX,DWORD PTR SS:[EBP-14]
0049769A  |. 8B55 F0        MOV EDX,DWORD PTR SS:[EBP-10]
0049769D  |. E8 1ED3F6FF    CALL unpak.004049C0將上面兩部分連線起來
004976A2  |. 33C0           XOR EAX,EAX
004976A4  |. 5A             POP EDX
004976A5  |. 59             POP ECX
004976A6  |. 59             POP ECX
004976A7  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
004976AA  |. 68 C4764900    PUSH unpak.004976C4
004976AF  |> 8D45 C4        LEA EAX,DWORD PTR SS:[EBP-3C]
004976B2  |. BA 0F000000    MOV EDX,0F
004976B7  |. E8 24D0F6FF    CALL unpak.004046E0
004976BC  . C3             RETN



--------------------------------------------------------------------------------
【破解總結】


演算法總結:先得到軟體序列號,然後去掉編號的前兩位得到一個新的字串1,從字串1的第1個開始5個字元作為第一部分記為字串A,從第6位開始的6個字元做為第二部分記為字串B,如果還有多餘的字串則拋棄掉。然後將B轉化為十六進位制,除以3的商在轉化為十進位制的字串C,並透過轉化將C串的長度最終大於等於6若>6再取前六個字元記為G。接著取輸入註冊碼的第一部分數字轉化成十六進位制,接著將字串A轉化成十六進位制,並將這輛個數加起來除以2,在轉化成十進位制字串,取前六位記為H,然後將G和H連線起來記為M。然後將M按順序先取所有偶數位,再取所有奇數位,重新連線成新的字串,這就是你的註冊碼的第二部分。
註冊資訊儲存在安裝目錄下的data3檔案中。刪去該檔案可重新註冊


--------------------------------------------------------------------------------
【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝!

相關文章