还没开始就已经结束了,哈哈
正如标题所说,这是前几天小马哥刚刚发的一个帖子里的软件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老师及一起玩游戏小组全体成员!
一起玩游戏 wgz001666 {:victory:} #在这里快速回复# 再次感谢 wgz001v587 求大腿,王哥,带我玩keygen 有水平!谢谢 smallhorse 发表于 2018-12-10 08:11
求大腿,王哥,带我玩keygen
算法都分析完了,keygen可以自己写一写了啊
老王又要玩JJ了吗 玩公子,v587,6666666666 wgz威武,感谢分享过程。
页:
[1]
2