• 标 题:Turbo Photo V2.5 算法分析 
  • 作 者:wzh123
  • 时 间:2003/05/10 12:34pm
  • 链 接:http://bbs.pediy.com

Turbo Photo V2.5 算法分析

作者:wzh123

软件大小:  4013 KB
软件语言:  简体中文
软件类别:  国产软件 / 共享版 / 图像处理
应用平台:  Win9x/NT/2000/XP
软件介绍:
   Turbo Photo 是一个以数码影像为背景,面向数码相机普通用户和准专业用户而设计的一套集图片管理,浏览,处理,输出为一身的国产软件系统。如果您拥有数码相机,Turbo Photo可以完成与之相关的绝大部分工作,成为您的数码相机最好伴侣。照片自动调整、美容、插值和打印、去除噪声、批量处理、浏览与管理....这几项是普通数码相机用户最关心的功能,以前,您也许需要下载3-5个软件来分别完成以上功能,现在您只需要拥有Turbo Photo就全部搞定。不要认为集成在一起的软件就不专业,效果就不好了。Turbo Photo的设计使用了一流的独创的图像处理技术,使得这些应用的最终效果不逊于任何单项软件,甚至有所超出,譬如她是世界上第一个具有皮肤自动检测、识别与美化全自动处理技术的软件,可以在1分钟内达到数字美容的效果;领先于几乎所有同类软件(譬如PhotoShop)的图像插值技术可以让您的130万像素相机输出A4大幅面;综合去噪技术可以有效去除感光噪声和色彩斑点。同样也是首创的,面向问题的‘照片门诊部’可以轻松的解决照片里的不足,将您的照片调整到最佳的曝光与色彩... ... 同时,Turbo Photo简单的用户界面,大量的向导功能,使得您在第一次使用的时候就能轻松上手。是真真正正的傻瓜软件。

PJ工具:softice,W32Dasm8.93黄金版,FI2.5
作者申明:只是学习,无其他目的。
         本人刚刚学破解,错误在所难免,写的也很乱,请各位包涵,也请各位高手指教
1、软件没有加壳,用vc++编的;
2、注册码放在\winnt\system32\tpflag.rg 文件中。用softice下断,

姓名:wzh123
公司:123
注册码:a1234-b2345-c34567-d4567


你一定可以来到这里:


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431D5B(C)
|
:00431D64 0FBE4204                movsx eax, byte ptr [edx+04]--edx="a1234",将第一组注册码的第五

位,即0x34-->eax
:00431D68 99                      cdq                          零扩展
:00431D69 B907000000              mov ecx, 00000007            7-->ecx
:00431D6E F7F9                    idiv ecx                     eax/ecx,即0x34/7
:00431D70 B905000000              mov ecx, 00000005            5-->ecx
:00431D75 8BFA                    mov edi, edx                 余数"3"--->edi
:00431D77 8B542414                mov edx, dword ptr [esp+14]  第一组注册码,即"a1234"-->edx
:00431D7B 0FBE4202                movsx eax, byte ptr [edx+02] 将第一组注册码的第三位,即

0x32-->eax
:00431D7F 99                      cdq                          零扩展
:00431D80 F7F9                    idiv ecx                     eax/ecx,即0x32/5
:00431D82 8B4C2414                mov ecx, dword ptr [esp+14]  第一组注册码,即"a1234"-->ecx
:00431D86 03FA                    add edi, edx                 edi+edx-->edi
:00431D88 0FBE5101                movsx edx, byte ptr [ecx+01] 将第一组注册码的第二位,即

0x31-->edx
:00431D8C 0FBE09                  movsx ecx, byte ptr [ecx]    将第一组注册码的第一位,即

0x61(a)-->ecx
:00431D8F 8D0457                  lea eax, dword ptr [edi+2*edx] edi+2*edx-->eax,本例中为

3+0x31*2=0x65--->eax
:00431D92 03C1                    add eax, ecx                  eax+ecx-->eax,本例中为

0x65+0x61=0xc6-->eax
:00431D94 B91A000000              mov ecx, 0000001A            0x1a-->ecx
:00431D99 99                      cdq                          零扩展
:00431D9A F7F9                    idiv ecx                     eax/ecx--0xc6/0x1a
:00431D9C 0FBE06                  movsx eax, byte ptr [esi]    将第四组注册码的第一位,即

"d"(0x64)-->eax
:00431D9F 80C241                  add dl, 41                   余数+0x41->dl,本例中为

0x10+0x41=0x51("Q")      
:00431DA2 81E2FF000000            and edx, 000000FF            取edx低位            
:00431DA8 3BC2                    cmp eax, edx                 比较,相等则继续,否则over,所以第

