Flash Cam 1.79註冊演算法分析與序號產生器制作以及爆破方法 (7千字)

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

Flash Cam 1.79註冊演算法分析與序號產生器制作以及爆破方法

工具:ollydbg 1.06
執行Flash Cam, 進入註冊畫面,然後執行ollydbg,單擊[file]選單中的[Attach],找到FlashCam程式,
確認後,進入ollydbg主畫面,按Alt+E出現[Executable Modules],選中user32.dll,再按Ctrl+N,
出現[Names in user32],找到showwindow後,按F2下斷點,按Alt+C回到[CPU-main thread],按F9執行。
在FlashCam註冊畫面中輸入RegCode,確認後,程式在所設斷點處被攔截,清除斷點後,反覆按Ctrl+F9,
回到程式領空。然後一步一步按F8,注意觀察螢幕左上角和右下角,如果出現了你輸入的RegCode或者
其他可疑的字串,則放慢腳步,在當前執行行的前面幾行設斷點,保證重新註冊時程式能在出錯視窗
顯示前被攔截。好了,再次註冊更蹤,這樣,程式在出錯視窗顯示前便被攔截,然後按F7單步更蹤,
不要放過任何可疑的Call(呵呵,這是對菜鳥而言啦,我可是直接就到了這裡哦),最後就來到了這裡:

00516B5B  50                PUSH EAX
00516B5C  B9 20000000      MOV ECX,20
00516B61  BA F19D0000      MOV EDX,9DF1
00516B66  B8 1A000000      MOV EAX,1A
00516B6B  E8 70FCFFFF      CALL FlashCam.005167E0        //註冊碼計算過程
00516B70  8B45 E8          MOV EAX,DWORD PTR SS:[EBP-18]    //真正的註冊碼
00516B73  8B55 FC          MOV EDX,DWORD PTR SS:[EBP-4]    //你輸入的假的註冊碼
00516B76  E8 B5D6EEFF      CALL FlashCam.00404230        //比較過程
00516B7B  75 04            JNZ SHORT FlashCam.00516B81        //不相等則over

////////////////////////////////////////////////////////////////////////////////////////
////////--------00516B6B    CALL FlashCam.005167E0-------///////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
005167E0  55                PUSH EBP
005167E1  8BEC              MOV EBP,ESP
005167E3  83C4 E8          ADD ESP,-18
005167E6  53                PUSH EBX
005167E7  56                PUSH ESI
005167E8  894D F8          MOV DWORD PTR SS:[EBP-8],ECX
005167EB  8BF2              MOV ESI,EDX
005167ED  8945 FC          MOV DWORD PTR SS:[EBP-4],EAX
005167F0  FF75 10          PUSH DWORD PTR SS:[EBP+10]
005167F3  FF75 0C          PUSH DWORD PTR SS:[EBP+C]
005167F6  8D4D F2          LEA ECX,DWORD PTR SS:[EBP-E]
005167F9  8D55 F4          LEA EDX,DWORD PTR SS:[EBP-C]
005167FC  8D45 F6          LEA EAX,DWORD PTR SS:[EBP-A]
005167FF  E8 AC4BEFFF      CALL FlashCam.0040B3B0
00516804  0FB755 F4        MOVZX EDX,WORD PTR SS:[EBP-C]    //變數Month
00516808  8BDA              MOV EBX,EDX
0051680A  0FB745 F6        MOVZX EAX,WORD PTR SS:[EBP-A]    //變數Year
0051680E  03D8              ADD EBX,EAX                //ebx=Month+Year
00516810  69C8 A6030000    IMUL ECX,EAX,3A6            //ecx=Year*0x3a6
00516816  03D9              ADD EBX,ECX                //ebx=ebx+ecx
00516818  69CA 4C010000    IMUL ECX,EDX,14C            //ecx=Month*0x14c
0051681E  03D9              ADD EBX,ECX                //ebx=ebx+ecx
00516820  0FAFD0            IMUL EDX,EAX            //edx=Month*Year
00516823  03DA              ADD EBX,EDX                //ebx=ebx+edx
00516825  0FB745 F4        MOVZX EAX,WORD PTR SS:[EBP-C]    //Month
00516829  0FB755 F6        MOVZX EDX,WORD PTR SS:[EBP-A]    //Year
0051682D  F7EA              IMUL EDX                //eax=Month*Year
0051682F  3345 FC          XOR EAX,DWORD PTR SS:[EBP-4]    //eax=eax ^ 0x01a
00516832  03D8              ADD EBX,EAX                //ebx=ebx+eax
00516834  E8 BF19FFFF      CALL FlashCam.005081F8        //分析見下
00516839  B9 E7030000      MOV ECX,3E7                //ecx=0x3e7
0051683E  99                CDQ
0051683F  F7F9              IDIV ECX
00516841  8BC2              MOV EAX,EDX                //eax=eax % ecx
00516843  03D8              ADD EBX,EAX                //ebx=ebx+eax
00516845  0FB745 F4        MOVZX EAX,WORD PTR SS:[EBP-C]    //eax=Month
00516849  85C0              TEST EAX,EAX
0051684B  76 06            JBE SHORT FlashCam.00516853        //迴圈
0051684D  0FAFDE            IMUL EBX,ESI            //ebx=ebx*0x9df1
00516850  48                DEC EAX                //迴圈Month次
00516851  75 FA            JNZ SHORT FlashCam.0051684D
00516853  0FB745 F6        MOVZX EAX,WORD PTR SS:[EBP-A]    //eax=Year
00516857  85C0              TEST EAX,EAX
00516859  76 06            JBE SHORT FlashCam.00516861        //迴圈
0051685B  035D F8          ADD EBX,DWORD PTR SS:[EBP-8]    //ebx=ebx+0x20
0051685E  48                DEC EAX                //迴圈Year次
0051685F  75 FA            JNZ SHORT FlashCam.0051685B
00516861  8BC3              MOV EAX,EBX                //eax=ebx
00516863  99                CDQ
00516864  33C2              XOR EAX,EDX                //eax=eax ^ 0xffffffff
00516866  2BC2              SUB EAX,EDX                //eax=eax-0xffffffff
00516868  8BD8              MOV EBX,EAX
0051686A  8BC3              MOV EAX,EBX
0051686C  B9 FFC99A3B      MOV ECX,3B9AC9FF            //ecx=0x3b9ac9ff
00516871  33D2              XOR EDX,EDX
00516873  F7F1              DIV ECX                //edx=eax % ecx
00516875  8BDA              MOV EBX,EDX                //edx->ebx
00516877  895D E8          MOV DWORD PTR SS:[EBP-18],EBX
0051687A  33C0              XOR EAX,EAX
0051687C  8945 EC          MOV DWORD PTR SS:[EBP-14],EAX
0051687F  DF6D E8          FILD QWORD PTR SS:[EBP-18]        //ebx轉換為十進位制,呵呵,這就是
                                //我們苦苦追尋的東西了。當然
                                //還不完美,因為現在得到的僅僅是
                                //去掉“-”連線符號後的RegCode。
                                //後面的工作就不需要我講了吧,
                                //哎,為了菜鳥,我就再多說一句吧,
                                //分別在此串的第4位和第7位添上
                                //"-",就是RegCode了。哈哈,簡單吧。


