好友
阅读权限 40
听众
最后登录 1970-1-1
萧萧黄叶
发表于 2010-4-4 20:47
【文章标题】: Easy File Management Web Server 3.0 算法分析
【文章作者】: 萧萧黄叶
【软件名称】: Easy File Management Web Server 3.0
【软件大小】: 2624KB
【下载地址】: http://www.onlinedown.net/soft/73793.htm
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
刚刚运行程序就提示未注册,要注册。
而且输入任意码注册没有任何提示。
首先当然要探壳:Microsoft Visual C++ 6.0
OD载入:
004E1D86 >/$ 55 push ebp
004E1D87 |. 8BEC mov ebp,esp
004E1D89 |. 6A FF push -1
反汇编没有找到“Registration - unregistered
”,但是有
0047C7E8 PUSH 55D6AC \->: Registration - registered
0047CB44 PUSH 55D6AC \->: Registration - registered
尤其后者可疑,向上看:
0047C9AF . 68 10040000 push 410
0047C9B4 . E8 139B0800 call fmws.005064CC
0047C9B9 . 8BC8 mov ecx,eax
0047C9BB . E8 249D0800 call fmws.005066E4
0047C9C0 . 85C0 test eax,eax
0047C9C2 . 0F84 B0020000 je fmws.0047CC78
0047C9C8 . A1 54FC5500 mov eax,dword ptr ds:[55FC54]
0047C9CD . 894424 0C mov dword ptr ss:[esp+C],eax
0047C9D1 . C78424 E40000>mov dword ptr ss:[esp+E4],0
0047C9DC . 894424 08 mov dword ptr ss:[esp+8],eax
0047C9E0 . 8D4424 08 lea eax,dword ptr ss:[esp+8]
0047C9E4 . 8BCE mov ecx,esi
0047C9E6 . 50 push eax
0047C9E7 . 68 0F040000 push 40F
0047C9EC . C68424 EC0000>mov byte ptr ss:[esp+EC],1
0047C9F4 . E8 D39A0800 call fmws.005064CC
0047C9F9 . 8BC8 mov ecx,eax
0047C9FB . E8 B4790800 call fmws.005043B4
0047CA00 . 8D4C24 0C lea ecx,dword ptr ss:[esp+C]
0047CA04 . 51 push ecx
0047CA05 . 68 10040000 push 410
0047CA0A . 8BCE mov ecx,esi
0047CA0C . E8 BB9A0800 call fmws.005064CC
0047CA11 . 8BC8 mov ecx,eax
0047CA13 . E8 9C790800 call fmws.005043B4
0047CA18 . 8D4C24 08 lea ecx,dword ptr ss:[esp+8]
0047CA1C . E8 81380800 call fmws.005002A2
0047CA21 . 8D4C24 08 lea ecx,dword ptr ss:[esp+8]
0047CA25 . E8 81370800 call fmws.005001AB
0047CA2A . 8D4C24 0C lea ecx,dword ptr ss:[esp+C]
0047CA2E . E8 6F380800 call fmws.005002A2
0047CA33 . 8D4C24 0C lea ecx,dword ptr ss:[esp+C]
0047CA37 . E8 6F370800 call fmws.005001AB
0047CA3C . 51 push ecx
0047CA3D . 8D5424 10 lea edx,dword ptr ss:[esp+10]
0047CA41 . 8BCC mov ecx,esp
0047CA43 . 896424 1C mov dword ptr ss:[esp+1C],esp
0047CA47 . 52 push edx
0047CA48 . E8 2EA30800 call fmws.00506D7B
0047CA4D . 51 push ecx
0047CA4E . 8D4424 10 lea eax,dword ptr ss:[esp+10]
0047CA52 . 8BCC mov ecx,esp
0047CA54 . 896424 18 mov dword ptr ss:[esp+18],esp
0047CA58 . 50 push eax
0047CA59 . C68424 F00000>mov byte ptr ss:[esp+F0],2
0047CA61 . E8 15A30800 call fmws.00506D7B
0047CA66 . C68424 EC0000>mov byte ptr ss:[esp+EC],1
0047CA6E . E8 DDF4FFFF call fmws.0047BF50
0047CA73 . 83C4 08 add esp,8
0047CA76 . 84C0 test al,al
0047CA78 . 0F84 D5010000 je fmws.0047CC53
0047CA7E . E8 276B0900 call fmws.005135AA
0047CA83 . 8B4C24 08 mov ecx,dword ptr ss:[esp+8]
0047CA87 . 8B40 04 mov eax,dword ptr ds:[eax+4]
0047CA8A . 51 push ecx ; /Arg3
0047CA8B . 68 ECD65500 push fmws.0055D6EC ; |Arg2 = 0055D6EC ASCII "username"
0047CA90 . 68 DCD65500 push fmws.0055D6DC ; |Arg1 = 0055D6DC ASCII "Registration"
0047CA95 . 8BC8 mov ecx,eax ; |
0047CA97 . E8 96F20800 call fmws.0050BD32 ; \fmws.0050BD32
0047CA9C . E8 096B0900 call fmws.005135AA
0047CAA1 . 8B5424 0C mov edx,dword ptr ss:[esp+C]
0047CAA5 . 8B40 04 mov eax,dword ptr ds:[eax+4]
0047CAA8 . 52 push edx ; /Arg3
0047CAA9 . 68 D4D65500 push fmws.0055D6D4 ; |Arg2 = 0055D6D4 ASCII "regcode"
0047CAAE . 68 DCD65500 push fmws.0055D6DC ; |Arg1 = 0055D6DC ASCII "Registration"
0047CAB3 . 8BC8 mov ecx,eax ; |
0047CAB5 . E8 78F20800 call fmws.0050BD32 ; \fmws.0050BD32
0047CABA . 6A 30 push 30
0047CABC . 68 1C555500 push fmws.0055551C ; ASCII "Easy File Management Web Server"
0047CAC1 . 68 D8DB5500 push fmws.0055DBD8 ; ASCII "Thanks for your registration!"
0047CAC6 . 8BCE mov ecx,esi
0047CAC8 . E8 5A860800 call fmws.00505127
0047CACD . 6A 00 push 0
0047CACF . 68 0F040000 push 40F
0047CAD4 . 8BCE mov ecx,esi
0047CAD6 . E8 F1990800 call fmws.005064CC
0047CADB . 8BC8 mov ecx,eax
0047CADD . E8 1D9C0800 call fmws.005066FF
0047CAE2 . 6A 00 push 0
0047CAE4 . 68 10040000 push 410
0047CAE9 . 8BCE mov ecx,esi
0047CAEB . E8 DC990800 call fmws.005064CC
0047CAF0 . 8BC8 mov ecx,eax
0047CAF2 . E8 089C0800 call fmws.005066FF
0047CAF7 . 8B4424 08 mov eax,dword ptr ss:[esp+8]
0047CAFB . 50 push eax
0047CAFC . 68 ECD65500 push fmws.0055D6EC ; ASCII "username"
0047CB01 . 68 CCDB5500 push fmws.0055DBCC ; ASCII "Settings"
0047CB06 . E8 25C40400 call fmws.004C8F30
0047CB0B . 8B4C24 18 mov ecx,dword ptr ss:[esp+18]
0047CB0F . 51 push ecx
0047CB10 . 68 D4D65500 push fmws.0055D6D4 ; ASCII "regcode"
0047CB15 . 68 CCDB5500 push fmws.0055DBCC ; ASCII "Settings"
0047CB1A . E8 11C40400 call fmws.004C8F30
0047CB1F . 8B15 54FC5500 mov edx,dword ptr ds:[55FC54] ; fmws.0055FC68
0047CB25 . 83C4 18 add esp,18
0047CB28 . 895424 14 mov dword ptr ss:[esp+14],edx
0047CB2C . 8D4424 14 lea eax,dword ptr ss:[esp+14]
0047CB30 . 8BCE mov ecx,esi
0047CB32 . 50 push eax
0047CB33 . C68424 E80000>mov byte ptr ss:[esp+E8],3
0047CB3B . E8 74780800 call fmws.005043B4
0047CB40 . 8B4C24 14 mov ecx,dword ptr ss:[esp+14]
0047CB44 . 68 ACD65500 push fmws.0055D6AC ; /Arg2 = 0055D6AC ASCII "Registration - registered"
0047CB49 . 51 push ecx ; |Arg1
0047CB4A . E8 902E0600 call fmws.004DF9DF ; \fmws.004DF9DF
似乎有注册成功的提示"Thanks for your registration!"
就在这里下断看看行不行。
注册名:abcd
注册码:123456789
成功拦截:
0047C9FB . E8 B4790800 call fmws.005043B4
0047CA00 . 8D4C24 0C lea ecx,dword ptr ss:[esp+C] ; 注册名在EDX上出现了
0047CA04 . 51 push ecx
0047CA05 . 68 10040000 push 410
0047CA0A . 8BCE mov ecx,esi
0047CA0C . E8 BB9A0800 call fmws.005064CC
0047CA11 . 8BC8 mov ecx,eax
0047CA13 . E8 9C790800 call fmws.005043B4
0047CA18 . 8D4C24 08 lea ecx,dword ptr ss:[esp+8] ; 注册码在EDX上出现了
0047CA1C . E8 81380800 call fmws.005002A2
0047CA21 . 8D4C24 08 lea ecx,dword ptr ss:[esp+8]
0047CA25 . E8 81370800 call fmws.005001AB
0047CA2A . 8D4C24 0C lea ecx,dword ptr ss:[esp+C]
0047CA2E . E8 6F380800 call fmws.005002A2
0047CA33 . 8D4C24 0C lea ecx,dword ptr ss:[esp+C]
0047CA37 . E8 6F370800 call fmws.005001AB
0047CA3C . 51 push ecx
0047CA3D . 8D5424 10 lea edx,dword ptr ss:[esp+10]
0047CA41 . 8BCC mov ecx,esp
0047CA43 . 896424 1C mov dword ptr ss:[esp+1C],esp
0047CA47 . 52 push edx
0047CA48 . E8 2EA30800 call fmws.00506D7B
0047CA4D . 51 push ecx
0047CA4E . 8D4424 10 lea eax,dword ptr ss:[esp+10]
0047CA52 . 8BCC mov ecx,esp
0047CA54 . 896424 18 mov dword ptr ss:[esp+18],esp
0047CA58 . 50 push eax
0047CA59 . C68424 F00000>mov byte ptr ss:[esp+F0],2
0047CA61 . E8 15A30800 call fmws.00506D7B
0047CA66 . C68424 EC0000>mov byte ptr ss:[esp+EC],1
0047CA6E . E8 DDF4FFFF call fmws.0047BF50 ; 注册名的注册码都入栈了,AL=0就跳走,就注册成功,这里是关键CALL,一定要跟进!!!
0047CA73 . 83C4 08 add esp,8
0047CA76 . 84C0 test al,al
0047CA78 . 0F84 D5010000 je fmws.0047CC53
关键CALL跟进:
0047BF50 /$ 6A FF push -1
0047BF52 |. 68 821E5200 push fmws.00521E82 ; SE 处理程序安装
0047BF57 |. 64:A1 0000000>mov eax,dword ptr fs:[0]
继续
0047C009 |. 8B40 F8 mov eax,dword ptr ds:[eax-8]
0047C00C |. 83F8 02 cmp eax,2
0047C00F |. 0F8C 5D030000 jl fmws.0047C372 ; 检测注册名是否少于两位,也就是说注册名不能少于两位。
0047C015 |. 8D8C24 B00000>lea ecx,dword ptr ss:[esp+B0]
0047C01C |. 51 push ecx
0047C01D |. 8D4C24 20 lea ecx,dword ptr ss:[esp+20]
0047C021 |. E8 55AD0800 call fmws.00506D7B
0047C026 |. 8B5424 1C mov edx,dword ptr ss:[esp+1C]
0047C02A |. C68424 A40000>mov byte ptr ss:[esp+A4],5
0047C032 |. 8B42 F8 mov eax,dword ptr ds:[edx-8]
0047C035 |. 83F8 06 cmp eax,6
0047C038 |. 0F8C 23030000 jl fmws.0047C361 ; 检测注册码是否少于6位,也就是说注册码的位数不能少于6位。
0047C03E |. 8B4424 14 mov eax,dword ptr ss:[esp+14]
下面是数个循环嵌套在一起:
0047C05C |> /68 58D65500 /push fmws.0055D658 ; ASCII "webfilemanagement"
0047C061 |. |8D4C24 24 |lea ecx,dword ptr ss:[esp+24]
0047C065 |. |E8 0AB00800 |call fmws.00507074
…………
0047C31C |. C68424 A40000>|mov byte ptr ss:[esp+A4],5
0047C324 |. E8 DDAC0800 |call fmws.00507006
0047C329 |.^ E9 2EFDFFFF \jmp fmws.0047C05C
经过仔细的观察和多次的重复进行,在这里看到问题的所在:
0047C3CB |. E8 36AC0800 call fmws.00507006
0047C3D0 |. 32C0 xor al,al ; 如果运行到这里AL=0,也就是说为了注册成功就不能走到这里。
0047C3D2 |> 8B8C24 9C0000>mov ecx,dword ptr ss:[esp+9C]
0047C3D9 |. 5F pop edi
0047C3DA |. 5E pop esi
0047C3DB |. 5D pop ebp
0047C3DC |. 64:890D 00000>mov dword ptr fs:[0],ecx
0047C3E3 |. 5B pop ebx
0047C3E4 |. 81C4 98000000 add esp,98
0047C3EA |. C3 retn
0047C3EB |> 50 push eax ; /Arg2
0047C3EC |. 8B4424 20 mov eax,dword ptr ss:[esp+20] ; |
0047C3F0 |. 50 push eax ; |Arg1
0047C3F1 |. E8 E9350600 call fmws.004DF9DF ; \fmws.004DF9DF
0047C3F6 |. 83C4 08 add esp,8
0047C3F9 |. 85C0 test eax,eax
0047C3FB |.^ 0F85 4FFFFFFF jnz fmws.0047C350
0047C401 |. 8D4C24 20 lea ecx,dword ptr ss:[esp+20]
0047C405 |. C68424 A40000>mov byte ptr ss:[esp+A4],5
0047C40D |. E8 F4AB0800 call fmws.00507006
0047C412 |. 8D4C24 1C lea ecx,dword ptr ss:[esp+1C]
0047C416 |. C68424 A40000>mov byte ptr ss:[esp+A4],4
0047C41E |. E8 E3AB0800 call fmws.00507006
0047C423 |. 8D4C24 18 lea ecx,dword ptr ss:[esp+18]
0047C427 |. C68424 A40000>mov byte ptr ss:[esp+A4],3
0047C42F |. E8 D2AB0800 call fmws.00507006
0047C434 |. 8D4C24 10 lea ecx,dword ptr ss:[esp+10]
0047C438 |. C68424 A40000>mov byte ptr ss:[esp+A4],2
0047C440 |. E8 C1AB0800 call fmws.00507006
0047C445 |. 8D4C24 14 lea ecx,dword ptr ss:[esp+14]
0047C449 |. C68424 A40000>mov byte ptr ss:[esp+A4],1
0047C451 |. E8 B0AB0800 call fmws.00507006
0047C456 |. 8D8C24 AC0000>lea ecx,dword ptr ss:[esp+AC]
0047C45D |. C68424 A40000>mov byte ptr ss:[esp+A4],0
0047C465 |. E8 9CAB0800 call fmws.00507006
0047C46A |. 8D8C24 B00000>lea ecx,dword ptr ss:[esp+B0]
0047C471 |. C78424 A40000>mov dword ptr ss:[esp+A4],-1
0047C47C |. E8 85AB0800 call fmws.00507006
0047C481 |. B0 01 mov al,1 ; 如果运行到这里,AL=1,要注册成功就是能够走到这里。
0047C483 \.^ E9 4AFFFFFF jmp fmws.0047C3D2
所以要让跳转到
0047C3EB |> \50 push eax ; /Arg2
跳转来自 0047C304
这里的跳转成功,而这里的跳转不能跳:
0047C3FB |.^\0F85 4FFFFFFF jnz fmws.0047C350
还有这里:
0047C23A |. 8B36 |||mov esi,dword ptr ds:[esi]
0047C23C |. 8B00 |||mov eax,dword ptr ds:[eax]
0047C23E |. 56 |||push esi ; /Arg2
0047C23F |. 50 |||push eax ; |Arg1
0047C240 |. E8 9A370600 |||call fmws.004DF9DF ; \fmws.004DF9DF
0047C245 |. 83C4 08 |||add esp,8
0047C248 |. 8D4C24 34 |||lea ecx,dword ptr ss:[esp+34]
0047C24C |. 85C0 |||test eax,eax
0047C24E |. 0F94C3 |||sete bl
0047C251 |. E8 B0AD0800 |||call fmws.00507006
0047C256 |. 8D4C24 38 |||lea ecx,dword ptr ss:[esp+38]
0047C25A |. C68424 A40000>|||mov byte ptr ss:[esp+A4],9
0047C262 |. E8 9FAD0800 |||call fmws.00507006
0047C267 |. 84DB |||test bl,bl
0047C269 |. 0F84 BF000000 |||je fmws.0047C32E ; 这里的跳转一旦成功,就直接走向失败。但其跳转与否是由BL的值决定
在这里下断
0047C23A |. 8B36 |||mov esi,dword ptr ds:[esi]
0047C23C |. 8B00 |||mov eax,dword ptr ds:[eax]
并在这里跟随数值到数据窗口,就可以看到真假码了,但只是一位。
如果相同则BL为真等于1,下面的跳就不跳走了继续对比。
让下面的跳转不实现可以得到四个注册码:wfyC
并且走到这里:
0047C3EC |. 8B4424 20 mov eax,dword ptr ss:[esp+20] ; |
0047C3F0 |. 50 push eax ; |Arg1
0047C3F1 |. E8 E9350600 call fmws.004DF9DF ; \fmws.004DF9DF 在这里时看堆栈:
0047C3F6 |. 83C4 08 add esp,8
0047C3F9 |. 85C0 test eax,eax
0047C3FB |.^ 0F85 4FFFFFFF jnz fmws.0047C350
00120E74 010F7118 |Arg1 = 010F7118 ASCII "123456789"
00120E78 010F71B8 \Arg2 = 010F71B8 ASCII "wfyCXDrq"
很显然是真假码再次比较,不相同就失败。
可是只得到了四个注册码,后面一部分还不知道,只好回头找了。
还是在这里:
0047C23A |. 8B36 |||mov esi,dword ptr ds:[esi]
0047C23C |. 8B00 |||mov eax,dword ptr ds:[eax]
并在这里跟随数值到数据窗口,就可以看到真假码了,但只是一位。
观察数据窗口的值在哪里有改变的,终于找到这里就是关键中的关键:
0047C0EF |. E8 753B0800 |||call fmws.004FFC69
0047C0F4 |. E8 67FDFFFF |||call fmws.0047BE60 ; 算法CALL
0047C0F9 |. 8BD8 |||mov ebx,eax
0047C0FB |. 83C4 04 |||add esp,4
0047C0FE |. 85DB |||test ebx,ebx
0047C100 |. 0F8C 39020000 |||jl fmws.0047C33F
0047C106 |. 51 |||push ecx
0047C107 |. 8BCC |||mov ecx,esp
0047C109 |. 896424 54 |||mov dword ptr ss:[esp+54],esp
0047C10D |. 6A 01 |||push 1
0047C10F |. 55 |||push ebp
0047C110 |. 51 |||push ecx
0047C111 |. 8D4C24 20 |||lea ecx,dword ptr ss:[esp+20]
0047C115 |. E8 4F3B0800 |||call fmws.004FFC69
0047C11A |. E8 41FDFFFF |||call fmws.0047BE60 ; 算法CALL
0047C11F |. 8BF0 |||mov esi,eax
0047C121 |. 83C4 04 |||add esp,4
0047C124 |. 85F6 |||test esi,esi
0047C126 |. 0F8C 13020000 |||jl fmws.0047C33F
0047C12C |. 8D5424 58 |||lea edx,dword ptr ss:[esp+58]
0047C130 |. 8D4C24 28 |||lea ecx,dword ptr ss:[esp+28]
0047C134 |. 52 |||push edx
0047C135 |. E8 3AAF0800 |||call fmws.00507074
0047C13A |. 03F3 |||add esi,ebx ; 两次计算后的值相加
0047C13C |. C68424 A40000>|||mov byte ptr ss:[esp+A4],9
0047C144 |. 83FE 3D |||cmp esi,3D
0047C147 |. 7E 03 |||jle short fmws.0047C14C
0047C149 |. 83EE 3E |||sub esi,3E
算法CALL跟进:
0047BE60 /$ 6A FF push -1
0047BE62 |. 68 E01D5200 push fmws.00521DE0 ; SE 处理程序安装
0047BE67 |. 64:A1 0000000>mov eax,dword ptr fs:[0]
0047BE6D |. 50 push eax
0047BE6E |. 64:8925 00000>mov dword ptr fs:[0],esp
0047BE75 |. 83EC 4C sub esp,4C
0047BE78 |. 53 push ebx
0047BE79 |. 56 push esi
0047BE7A |. 68 18D65500 push fmws.0055D618 ; /<%s> = "abcdefABCDEFghijkqrs234tuvwxyzGHIJKLMNOPlmnopQRSTUVWXYZ1567890"
0047BE7F |. 8D4424 14 lea eax,dword ptr ss:[esp+14] ; |上面的是个类似于字典的内容,一定要记下来
0047BE83 |. 33F6 xor esi,esi ; |
0047BE85 |. 68 D0685500 push fmws.005568D0 ; |Format = "%s"
0047BE8A |. 50 push eax ; |s
0047BE8B |. 897424 68 mov dword ptr ss:[esp+68],esi ; |
0047BE8F |. FF15 08E75200 call dword ptr ds:[<&USER32.wspri>; \wsprintfA
0047BE95 |. 83C4 0C add esp,0C
0047BE98 |. 8D4C24 10 lea ecx,dword ptr ss:[esp+10]
0047BE9C |. 51 push ecx
0047BE9D |. 8D4C24 0C lea ecx,dword ptr ss:[esp+C]
0047BEA1 |. E8 CEB10800 call fmws.00507074
0047BEA6 |. C64424 5C 01 mov byte ptr ss:[esp+5C],1
0047BEAB |> 6A 01 /push 1
0047BEAD |. 8D5424 10 |lea edx,dword ptr ss:[esp+10]
0047BEB1 |. 56 |push esi
0047BEB2 |. 52 |push edx
0047BEB3 |. 8D4C24 14 |lea ecx,dword ptr ss:[esp+14]
0047BEB7 |. E8 AD3D0800 |call fmws.004FFC69
0047BEBC |. 8B00 |mov eax,dword ptr ds:[eax] ; 跟随数值到数据窗口
0047BEBE |. 50 |push eax ; /Arg2
0047BEBF |. 8B4424 68 |mov eax,dword ptr ss:[esp+68] ; |
0047BEC3 |. 50 |push eax ; |跟随数值到数据窗口
0047BEC4 |. E8 163B0600 |call fmws.004DF9DF ; \两者比较
0047BEC9 |. 83C4 08 |add esp,8
0047BECC |. 8D4C24 0C |lea ecx,dword ptr ss:[esp+C]
0047BED0 |. 85C0 |test eax,eax
0047BED2 |. 0F94C3 |sete bl
0047BED5 |. E8 2CB10800 |call fmws.00507006
0047BEDA |. 84DB |test bl,bl
0047BEDC |. 75 38 |jnz short fmws.0047BF16 ; 相同就跳走,等到ESI的值。
0047BEDE |. 46 |inc esi
0047BEDF |. 83FE 3E |cmp esi,3E
0047BEE2 |.^ 7C C7 \jl short fmws.0047BEAB
0047BEE4 |. 8D4C24 08 lea ecx,dword ptr ss:[esp+8]
0047BEE8 |. 885C24 5C mov byte ptr ss:[esp+5C],bl
0047BEEC |. E8 15B10800 call fmws.00507006
0047BEF1 |. 8D4C24 64 lea ecx,dword ptr ss:[esp+64]
0047BEF5 |. C74424 5C FFF>mov dword ptr ss:[esp+5C],-1
0047BEFD |. E8 04B10800 call fmws.00507006
0047BF02 |. 5E pop esi
0047BF03 |. 83C8 FF or eax,FFFFFFFF
0047BF06 |. 5B pop ebx
0047BF07 |. 8B4C24 4C mov ecx,dword ptr ss:[esp+4C]
0047BF0B |. 64:890D 00000>mov dword ptr fs:[0],ecx
0047BF12 |. 83C4 58 add esp,58
0047BF15 |. C3 retn
0047BF16 |> 8D4C24 08 lea ecx,dword ptr ss:[esp+8]
0047BF1A |. C64424 5C 00 mov byte ptr ss:[esp+5C],0
0047BF1F |. E8 E2B00800 call fmws.00507006
0047BF24 |. 8D4C24 64 lea ecx,dword ptr ss:[esp+64]
0047BF28 |. C74424 5C FFF>mov dword ptr ss:[esp+5C],-1
0047BF30 |. E8 D1B00800 call fmws.00507006
0047BF35 |. 8B4C24 54 mov ecx,dword ptr ss:[esp+54]
0047BF39 |. 8BC6 mov eax,esi
0047BF3B |. 5E pop esi
0047BF3C |. 5B pop ebx
0047BF3D |. 64:890D 00000>mov dword ptr fs:[0],ecx
0047BF44 |. 83C4 58 add esp,58
0047BF47 \. C3 retn
记录下每一次运行的值(为了更清晰的显示这一次改注册名为123456789):
w1=s
e2=u
s3=l
u4=R
l5=k
R6=m
k7=G
m8=o
G9=y
ws=Q
eu=y
Ql=t
yR=g
tk=6
gm=Y
6G=v
YO=z
vy=Y
至此已经差不多知道了算法的内容了
每一次取两个字符在字典中查找,位数相加再在字典中找到相应的字符就是相应的注册码
这两个用来查找的字符一个是来自注册名,一个是来自上上次得到的注册码,开始的两个是大循环开始出现的的固定字符就是“we”
循环次数为注册名的长度
然后再一次同样次数的循环,这一次用上一次循环得到的注册码作为注册名来循环。
两次得到的注册码就是正确的注册码。
如用我的名字:xiaoxiaohuangye
注册码:YrY0rhr5HrH9owSq4C3wKpyhRppvCE
附上易语言算法注册机源码:
.版本 2
.子程序 _按钮1_被单击
.局部变量 i, 整数型
.局部变量 name, 文本型
.局部变量 n, 文本型
.局部变量 sn1, 文本型
.局部变量 sn2, 文本型
.如果 (编辑框1.内容 = “”)
信息框 (“请输入您的用户名!”, 0, “提示”)
.否则
str = “abcdefABCDEFghijkqrs234tuvwxyzGHIJKLMNOPlmnopQRSTUVWXYZ1567890”
s = “we”
name = s
.计次循环首 (取文本长度 (编辑框1.内容), i)
n = 子程序1 (取文本中间 (name, i, 1), 取文本中间 (编辑框1.内容, i, 1))
name = name + n
sn1 = sn1 + n
.计次循环尾 ()
name = s
.计次循环首 (取文本长度 (编辑框1.内容), i)
n = 子程序1 (取文本中间 (name, i, 1), 取文本中间 (sn1, i, 1))
name = name + n
sn2 = sn2 + n
.计次循环尾 ()
编辑框2.内容 = sn1 + sn2
.如果结束
.子程序 子程序1, 文本型
.参数 x, 文本型
.参数 y, 文本型
.局部变量 a, 整数型
.局部变量 b, 整数型
.局部变量 c, 整数型
.局部变量 sn, 文本型
a = 寻找文本 (str, x, , 假)
b = 寻找文本 (str, y, , 假)
c = a + b - 2
.如果真 (c > 61)
c = c - 62
.如果真结束
c = c + 1
sn = 取文本中间 (str, c, 1)
返回 (sn)
.版本 2
.全局变量 str, 文本型
.全局变量 s, 文本型
--------------------------------------------------------------------------------
【经验总结】
软件的算法已经很好了,没有整体的明码对比,如果不知道算法只好一个个暴破了,能不能完全暴破没有试过,但可以肯定内存注册机是不容易了。
--------------------------------------------------------------------------------
【版权声明】: 本破文原创于萧萧黄叶, 转载请注明作者并保持文章的完整, 谢谢!
2010年04月04日 19:50:03