四组注册码的第一位应该为"Q"
:00431DAA 7409                    je 00431DB5                  跳,(爆破点)
:00431DAC 5F                      pop edi
:00431DAD 5E                      pop esi
:00431DAE 5D                      pop ebp
:00431DAF 33C0                    xor eax, eax
:00431DB1 5B                      pop ebx
:00431DB2 C21000                  ret 0010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431DAA(C)
|
:00431DB5 0FBE5302                movsx edx, byte ptr [ebx+02]  ebx="b2345",将第二组注册码的第三

位,即"3"(0x33)-->edx
:00431DB9 0FBE4303                movsx eax, byte ptr [ebx+03]  将第二组注册码的第四位,即

"4"(0x34)-->eax
:00431DBD 89542418                mov dword ptr [esp+18], edx   0x33-->ss:[0012FEC8]
:00431DC1 BF03000000              mov edi, 00000003             3-->edi
:00431DC6 99                      cdq
:00431DC7 F7FF                    idiv edi                      0x34/3
:00431DC9 0FBE4304                movsx eax, byte ptr [ebx+04]  将第二组注册码的第五位,即

"5"(0x35)-->eax
:00431DCD 0FBE4E01                movsx ecx, byte ptr [esi+01]  将第四组注册码的第二位,即

"4"(0x34)-->ecx
:00431DD1 8D3C80                  lea edi, dword ptr [eax+4*eax] eax*5-->edi,本例中为0x109-->edi
:00431DD4 8B442418                mov eax, dword ptr [esp+18]   ss:[0012FEC8],即"0x33"-->eax(见上

)
:00431DD8 03C2                    add eax, edx                  余数+eax-->eax,本例中为0x34->eax
:00431DDA 0FBE13                  movsx edx, byte ptr [ebx]     将第四组注册码的第二位,即

"4"(0x34)-->edx
:00431DDD 03F8                    add edi, eax                  edi+eax,即0x109+0x34=0x13D-->edi
:00431DDF 0FBE4301                movsx eax, byte ptr [ebx+01]  将第二组注册码的第二位,即

"2"(0x32)-->eax
:00431DE3 8D1457                  lea edx, dword ptr [edi+2*edx] edx=0x201
:00431DE6 BF1A000000              mov edi, 0000001A             0x1A-->edi
:00431DEB 03C2                    add eax, edx                  eax=0x233
:00431DED 99                      cdq
:00431DEE F7FF                    idiv edi
:00431DF0 80C241                  add dl, 41                    余数+0x41->dl
:00431DF3 81E2FF000000            and edx, 000000FF
:00431DF9 3BCA                    cmp ecx, edx                  比较,相等则继续,否则over,所以

第四组注册码的第二位应该为"R"
:00431DFB 7409                    je 00431E06                   跳,(爆破点)
:00431DFD 5F                      pop edi
:00431DFE 5E                      pop esi
:00431DFF 5D                      pop ebp
:00431E00 33C0                    xor eax, eax
:00431E02 5B                      pop ebx
:00431E03 C21000                  ret 0010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431DFB(C)
|
:00431E06 0FBE5503                movsx edx, byte ptr [ebp+03]  ebp="c3456",将第三组注册码的第四

位,即"5"(0x35)-->edx
:00431E0A BF1A000000              mov edi, 0000001A             0x1A-->edi
:00431E0F 8D0452                  lea eax, dword ptr [edx+2*edx] eax=0x9F
:00431E12 C1E003                  shl eax, 03                   移位,即作乘法,eax=0x4F8
:00431E15 2BC2                    sub eax, edx                  0x4F8-0x35=0x4c3-->eax
:00431E17 0FBE5505                movsx edx, byte ptr [ebp+05]  将第三组注册码的第六位,即

"7"(0x37)-->edx
:00431E1B 03C2                    add eax, edx                  eax=0x4FA
:00431E1D 0FBE5500                movsx edx, byte ptr [ebp+00]  将第三组注册码的第一位,即

"c"(0x63)-->edx
:00431E21 03C2                    add eax, edx                  eax=0x55D
:00431E23 99                      cdq
:00431E24 F7FF                    idiv edi    
:00431E26 0FBE5E02                movsx ebx, byte ptr [esi+02]  将第四组注册码的第三位,即

"5"(0x35)-->ebx
:00431E2A 80C241                  add dl, 41                    余数+0x41,本例中为0x56(V)-->dl
:00431E2D 81E2FF000000            and edx, 000000FF
:00431E33 3BDA                    cmp ebx, edx                  比较,相等则继续,否则over,所以

第四组注册码的第三位应该为"V"    
:00431E35 7409                    je 00431E40                   跳,(爆破点)
:00431E37 5F                      pop edi
:00431E38 5E                      pop esi
:00431E39 5D                      pop ebp
:00431E3A 33C0                    xor eax, eax
:00431E3C 5B                      pop ebx
:00431E3D C21000                  ret 0010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431E35(C)
|
:00431E40 0FBE4501                movsx eax, byte ptr [ebp+01]   将第三组注册码的第二位,即

