首页
社区
课程
招聘
[原创]Ashampoo Magical Snap 2.31算法详细分析
发表于: 2008-11-29 08:20 6508

[原创]Ashampoo Magical Snap 2.31算法详细分析

2008-11-29 08:20
6508

【破文标题】Ashampoo Magical Snap 2.31算法分析
【破文作者】Playboysen
【作者邮箱】playboysen@126.com
【破解工具】PEiD,OD
【破解平台】Windows XP SP2
【软件名称】Ashampoo Magical Snap 2.31(20081105)
【软件大小】12.7 MB
【软件授权】共享版($14.99)
【软件语言】英文
【原版下载】http://www.ashampoo.com/dl/0224/ashampoo_magicalsnap2_se.exe
【保护方式】注册码
【软件简介】Magical Snap是一款专业的屏幕截图工具.它添加了编辑工具和效果工具还有非常华丽的用户界面. 特点: 3种不同的抓图模式; 多张抓图; 紧密结合--支持全屏抓图; 抓图编辑工具; 高质量效果图容易使用的鼠标工具。支持抓取任意形状,滚动窗口等。
【破解声明】一点心得,愿与大家分享o(∩_∩)o 版权所有,转载注明作者!
【破解内容】
      
    初步踩点:软件无壳,VC7.0编译,单一注册码保护,注册有错误提示,未注册所抓图片有文字水印。
   
    假设注册码为AMASAo-77nhEB-96HD2N(这里说明一下,注册码并不是一开始就假设成这样的,我一开始粗略跟踪用的假码是playboysen963852,跟踪一遍将假码修正为playbo-ysenhu-an9638,再跟踪一遍修正假码为AMASbo-ysenhu-an9638,再跟踪一次将假码修正为AMASAo-77enhu-an9638的,第五遍跟踪才将注册码修正成这样的(当然其实这已经被“修正”为真注册码了^_^)自己跟踪时可随便输入一个假码,自由练习)

    尝试MessageBoxA、MessageBoxW、GetDlgItemTextA断错误提示无果,最终发现软件使用的是GetDlgItemTextW断点,汗~~~
004455DE   > \53              push ebx                                       ;  Case 1 of switch 0044559C
004455DF   .  55              push ebp
004455E0   .  8BAC24 380A0000 mov ebp,dword ptr ss:[esp+A38]
004455E7   .  57              push edi
004455E8   .  6A 20           push 20                                        ; /Count = 20 (32.)
004455EA   .  8D5424 28       lea edx,dword ptr ss:[esp+28]                  ; |
004455EE   .  52              push edx                                       ; |Buffer
004455EF   .  68 F1030000     push 3F1                                       ; |ControlID = 3F1 (1009.)
004455F4   .  55              push ebp                                       ; |hWnd
004455F5   .  FF15 58144800   call dword ptr ds:[<&USER32.GetDlgItemTextW>]  ; \GetDlgItemTextW
004455FB   .  8D4424 24       lea eax,dword ptr ss:[esp+24]                  ;  注册码出现
004455FF   .  50              push eax                                       ; /Arg1
00445600   .  8D4C24 18       lea ecx,dword ptr ss:[esp+18]                  ; |
00445604   .  E8 47DAFBFF     call ashsnap.00403050                          ; \关键处,F7进入
00445609   .  68 4C774E00     push ashsnap.004E774C                          ; /Arg1 = 004E774C
0044560E   .  8D4C24 20       lea ecx,dword ptr ss:[esp+20]                  ; |
00445612   .  C78424 380A0000>mov dword ptr ss:[esp+A38],0                   ; |
0044561D   .  E8 2EDAFBFF     call ashsnap.00403050                          ; \同上,关键

跟入00445604处关键算法call

