目前很多軟體都是通過網路驗證來實現的,一種比較流行的方式便是把伺服器端(如驗證網頁)放在伺服器上,軟體為用戶端,當軟體註冊或啟動時通過網路與伺服器端進行資料交換,重新實現驗證的目的。
個人覺得網路驗證將是一種趨勢,做得好的網路驗證方式將是對軟體的一種極大保護,如把軟體的關鍵資料或關鍵代碼放在伺服器端,當認證通過後再發回到軟體,且在傳輸過程中都用比較成熟的大型演算法加密,從而達到一種防破解的目的。舉個簡單的例子,軟體SMC加傳輸資料的RSA加密便是一個強度還可以的保護。
這段程式只是一個樣本,顯示其最簡單的實現方式,程式很好的可移植性和很大的發揮空間。
服務端為一個驗證網頁Conn.asp,getinfo.asp,data.mdb,只需把它放至空間上,其中訪問getinfo.asp的格式為:getinfo.asp?username = XXXXXXX & password = XXXXXXX,(XXXXXX表示需要提交確認的使用者名稱和密碼)。
軟體的實現方式為經典的wininet編程,其流程(類似closehandle之類的就不列出來了)基本上為:
1, hInternet = OpenInternet ()
2, hConnection = OpenConnection (hInternet, szUrl, szUsrName, szUsrPwd) ;
3, hRequest = OpenRequest (hConnection, HttpTool::szPost, szUrl, dwFlags, szReferer) ;
4, AddRequestHeader (hRequest) ;
5, SendRequest (hRequest, dwTotalByte.Value ()) ;
6, EndRequest (hRequest)
通過反組譯碼分析發現其實SendRequest 後記憶體中即已發現返回包的值,接下去便為對接受到的包的讀取部分,分別為其頭部和內容部分的讀取,再根據實際傳回值判斷使用者名稱或密碼是否正確。
以上即是對網路驗證的最簡單的實現,詳細內容見原始碼(目前原始碼中wininet部分為Ryeol的封裝類,佩服他的完美封裝。另:使用者需要根據服務端的實際網址修改對應代碼,如更改為:m_strSvrURL=(_T("http://127.0.0.1/softreg/getinfo.asp"));
絡驗證轉本地驗證的一種實現方式:
抓取包的分析過程我就不說了,這裡面牽扯到太多東西了,我的來源程式只是一個很簡單的本機伺服器,當有驗證資訊過來時根據需要發相應的包回去(socket),從而達到欺騙軟體得到驗證的結果。
BIN檔案.rar是上面產生的兩個程式,一個是網路驗證程式(我已經把驗證的IP改為127.0.0.1,現實中也可通過該host方式實現),另一個即是本機伺服器端,只要在發送的內容中填寫123456789即可對軟體進行欺騙驗證。