| 正如标题所说,这是前几天小马哥刚刚发的一个帖子里的软件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
应该是比较长吧,我总结了一下是这样子
 
 根据上面的意思,就可以得到一组注册码了:730b65b8ce5fe5bb39c0af483367eaa5取新字符串的第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
 再次感谢GG老师及一起玩游戏小组全体成员!
 
 来自群组: 一起玩游戏
 |