用C++ Builder的MD5控制項實現軟體防護

來源:互聯網
上載者:User

一、共用==免費?

隨著Internet大行其道,“共用+註冊”模式日漸成為程式員發布自己軟體的主要手段,但是隨之而來的破解手段也越來越高明。如何保護自己的勞動成果不被暴力破解或修改?用MD5摘要值驗證是一個很常用的方法。

MD5作為一個公開演算法,實現的方法很多,比如開源軟體、Windows內建的API等,C++ Builder和Delphi中整合的Indy裡面也有現成的MD5控制項。用API實現MD5雖然效率高,但是畢竟太繁瑣,具體方法可以參閱MSDN上crypt開頭的那幾個函數說明。用C++ Builder的MD5控制項雖然方便,但是速度較慢,而且只能處理以‘’結尾的字串,所以要用這個控制項還需要我們對待驗證資料做一些預先處理。預先處理的關鍵在於把較重要的內容挑出來計算,這樣一方面可以去除‘’,另一方面可以極大減少待驗證內容的長度,只計算關鍵代碼的摘要值。

二、來源程式祥解

先要說明的是網上和Borland Help裡面對Indy MD5控制項介紹很少,這段程式基本上是我自己摸索的結果,在C++ Biulder 6.0和Indy 6.0下運行正常。

先在Indy misc中拖一個MD5控制項,假設其name為cipher,程式如下:

/*

MD5計算函數 by DayDreamer 2004-04

功能:對檔案名稱為fname的檔案計算16個位元組長的MD5值,放在result裡面

輸入:指向檔案名稱的指標char *fname

輸出:MD5值放在result指向的緩衝區裡面

傳回值:如果正確計算出MD5值則返回true,否則返回false

*/

bool MD5( char* fname, char *result)

{

unsigned int i=0; //用於記錄讀出檔案的大小

bool flag=false; //正確計算md的話則置標記

static AnsiString ss; //用於臨時存放得到的MD5值

char *buffer=new char[myFILE_SIZE]; //用於讀取目標檔案,檔案大小不能超過myFILE_SIZE

TFileStream *tt=new TFileStream(fname,fmOpenRead); //用於讀取目標檔案的全部內容,使用此方法簡單一點,也可以用標準的CreateFile()讀取

i=tt->Read(buffer,myFILE_SIZE); //i中儲存實際讀取的位元組數

if ((i)&&(i!=1)) //如果讀出位元組數不為0或1,則進行處理

{ i=i-1; //最後一個位元組必須留出,供結束符使用

_asm{ //這一段彙編主要是用來對檔案預先處理

mov ecx,i; //置計數器

mov ebx,buffer; //源地址指標

mov edx,buffer; //目的地址指標

l1: mov al, [ebx]; //取一個位元組,因為如果檔案過大會極大降低速度,所以必須以較細粒度過濾源串

cmp al,0x70; //只對大於0x70和小於0x91的位元組進行摘要

jb l2 ; //因為主要的轉移指令(jz,jnz)、空操作指令(nop)等都大於0x70小於0x91

cmp al,0x91; //也可以換成更寬鬆的條件,但至少應該把0x00濾掉,因為它被視為結束符

jnb l2 ;

mov [edx],al ; //合格位元組儲存起來等待驗證

inc edx;

l2: inc ebx;

dec ecx;

jnz l1;

mov byte ptr [edx+1],0; //在最後置結束符‘’

}

cipher->Reset(); //每次使用該控制項之前應該重設其內部的一些參數

cipher->AutoCompleteInput=false; // 只有調用CompletedInput() 時才得到結果

cipher->CodeString(buffer); //輸入預先處理過的資料

ss=cipher->CompletedInput(); //輸入完畢,得到摘要碼

if(ss.Length()=MD5_LENGHTH) //如果摘要碼正常(即為16位),則儲存之

{ flag=true; //置正確標誌

memcpy(result,ss.c_str(),16); //把結果放入result

} // end if

}// end if

delete tt;

delete[] buffer;

return flag;}

調用的時候可以用Application->ExeName.c_str()當作fname傳入,注意在C++ Biulder中直接run的話這會引起異常,這沒關係,發布出來的程式不會有問題。此處為了簡明,在彙編代碼中沒有儲存和恢複寄存器,使用時可以加上,或者發布時把optionsèAdvanced Complier中的Register variables設為none即可。

三、使用方法

利用MD5值來保護共用軟體的方法有很多,最簡單的比如先把正常的執行模組的MD5摘要值靜態儲存在外部檔案中(比如包含在註冊檔案中),每次運行時計算自身的MD5並與之比較,從而判斷是否被修改。高深一點的比如用正確的MD5來還原正確的入口地址,或者參與註冊碼/機器碼計算。最好是加上自身MD5驗證之後再用ASProtect或ASPack之類的壓縮軟體加上殼,這樣一旦cracker用脫殼軟體脫殼,軟體將不會正常執行,對於很多crack newbie來說十有八九會懷疑脫殼失敗,進而放棄。

其實軟體保護與破解永遠是魔道相長的一對矛盾,無論怎麼嚴密的防範,肯定有人能破。我們要做的只是把大量的菜鳥cracker擋在門外,如果不幸被高手盯上,那麼恭喜你:這說明你的軟體真的很有價值。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.