wgz001 发表于 2018-12-9 21:02:49

还没开始就已经结束了,哈哈

正如标题所说,这是前几天小马哥刚刚发的一个帖子里的软件Video Splitter Business/Home Edition 6.1 优雅补丁 By Smallhorsehttps://www.chinapyg.com/thread-121590-1-1.html
抽空分析了一下算法,然而刚刚分析完后作者就升级了新版本,用了VMP的注册,算法也改变了,新版我是搞不定了。不过没关系,我只是玩玩,打发时间,说一下6.1版本的算法分析吧{:lol:},应该还是比较简单吧
关键算法应该很容易就定位到,是这里
0044E4C0/$55            push ebp
0044E4C1|.8BEC          mov ebp,esp
0044E4C3|.81EC 08040000 sub esp,0x408
0044E4C9|.A1 34C5BC00   mov eax,dword ptr ds:
0044E4CE|.33C5          xor eax,ebp
0044E4D0|.8945 FC       mov ,eax
0044E4D3|.56            push esi                                 ;SMMVSpli.007EE7B8
0044E4D4|.C685 FCFDFFFF>mov byte ptr ss:,0x0
0044E4DB|.68 FF010000   push 0x1FF
0044E4E0|.6A 00         push 0x0



会得到一个字符串0012E848   02E7F878ASCII "SolveigMM Video Splitter Business Edition6",下面会对字符串转大写和MD5
0044E528|.E8 B5735B00   call SMMVSpli.00A058E2                   ;转大写
0044E52D|.83C4 04       add esp,0x4
0044E530|.8D95 FCFBFFFF lea edx,
0044E536|.52            push edx
0044E537|.E8 541D0000   call SMMVSpli.00450290                   ;MD5
0044E53C|.83C4 04       add esp,0x4


下面有个关键的call,是这样子的,看一下注释
0044E551|.E8 FA060000   call SMMVSpli.0044EC50                   ;注册码每位减去md5的值后得到新的字符串


F7跟进去可以看一下过程,关键就这么多
0044EBFF|.0FB655 0C   movzx edx,byte ptr ss:
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 ,esi                        ;SMMVSpli.007EE7B8
0044EC11|.79 09         jns short SMMVSpli.0044EC1C
0044EC13|.8B45 F8       mov eax,
0044EC16|.83C0 10       add eax,0x10
0044EC19|.8945 F8       mov ,eax
0044EC1C|>8B4D F8       mov ecx,


然后将新的字符串转大写,这是过程
0044E565|> /8B85 F8FBFFFF /mov eax,
0044E56B|. |83C0 01       |add eax,0x1
0044E56E|. |8985 F8FBFFFF |mov ,eax
0044E574|> |8D8D FCFDFFFFlea ecx,
0044E57A|. |51            |push ecx
0044E57B|. |E8 600F5800   |call SMMVSpli.009CF4E0                  ;得到变换后新字符串的长度
0044E580|. |83C4 04       |add esp,0x4
0044E583|. |3985 F8FBFFFF |cmp ,eax
0044E589|. |0F83 95000000 |jnb SMMVSpli.0044E624
0044E58F|. |8B95 F8FBFFFF |mov edx,
0044E595|. |0FBE8415 FCFD>|movsx eax,byte ptr ss:
0044E59D|. |83F8 61       |cmp eax,0x61                            ;a
0044E5A0|. |74 5F         |je short SMMVSpli.0044E601
0044E5A2|. |8B8D F8FBFFFF |mov ecx,
0044E5A8|. |0FBE940D FCFD>|movsx edx,byte ptr ss:
0044E5B0|. |83FA 62       |cmp edx,0x62
0044E5B3|. |74 4C         |je short SMMVSpli.0044E601
0044E5B5|. |8B85 F8FBFFFF |mov eax,
0044E5BB|. |0FBE8C05 FCFD>|movsx ecx,byte ptr ss:
0044E5C3|. |83F9 63       |cmp ecx,0x63
0044E5C6|. |74 39         |je short SMMVSpli.0044E601
0044E5C8|. |8B95 F8FBFFFF |mov edx,
0044E5CE|. |0FBE8415 FCFD>|movsx eax,byte ptr ss:
0044E5D6|. |83F8 64       |cmp eax,0x64
0044E5D9|. |74 26         |je short SMMVSpli.0044E601
0044E5DB|. |8B8D F8FBFFFF |mov ecx,
0044E5E1|. |0FBE940D FCFD>|movsx edx,byte ptr ss:
0044E5E9|. |83FA 65       |cmp edx,0x65
0044E5EC|. |74 13         |je short SMMVSpli.0044E601
0044E5EE|. |8B85 F8FBFFFF |mov eax,
0044E5F4|. |0FBE8C05 FCFD>|movsx ecx,byte ptr ss:
0044E5FC|. |83F9 66       |cmp ecx,0x66                            ;f
0044E5FF|. |75 1E         |jnz short SMMVSpli.0044E61F
0044E601|> |8B95 F8FBFFFF |mov edx,
0044E607|. |0FBE8415 FCFD>|movsx eax,byte ptr ss:
0044E60F|. |83E8 20       |sub eax,0x20
0044E612|. |8B8D F8FBFFFF |mov ecx,
0044E618|. |88840D FCFDFF>|mov byte ptr ss:,al
0044E61F|>^\E9 41FFFFFF   \jmp SMMVSpli.0044E565



接下来就是比较关键的部分了,对新字符串的第18位做了个判断,然后再做了一系列的处理
0044E641|.6BC8 11       imul ecx,eax,0x11
0044E644|.0FBE940D FCFD>movsx edx,byte ptr ss:    ;取新字符串的第18位
0044E64C|.83FA 30       cmp edx,0x30                           ;0
0044E64F|.0F84 9B000000 je SMMVSpli.0044E6F0
0044E655|.B8 01000000   mov eax,0x1



代码者类似,如这样子
0044E6F0|> \B8 01000000   mov eax,0x1
0044E6F5|.6BC8 14       imul ecx,eax,0x14
0044E6F8|.0FB6940D FCFD>movzx edx,byte ptr ss:    ;取新字符串的第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:    ;取新字符串的第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老师及一起玩游戏小组全体成员!

一起玩游戏

不破不立 发表于 2018-12-9 21:34:29

wgz001666 {:victory:}

doasyousay 发表于 2018-12-9 22:20:01

#在这里快速回复#                         再次感谢

Master.lu 发表于 2018-12-10 00:21:00

wgz001v587

smallhorse 发表于 2018-12-10 08:11:26

求大腿,王哥,带我玩keygen

zjj888 发表于 2018-12-10 08:31:35

有水平!谢谢

wgz001 发表于 2018-12-10 08:45:53

smallhorse 发表于 2018-12-10 08:11
求大腿,王哥,带我玩keygen

算法都分析完了,keygen可以自己写一写了啊

PairsSoul 发表于 2018-12-10 17:06:45

老王又要玩JJ了吗

small-q 发表于 2018-12-10 17:20:13

玩公子,v587,6666666666

飞天 发表于 2018-12-10 19:55:49

wgz威武,感谢分享过程。
页: [1] 2
查看完整版本: 还没开始就已经结束了,哈哈