"3"(0x33)-->eax
:00431E44 0FBE7E03                movsx edi, byte ptr [esi+03]   将第四组注册码的第四位,即

"6"(0x36)-->edi
:00431E48 8D14C500000000          lea edx, dword ptr [8*eax+00000000]  edx=0x198
:00431E4F 2BD0                    sub edx, eax                    edx=0x165
:00431E51 8B442414                mov eax, dword ptr [esp+14]    将第一组注册码"a1234"-->eax
:00431E55 89542414                mov dword ptr [esp+14], edx    0x165-->ss[0012FEC4]
:00431E59 0FBE5003                movsx edx, byte ptr [eax+03]   将第一组注册码的第四位,即

"3"0x33-->edx
:00431E5D 03542418                add edx, dword ptr [esp+18]    0x33+ss[0012FEC8](见上),

edx=0x66
:00431E61 0FBE4502                movsx eax, byte ptr [ebp+02]   将第三组注册码的第三位,即

"4"(0x34)-->eax
:00431E65 8B6C2414                mov ebp, dword ptr [esp+14]    ss[0012FEC4],即0x165-->ebp
:00431E69 03D5                    add edx, ebp                   edx=0x1CB
:00431E6B BD1A000000              mov ebp, 0000001A              0x1A-->ebp
:00431E70 03C2                    add eax, edx                   eax=0x1FF
:00431E72 99                      cdq
:00431E73 F7FD                    idiv ebp
:00431E75 80C241                  add dl, 41                    余数+0x41,本例中为0x52(R)-->dl    

       
:00431E78 81E2FF000000            and edx, 000000FF
:00431E7E 3BFA                    cmp edi, edx                  比较,相等则继续,否则over,所以

第四组注册码的第四位应该为"R"        
:00431E80 7409                    je 00431E8B                   跳,(爆破点)
:00431E82 5F                      pop edi
:00431E83 5E                      pop esi
:00431E84 5D                      pop ebp
:00431E85 33C0                    xor eax, eax
:00431E87 5B                      pop ebx
:00431E88 C21000                  ret 0010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00431E80(C)
|
:00431E8B 0FBE06                  movsx eax, byte ptr [esi]       将第四组注册码的第一位-->eax,

在这里,应该用真码,否则得不到真码的最后一位,所以这里取"Q"(0x51)-->eax
:00431E8E 8D148B                  lea edx, dword ptr [ebx+4*ecx]  edx=0x19E
:00431E91 03CA                    add ecx, edx                    ecx=0x1F0
:00431E93 8D0440                  lea eax, dword ptr [eax+2*eax]  eax*3-->eax,这里eax=0xF3
:00431E96 8D0C79                  lea ecx, dword ptr [ecx+2*edi]  ecx=0x294
:00431E99 5F                      pop edi
:00431E9A 03C1                    add eax, ecx                    eax=0x387
:00431E9C B91A000000              mov ecx, 0000001A               0x1A-->ecx
:00431EA1 99                      cdq
:00431EA2 F7F9                    idiv ecx
:00431EA4 0FBE4604                movsx eax, byte ptr [esi+04]    将第四组注册码的第五位-->eax
:00431EA8 33C9                    xor ecx, ecx
:00431EAA 5E                      pop esi
:00431EAB 5D                      pop ebp
:00431EAC 5B                      pop ebx
:00431EAD 80C241                  add dl, 41                      余数+0x41,本例中为0x54(T)-->dl
:00431EB0 81E2FF000000            and edx, 000000FF
:00431EB6 3BC2                    cmp eax, edx                    比较,相等则继续,否则over,所

以第四组注册码的第五位应该为"T"        
:00431EB8 0F94C1                  sete cl                         相等则条件为真,(爆破点)
:00431EBB 8BC1                    mov eax, ecx
:00431EBD C21000                  ret 0010


算法总结:

注册码格式:s1s2s3s4s5-s6s7s8s9s10-s11s12s13s14s15s16-s17s18s19s20s21

前16位任意,后五位由前16位推出。

算法:

1、s17=((((s5%7)+(s3%5))+s2*2+s1)%0x1A+0x41)&0xff;
2、s18=(((s9%3)+s8+s10*5+s6*2+s7)%0x1A+0x41)&0xff;
3、s19=((s14*23+s16+s11)%0x1A+0x41)&0xff;
4、s20=((s4+s8+s12*7+s13)%0x1A+0x41)&0xff;
5、s21=((s18*5+s19+s20*2+s17*3)%0x1A+0x41)&0xff.

注册码与姓名,公司无关。

一个有用的注册码:a1234-b2345-c34567-QRVRT