好友
阅读权限 40
听众
最后登录 1970-1-1
ZeNiX
发表于 2009-5-11 15:02
隨便看看 Photo Slide show 注册算法分析
【破文标题】隨便看看 Photo Slide show 注册算法分析
【破文作者】Zenix Yang
【破解 工具】OllyDbg
【破解平台】Windows XP sp3
【软件名称】Photo Slide Show
【原版下载】自己找
【保护方式】注冊碼
看到 dety 發佈的這篇 [本以为狠简单的算法~~尴尬(已解决 感谢ZeNiX指点)]
覺得很有趣, 有些被弄迷糊的地方, 我來解說一下.
先看幾段程序碼的說明.00420F90 55 push ebp
00420F91 8BEC mov ebp, esp
00420F93 51 push ecx
00420F94 894D FC mov dword ptr [ebp-4], ecx
00420F97 837D 08 00 cmp dword ptr [ebp+8], 0
00420F9B 7C 0D jl short 00420FAA
00420F9D 8B4D FC mov ecx, dword ptr [ebp-4]
00420FA0 E8 2BABFEFF call 0040BAD0 <==== Eax = 這裡取得注冊碼長度
00420FA5 3945 08 cmp dword ptr [ebp+8], eax <==== [ebp+8]=7
00420FA8 7E 0A jle short 00420FB4 <==== 注冊碼長度不可少於 7
00420FAA 68 57000780 push 80070057
00420FAF E8 DC9EFEFF call 0040AE90
00420FB4 8B45 FC mov eax, dword ptr [ebp-4]
00420FB7 8B08 mov ecx, dword ptr [eax] <==== Ecx = 輸入注冊碼地址
00420FB9 8B55 08 mov edx, dword ptr [ebp+8] <==== Edx = 處理過的注冊碼地址
00420FBC 8A0411 mov al, byte ptr [ecx+edx] <==== al = 注冊碼最後一位(第8位)
00420FBF 8BE5 mov esp, ebp
00420FC1 5D pop ebp
00420FC2 C2 0400 retn 4
00421C1A E8 71F3FFFF call 00420F90
00421C1F 8845 FB mov byte ptr [ebp-5], al <=== 注冊碼第8位
00421C22 0FB655 EF movzx edx, byte ptr [ebp-11] <=== 比對注冊碼的第一位'0'
00421C26 0FB645 FC movzx eax, byte ptr [ebp-4]
00421C2A 83E8 30 sub eax, 30
00421C2D 3BD0 cmp edx, eax
00421C2F 75 3C jnz short 00421C6D
00421C31 0FB64D F8 movzx ecx, byte ptr [ebp-8] <=== 比對注冊碼的第二位'9'
00421C35 0FB655 FD movzx edx, byte ptr [ebp-3]
00421C39 83EA 30 sub edx, 30
00421C3C 3BCA cmp ecx, edx
00421C3E 75 2D jnz short 00421C6D
00421C40 0FB645 FF movzx eax, byte ptr [ebp-1]<=== 比對注冊碼的第三位'5'
00421C44 0FB64D F6 movzx ecx, byte ptr [ebp-A]
00421C48 83E9 30 sub ecx, 30
00421C4B 3BC1 cmp eax, ecx
00421C4D 75 1E jnz short 00421C6D
00421C4F 0FB655 FA movzx edx, byte ptr [ebp-6]<=== 比對注冊碼的第四位'7'
00421C53 0FB645 F5 movzx eax, byte ptr [ebp-B]
00421C57 83E8 30 sub eax, 30
00421C5A 3BD0 cmp edx, eax
00421C5C 75 0F jnz short 00421C6D
00421C5E 0FB64D F4 movzx ecx, byte ptr [ebp-C]<=== 比對注冊碼的第五位'7'
00421C62 0FB655 F9 movzx edx, byte ptr [ebp-7]
00421C66 83EA 30 sub edx, 30
00421C69 3BCA cmp ecx, edx
00421C6B 74 58 je short 00421CC5 <=== 這裡跳到注冊成功
------ 底下是萬用注冊碼的檢查 ------00421C6D 0FB645 FC movzx eax, byte ptr [ebp-4]<=== 這裡開始是萬用注冊碼的第一位'5'
00421C71 83F8 35 cmp eax, 35
00421C74 0F85 A7000000 jnz 00421D21
00421C7A 0FB64D FD movzx ecx, byte ptr [ebp-3]<=== 這裡開始是萬用注冊碼的第二位'1'
00421C7E 83F9 31 cmp ecx, 31
00421C81 0F85 9A000000 jnz 00421D21
00421C87 0FB655 F6 movzx edx, byte ptr [ebp-A]<=== 這裡開始是萬用注冊碼的第三位'8'
00421C8B 83FA 38 cmp edx, 38
00421C8E 0F85 8D000000 jnz 00421D21
00421C94 0FB645 F5 movzx eax, byte ptr [ebp-B]<=== 這裡開始是萬用注冊碼的第四位'9'
00421C98 83F8 39 cmp eax, 39
00421C9B 0F85 80000000 jnz 00421D21
00421CA1 0FB64D F9 movzx ecx, byte ptr [ebp-7]<=== 這裡開始是萬用注冊碼的第五位'7'
00421CA5 83F9 37 cmp ecx, 37
00421CA8 75 77 jnz short 00421D21
00421CAA 0FB655 F7 movzx edx, byte ptr [ebp-9]<=== 這裡開始是萬用注冊碼的第六位'6'
00421CAE 83FA 36 cmp edx, 36
00421CB1 75 6E jnz short 00421D21
00421CB3 0FB645 FE movzx eax, byte ptr [ebp-2]<=== 這裡開始是萬用注冊碼的第七位'1'
00421CB7 83F8 31 cmp eax, 31
00421CBA 75 65 jnz short 00421D21
00421CBC 0FB64D FB movzx ecx, byte ptr [ebp-5]<=== 這裡開始是萬用注冊碼的第八位'8'
00421CC0 83F9 38 cmp ecx, 38
00421CC3 75 5C jnz short 00421D21
00421CC5 6A 00 push 0
00421CC7 6A 00 push 0
00421CC9 68 FCAC4500 push 0045ACFC
00421CCE E8 D8AB0200 call 0044C8AB
00421CD3 8B4D E0 mov ecx, dword ptr [ebp-20]
00421CD6 83C1 70 add ecx, 70
00421CD9 E8 323AFFFF call 00415710
00421CDE 50 push eax
00421CDF 68 18AD4500 push 0045AD18 ; ASCII "username"
00421CE4 68 24AD4500 push 0045AD24 ; ASCII "Option"
00421CE9 E8 B239FFFF call 004156A0
00421CEE 8BC8 mov ecx, eax
00421CF0 E8 16A90200 call 0044C60B
00421CF5 8B4D E0 mov ecx, dword ptr [ebp-20]
00421CF8 83C1 74 add ecx, 74
00421CFB E8 103AFFFF call 00415710
00421D00 50 push eax
00421D01 68 2CAD4500 push 0045AD2C ; ASCII "registration_code"
00421D06 68 40AD4500 push 0045AD40 ; ASCII "Option"
00421D0B E8 9039FFFF call 004156A0
00421D10 8BC8 mov ecx, eax
00421D12 E8 F4A80200 call 0044C60B
00421D17 8B4D E0 mov ecx, dword ptr [ebp-20]
00421D1A E8 F34E0200 call 00446C12
00421D1F EB 0E jmp short 00421D2F
00421D21 6A 00 push 0
00421D23 6A 00 push 0
00421D25 68 48AD4500 push 0045AD48
00421D2A E8 7CAB0200 call 0044C8AB
00421D2F 8BE5 mov esp, ebp
00421D31 5D pop ebp
00421D32 C3 retn
因為程序中文化之後, 又被加了殼.
所以我們也懶得去脫, 直接 OD 加載, 帶殼分析吧!
首先我們輸入
UserName : Zenix Yang
Registration Code: 1234567890ABCDEF
跑看看.
--=[專用注冊碼產生]=--
跟蹤之後發現, 前半段是根據 UserName 算出來的注冊做比對.
一直到 00421C6B 就比對完成, 所以它只比對前 5 個字
而根據 00420FA8 的要求, 注冊碼需要大於 7 位.
所以我們得出正確注冊碼如下:
UserName : Zenix Yang
Registration Code: 09577###
其中 ### 為任意字母或數字都可以
--=[萬用注冊碼產生]=--
從 00421C6D 開始, 程序檢查萬用注冊碼.
而這個注冊碼, 是和我們所輸入的 UserName 沒有關係的.
從這裡我們得出另一種正確的注冊碼.
UserName : 任意名字
Registration Code: 51897618
--=[直接爆破法]=--
這個就很多了,
你把上面的那些 jnz 全 Nop 掉,
或是直接在一開始 00421C1F 就直接跳轉到 421CC5
或是... 其它你能想到的.
但是~~~ 提示注冊成功之後, 再進一次程序, 又提示注冊了.
對嗎?
這個就留給朋友們自己去玩了.
吃飯時間到了, 準備約會去~~~
下次再見.
PS.
研究出來的,
本以為上面是黑名單的比對.
後來發現其實不是這個樣子的.
你那個漢化版, 不管是否注冊成, 都不會保存注冊信息到登錄文件裡.
你可以重新下載原版來試看看.
hxxp://www.321slideshow.com
PS-2.
Ask: 看来是汉化的问题。导致不能注册完全。
Q: 漢化版要注冊也是可以的.
先用原版注冊成功後, 再換成漢化版.
又或者, 拿注冊好的登錄文件, 自己導入.
免费评分
查看全部评分