Turbo Photo V2.5 演算法分析

看雪資料發表於2015-11-15

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+edw-->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+ecw-->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                   餘數+0x4-5>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                  餘數+eaw-->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                    餘數+0x4-5>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

相關文章