00403050  /$  83EC 40         sub esp,40
00403053  |.  8B4424 44       mov eax,dword ptr ss:[esp+44]
......
00403068  |.  C706 00000000   mov dword ptr ds:[esi],0
0040306E  |.  E8 0DF50200     call ashsnap.00432580                          ;  kernel32.WideCharToMultiByte
00403073  |.  8B15 98204800   mov edx,dword ptr ds:[482098]
......
004030C3  |.  52              push edx
004030C4  |.  E8 573A0500     call ashsnap.00456B20                          ;  关键call,F7进入
004030C9  |.  83C4 20         add esp,20
00456B20  /$  8B4424 14       mov eax,dword ptr ss:[esp+14]
00456B24  |.  8B4C24 10       mov ecx,dword ptr ss:[esp+10]
......
00456B3F  |.  55              push ebp
00456B40  |.  E8 EBFDFFFF     call ashsnap.00456930                          ;  关键call,F7进入
00456B45  |.  83C4 14         add esp,14
00456B48  |.  84C0            test al,al
00456B4A  |.  74 20           je short ashsnap.00456B6C
00456930  /$  83EC 44         sub esp,44
00456933  |.  83C9 FF         or ecx,FFFFFFFF
00456936  |.  33C0            xor eax,eax
00456938  |.  53              push ebx
00456939  |.  55              push ebp
0045693A  |.  56              push esi
0045693B  |.  8B7424 54       mov esi,dword ptr ss:[esp+54]
0045693F  |.  57              push edi
00456940  |.  8BFE            mov edi,esi                                    ;  注册码放入EDI
00456942  |.  F2:AE           repne scas byte ptr es:[edi]                   ;  计算注册码的长度
00456944  |.  F7D1            not ecx
00456946  |.  49              dec ecx
00456947  |.  83F9 14         cmp ecx,14                                     ;  注册码必须20位
0045694A  |.  0F85 BE010000   jnz ashsnap.00456B0E
00456950  |.  8A4E 06         mov cl,byte ptr ds:[esi+6]                     ;  注册码第七位必须是"-"
00456953  |.  B0 2D           mov al,2D
00456955  |.  3AC8            cmp cl,al
00456957  |.  0F85 B1010000   jnz ashsnap.00456B0E
0045695D  |.  3846 0D         cmp byte ptr ds:[esi+D],al                     ;  注册码第十四位必须是"-"
00456960  |.  0F85 A8010000   jnz ashsnap.00456B0E
00456966  |.  6A 04           push 4
00456968  |.  8D4424 20       lea eax,dword ptr ss:[esp+20]
0045696C  |.  56              push esi
0045696D  |.  50              push eax
0045696E  |.  E8 BD24FFFF     call ashsnap.00448E30                          ;  提取注册码前四位
00456973  |.  8D6E 04         lea ebp,dword ptr ds:[esi+4]
00456976  |.  6A 01           push 1
00456978  |.  8D4C24 68       lea ecx,dword ptr ss:[esp+68]
0045697C  |.  55              push ebp
0045697D  |.  51              push ecx
0045697E  |.  E8 AD24FFFF     call ashsnap.00448E30                          ;  提取注册码第五位
00456983  |.  8D56 05         lea edx,dword ptr ds:[esi+5]
00456986  |.  6A 01           push 1
00456988  |.  8D4424 48       lea eax,dword ptr ss:[esp+48]
0045698C  |.  52              push edx
0045698D  |.  50              push eax
0045698E  |.  E8 9D24FFFF     call ashsnap.00448E30                          ;  提取注册码第六位("-"被忽略)
00456993  |.  8D4E 07         lea ecx,dword ptr ds:[esi+7]
00456996  |.  6A 02           push 2
00456998  |.  8D5424 38       lea edx,dword ptr ss:[esp+38]
0045699C  |.  51              push ecx
0045699D  |.  52              push edx
0045699E  |.  E8 8D24FFFF     call ashsnap.00448E30                          ;  提取注册码第八九位
004569A3  |.  8D46 09         lea eax,dword ptr ds:[esi+9]
004569A6  |.  6A 02           push 2
004569A8  |.  8D4C24 61       lea ecx,dword ptr ss:[esp+61]
004569AC  |.  50              push eax
004569AD  |.  51              push ecx
004569AE  |.  E8 7D24FFFF     call ashsnap.00448E30                          ;  提取注册码第十、十一位
004569B3  |.  8D56 0B         lea edx,dword ptr ds:[esi+B]
004569B6  |.  6A 02           push 2
004569B8  |.  8D4424 54       lea eax,dword ptr ss:[esp+54]
004569BC  |.  52              push edx
004569BD  |.  50              push eax
004569BE  |.  E8 6D24FFFF     call ashsnap.00448E30                          ;  分析注册码第十二、十三位
004569C3  |.  83C4 48         add esp,48
004569C6  |.  8D4E 0E         lea ecx,dword ptr ds:[esi+E]
004569C9  |.  8D5424 2F       lea edx,dword ptr ss:[esp+2F]
004569CD  |.  6A 03           push 3
004569CF  |.  51              push ecx
004569D0  |.  52              push edx
004569D1  |.  E8 5A24FFFF     call ashsnap.00448E30                          ;  分离注册码15-17位
004569D6  |.  8D46 11         lea eax,dword ptr ds:[esi+11]
004569D9  |.  6A 02           push 2
004569DB  |.  8D4C24 26       lea ecx,dword ptr ss:[esp+26]
004569DF  |.  50              push eax
004569E0  |.  51              push ecx
004569E1  |.  E8 4A24FFFF     call ashsnap.00448E30
004569E6  |.  8D56 13         lea edx,dword ptr ds:[esi+13]
004569E9  |.  6A 01           push 1
004569EB  |.  8D4424 4E       lea eax,dword ptr ss:[esp+4E]
004569EF  |.  52              push edx
004569F0  |.  50              push eax
004569F1  |.  E8 3A24FFFF     call ashsnap.00448E30                          ;  分离出注册码最后一位
004569F6  |.  8D4C24 50       lea ecx,dword ptr ss:[esp+50]                  ;  字符串组合“onh96HN”
......
00456A54  |.  E8 D723FFFF     call ashsnap.00448E30
00456A59  |.  8B7C24 68       mov edi,dword ptr ss:[esp+68]                  ;  固定字符串"sk()44$$GFSNM099023$"
00456A5D  |.  8D4424 40       lea eax,dword ptr ss:[esp+40]                  ;  字符串组合"onh96HNA77AMAS"
00456A61  |.  57              push edi
00456A62  |.  6A 0E           push 0E                                        ;  常数14(参数之一)
00456A64  |.  50              push eax
00456A65  |.  E8 46040000     call ashsnap.00456EB0                          ;  截取"sk()44$$GFSNM099023$"后6位放入EDX
00456A6A  |.  57              push edi
00456A6B  |.  8D4C24 50       lea ecx,dword ptr ss:[esp+50]
00456A6F  |.  6A 0E           push 0E                                        ;  常数14(参数之一)
00456A71  |.  51              push ecx
00456A72  |.  E8 B9030000     call ashsnap.00456E30                          ;  这里直接关系到00456A8E的值,关键
00456A77  |.  50              push eax
00456A78  |.  8D5424 4C       lea edx,dword ptr ss:[esp+4C]
00456A7C  |.  68 B0B94900     push ashsnap.0049B9B0                          ;  %04x
00456A81  |.  52              push edx
00456A82  |.  E8 6B0AFFFF     call ashsnap.004474F2
00456A87  |.  83C4 30         add esp,30
00456A8A  |.  8D7C24 14       lea edi,dword ptr ss:[esp+14]                  ;  从注册码中提取出的值"EBD2"
00456A8E  |.  8D4424 24       lea eax,dword ptr ss:[esp+24]                  ;  这个值是上面的关键call计算出的
00456A92  |>  8A10            /mov dl,byte ptr ds:[eax]                      ;  这一段循环很显然是比较上面两个值是否相等
00456A94  |.  8ACA            |mov cl,dl
......
00456AAE  |.  3ACB            |cmp cl,bl
00456AB0  |.^ 75 E0           \jnz short ashsnap.00456A92
00456AB2  |>  33C0            xor eax,eax
00456AB4  |.  EB 05           jmp short ashsnap.00456ABB
00456E30  /$  8B5424 0C       mov edx,dword ptr ss:[esp+C]
00456E34  |.  57              push edi
00456E35  |.  8BFA            mov edi,edx
00456E37  |.  83C9 FF         or ecx,FFFFFFFF
00456E3A  |.  33C0            xor eax,eax
00456E3C  |.  F2:AE           repne scas byte ptr es:[edi]                   ;  求"sk()44$$GFSNM099023$"长度
00456E3E  |.  F7D1            not ecx
00456E40  |.  49              dec ecx
00456E41  |.  5F              pop edi
00456E42  |.  83F9 03         cmp ecx,3
00456E45  |.  72 18           jb short ashsnap.00456E5F                      ;  我们设"sk()44$$GFSNM099023$"为Y
00456E47  |.  0FBE42 01       movsx eax,byte ptr ds:[edx+1]                  ;  Y的第二位 k
00456E4B  |.  0FBE0A          movsx ecx,byte ptr ds:[edx]                    ;  Y的第一位 s
00456E4E  |.  0FBE52 02       movsx edx,byte ptr ds:[edx+2]                  ;  Y的第三位 (
00456E52  |.  C1E0 04         shl eax,4                                      ;  对这三位做运算
00456E55  |.  0BC1            or eax,ecx
00456E57  |.  C1E0 10         shl eax,10
00456E5A  |.  0BC2            or eax,edx
00456E5C  |.  C1E0 03         shl eax,3                                      ;  到这里算出值 EAX=37980140
00456E5F  |>  8B4C24 08       mov ecx,dword ptr ss:[esp+8]                   ;  常数14
00456E63  |.  8B5424 04       mov edx,dword ptr ss:[esp+4]
00456E67  |.  56              push esi                                       ;  注册码值
00456E68  |.  51              push ecx
00456E69  |.  52              push edx
00456E6A  |.  50              push eax                                       ;  上面是四个参数,EAX即可上面算出的值
00456E6B  |.  E8 90FEFFFF     call ashsnap.00456D00                          ;  得出另外一个运算函数
00456E70  |.  8BC8            mov ecx,eax                                    ;  运算结果放入ECX保存,EAX继续运算
00456E72  |.  83C4 0C         add esp,0C
00456E75  |.  C1E8 09         shr eax,9                                      ;  又是一串运算,位移、与、或、异或等等
00456E78  |.  8BD1            mov edx,ecx                                    ;  但是不用怕,这种平铺直叙的运算我们可懒得去逆向
00456E7A  |.  25 00F87F00     and eax,7FF800                                 ;  直接复制出来,Delphi嵌入汇编搞定
00456E7F  |.  81E2 80070000   and edx,780                                    ;  不过说实话,这些运算基本上在高级语言中都可以直接还原的
......
00456EA5  |.  33C2            xor eax,edx
00456EA7  |.  5E              pop esi
00456EA8  |.  33C1            xor eax,ecx                                    ;  到这里,终于算完了,幸亏运算很简单
00456EAA  \.  C3              retn

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 196
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持楼主,分析很详细,彻底搞清楚算法比爆破,更加让人欣喜啊
2008-11-29 12:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
厉害,这是怎么搞出来的。。。
2008-11-29 13:56
0
雪    币: 590
活跃值: (177)
能力值: ( LV9,RANK:680 )
在线值:
发帖
回帖
粉丝
4
有点耐心,一步一步看呗
习惯了就好了
2008-11-30 19:30
0
游客
登录 | 注册 方可回帖
返回
//