【文章标题】: 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