正如标题所说,这是前几天小马哥刚刚发的一个帖子里的软件Video Splitter Business/Home Edition 6.1 优雅补丁 By Smallhorsehttps://www.chinapyg.com/thread-121590-1-1.html
抽空分析了一下算法,然而刚刚分析完后作者就升级了新版本,用了VMP的注册,算法也改变了,新版我是搞不定了。不过没关系,我只是玩玩,打发时间,说一下6.1版本的算法分析吧,应该还是比较简单吧
关键算法应该很容易就定位到,是这里
[Asm] 纯文本查看 复制代码 0044E4C0 /$ 55 push ebp
0044E4C1 |. 8BEC mov ebp,esp
0044E4C3 |. 81EC 08040000 sub esp,0x408
0044E4C9 |. A1 34C5BC00 mov eax,dword ptr ds:[0xBCC534]
0044E4CE |. 33C5 xor eax,ebp
0044E4D0 |. 8945 FC mov [local.1],eax
0044E4D3 |. 56 push esi ; SMMVSpli.007EE7B8
0044E4D4 |. C685 FCFDFFFF>mov byte ptr ss:[ebp-0x204],0x0
0044E4DB |. 68 FF010000 push 0x1FF
0044E4E0 |. 6A 00 push 0x0
会得到一个字符串0012E848 02E7F878 ASCII "SolveigMM Video Splitter Business Edition6",下面会对字符串转大写和MD5
[Asm] 纯文本查看 复制代码 0044E528 |. E8 B5735B00 call SMMVSpli.00A058E2 ; 转大写
0044E52D |. 83C4 04 add esp,0x4
0044E530 |. 8D95 FCFBFFFF lea edx,[local.257]
0044E536 |. 52 push edx
0044E537 |. E8 541D0000 call SMMVSpli.00450290 ; MD5
0044E53C |. 83C4 04 add esp,0x4
下面有个关键的call,是这样子的,看一下注释
[Asm] 纯文本查看 复制代码 0044E551 |. E8 FA060000 call SMMVSpli.0044EC50 ; 注册码每位减去md5的值后得到新的字符串
F7跟进去可以看一下过程,关键就这么多
[Asm] 纯文本查看 复制代码 0044EBFF |. 0FB655 0C movzx edx,byte ptr ss:[ebp+0xC]
0044EC03 |. 52 push edx
0044EC04 |. E8 77FFFFFF call SMMVSpli.0044EB80
0044EC09 |. 83C4 04 add esp,0x4
0044EC0C |. 2BF0 sub esi,eax
0044EC0E |. 8975 F8 mov [local.2],esi ; SMMVSpli.007EE7B8
0044EC11 |. 79 09 jns short SMMVSpli.0044EC1C
0044EC13 |. 8B45 F8 mov eax,[local.2]
0044EC16 |. 83C0 10 add eax,0x10
0044EC19 |. 8945 F8 mov [local.2],eax
0044EC1C |> 8B4D F8 mov ecx,[local.2]
然后将新的字符串转大写,这是过程
[Asm] 纯文本查看 复制代码 0044E565 |> /8B85 F8FBFFFF /mov eax,[local.258]
0044E56B |. |83C0 01 |add eax,0x1
0044E56E |. |8985 F8FBFFFF |mov [local.258],eax
0044E574 |> |8D8D FCFDFFFF lea ecx,[local.129]
0044E57A |. |51 |push ecx
0044E57B |. |E8 600F5800 |call SMMVSpli.009CF4E0 ; 得到变换后新字符串的长度
0044E580 |. |83C4 04 |add esp,0x4
0044E583 |. |3985 F8FBFFFF |cmp [local.258],eax
0044E589 |. |0F83 95000000 |jnb SMMVSpli.0044E624
0044E58F |. |8B95 F8FBFFFF |mov edx,[local.258]
0044E595 |. |0FBE8415 FCFD>|movsx eax,byte ptr ss:[ebp+edx-0x204]
0044E59D |. |83F8 61 |cmp eax,0x61 ; a
0044E5A0 |. |74 5F |je short SMMVSpli.0044E601
0044E5A2 |. |8B8D F8FBFFFF |mov ecx,[local.258]
0044E5A8 |. |0FBE940D FCFD>|movsx edx,byte ptr ss:[ebp+ecx-0x204]
0044E5B0 |. |83FA 62 |cmp edx,0x62
0044E5B3 |. |74 4C |je short SMMVSpli.0044E601
0044E5B5 |. |8B85 F8FBFFFF |mov eax,[local.258]
0044E5BB |. |0FBE8C05 FCFD>|movsx ecx,byte ptr ss:[ebp+eax-0x204]
0044E5C3 |. |83F9 63 |cmp ecx,0x63
0044E5C6 |. |74 39 |je short SMMVSpli.0044E601
0044E5C8 |. |8B95 F8FBFFFF |mov edx,[local.258]
0044E5CE |. |0FBE8415 FCFD>|movsx eax,byte ptr ss:[ebp+edx-0x204]
0044E5D6 |. |83F8 64 |cmp eax,0x64
0044E5D9 |. |74 26 |je short SMMVSpli.0044E601
0044E5DB |. |8B8D F8FBFFFF |mov ecx,[local.258]
0044E5E1 |. |0FBE940D FCFD>|movsx edx,byte ptr ss:[ebp+ecx-0x204]
0044E5E9 |. |83FA 65 |cmp edx,0x65
0044E5EC |. |74 13 |je short SMMVSpli.0044E601
0044E5EE |. |8B85 F8FBFFFF |mov eax,[local.258]
0044E5F4 |. |0FBE8C05 FCFD>|movsx ecx,byte ptr ss:[ebp+eax-0x204]
0044E5FC |. |83F9 66 |cmp ecx,0x66 ; f
0044E5FF |. |75 1E |jnz short SMMVSpli.0044E61F
0044E601 |> |8B95 F8FBFFFF |mov edx,[local.258]
0044E607 |. |0FBE8415 FCFD>|movsx eax,byte ptr ss:[ebp+edx-0x204]
0044E60F |. |83E8 20 |sub eax,0x20
0044E612 |. |8B8D F8FBFFFF |mov ecx,[local.258]
0044E618 |. |88840D FCFDFF>|mov byte ptr ss:[ebp+ecx-0x204],al
0044E61F |>^\E9 41FFFFFF \jmp SMMVSpli.0044E565
接下来就是比较关键的部分了,对新字符串的第18位做了个判断,然后再做了一系列的处理
[Asm] 纯文本查看 复制代码 0044E641 |. 6BC8 11 imul ecx,eax,0x11
0044E644 |. 0FBE940D FCFD>movsx edx,byte ptr ss:[ebp+ecx-0x204] ; 取新字符串的第18位
0044E64C |. 83FA 30 cmp edx,0x30 ; 0
0044E64F |. 0F84 9B000000 je SMMVSpli.0044E6F0
0044E655 |. B8 01000000 mov eax,0x1
代码者类似,如这样子
[Asm] 纯文本查看 复制代码 0044E6F0 |> \B8 01000000 mov eax,0x1
0044E6F5 |. 6BC8 14 imul ecx,eax,0x14
0044E6F8 |. 0FB6940D FCFD>movzx edx,byte ptr ss:[ebp+ecx-0x204] ; 取新字符串的第21位
0044E700 |. 52 push edx
0044E701 |. E8 7A040000 call SMMVSpli.0044EB80 ; 字符串转16进制
0044E706 |. 83C4 04 add esp,0x4
0044E709 |. 83C0 17 add eax,0x17 ; 加上23
0044E70C |. 8BF0 mov esi,eax
0044E70E |. 81E6 0F000080 and esi,0x8000000F
0044E714 |. 79 05 jns short SMMVSpli.0044E71B
0044E716 |. 4E dec esi ; SMMVSpli.007EE7B8
0044E717 |. 83CE F0 or esi,-0x10
0044E71A |. 46 inc esi ; SMMVSpli.007EE7B8
0044E71B |> B8 01000000 mov eax,0x1
0044E720 |. D1E0 shl eax,1
0044E722 |. 0FB68C05 FCFD>movzx ecx,byte ptr ss:[ebp+eax-0x204] ; 取新字符串的第3位
0044E72A |. 51 push ecx
0044E72B |. E8 50040000 call SMMVSpli.0044EB80
0044E730 |. 83C4 04 add esp,0x4
0044E733 |. 3BF0 cmp esi,eax
0044E735 |. 74 07 je short SMMVSpli.0044E73E
0044E737 |. 33C0 xor eax,eax
0044E739 |. E9 25040000 jmp SMMVSpli.0044EB63
0044E73E |> BA 01000000 mov edx,0x1
应该是比较长吧,我总结了一下是这样子
取新字符串的第18位
如果是02468ACE的话
取新字符串的第21位转成16进制后加上23再取结果的最后一位记为N1,
取新字符串的第3位记为N2
要求N1==N2
取新字符串的第13位转成16进制后加上27,再取结果的最后一位,记为N3
取新字符串的第7位转成16进制后记为N4
要求N3==N4
取新字符串的第1位转16进制后加上21,再取结果的最后一位,记为N5
取新字符串的第14位转16进制后记为N6
要求N5==N6
取新字符串的第10位转16进制后加上29,再取结果的最后一位,记为N7
取新字符串的第19位转16进制后记为N8
要求N7==N8
取新字符串的第2位转16进制后加上17,再取结果的最后一位,记为N9
取新字符串的第25位转16进制后记为N10
要求N9==N10
取新字符串的第12位转16进制后加上25,再取结果的最后一位,记为N11
取新字符串的第30位转16进制后记为N12
要求N11==N2
如果是13579BDF的话,
取新字符串的第16位转成16进制后加上26再取结果的最后一位记为S1,
取新字符串的第3位记为S2
要求S1==S2
取新字符串的第4位转成16进制后加上18,再取结果的最后一位,记为S3
取新字符串的第6位转成16进制后记为S4
要求S3==S4
取新字符串的第9位转16进制后加上19,再取结果的最后一位,记为S5
取新字符串的第15位转16进制后记为S6
要求S5==S6
取新字符串的第22位转16进制后加上22,再取结果的最后一位,记为S7
取新字符串的第17位转16进制后记为S8
要求S7==S8
取新字符串的第11位转16进制后加上31,再取结果的最后一位,记为S9
取新字符串的第23位转16进制后记为S10
要求S9==S10
取新字符串的第32位转16进制后加上23,再取结果的最后一位,记为S11
取新字符串的第29位转16进制后记为S12
要求S11==S12 根据上面的意思,就可以得到一组注册码了:730b65b8ce5fe5bb39c0af483367eaa5
再次感谢GG老师及一起玩游戏小组全体成员!
来自群组: 一起玩游戏 |