////////////////////////////////////////////////////////////////////////////////////////
////////--------00516834    CALL FlashCam.005081F8-------///////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
005081F8  55                PUSH EBP
、、、
00508251  6A 00            PUSH 0
00508253  6A 00            PUSH 0
00508255  6A 00            PUSH 0
00508257  E8 CCF8EFFF      CALL FlashCam.00407B28                  ; JMP to kernel32.GetVolumeInformationA
0050825C  8B03              MOV EAX,DWORD PTR DS:[EBX]        //卷序號->eax
0050825E  99                CDQ
0050825F  33C2              XOR EAX,EDX                //eax ^ 0xffffffff ->eax
00508261  2BC2              SUB EAX,EDX                //eax - 0xffffffff ->eax
、、、
0050828B  C3                RETN
//////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////

破解方法
1、爆破
修改00516b7b處7504為9090(注意:由於此軟體已加殼,所以必須脫殼後才能修改程式碼)
2、序號產生器
前面的分析,基本上就是標準的c程式了。呵呵,為了便於閱讀,我還是再整理一遍吧。(c builder 6透過)
    DWORD nBL;
    LPTSTR lpB;
    LPCTSTR lpRPN;
    LPTSTR lpVNB;
    DWORD nVNS;
    LPDWORD lpVSN;
    LPDWORD lpMCL;
    LPDWORD lpFSF;
    LPTSTR lpFSNB;
    DWORD nFSNS;
int i;
    AnsiString RegCode;
    Word Year, Month, Day;
    unsigned long eax,ebx,ecx,edx,esi,lpVSN;
    char szHome[MAX_PATH];
    BitBtn1->Enabled=False;
    TDateTime dtPresent = Now();
    DecodeDate(dtPresent, Year, Month, Day);
    ebx=Year+Month;
    ecx=Year * 0x3a6;
    ebx=ebx+ecx;
    ecx=Month * 0x14c;
    ebx=ebx+ecx;
    edx=Year * Month;
    ebx=ebx+edx;
    eax= edx ^ 0x1a;
    ebx=eax+ebx;
    GetCurrentDirectory(MAX_PATH,szHome);
    szHome[3]='\0';
    GetVolumeInformationA(szHome,0,0,&lpVSN,0,0,0,0);
    eax=lpVSN;
    eax=eax ^ 0xffffffff;
    eax=eax - 0xffffffff;
    eax=eax % 0x3e7;
    ebx=ebx+eax;
    esi=0x9df1;
    for(i=1;i<=Month;i++){
        ebx=ebx*esi;
    }
    for(i=1;i<=Year;i++){
        ebx=ebx+0x20;
    }
    ebx=ebx ^ 0xffffffff;
    ebx=ebx - 0xffffffff;
    ecx=0x3b9ac9ff;
    ebx=ebx % ecx;
    RegCode=IntToStr(ebx);
    RegCode.Insert("-",4);
    RegCode.Insert("-",8);

youth[chat001]
2002-4-24晚

相關文章