做過carck的都知道無論乙個軟體的註冊碼演算法強度多高,但在驗證時如果只是簡單比較一下輸入的註冊碼經過加密計算後與正確的註冊碼是否相等就判斷使用者是否註冊,則這樣的軟體是非常容易被爆破的.無論軟體編寫者使用的是rsa或是des之類的高強度演算法,carcker都無需關心.短短的修改幾個位元組跳過驗證(稱之為爆破)就能讓這個判斷失效.
因此,需要從根本上解決這個問題則需要對功能核心**也根據輸入的註冊碼進行動態的解密執行,才能徹底防止爆破的可能性.
因為無論怎麼樣的程式語言寫出來的**,經過編譯成可執行檔案時,在機器中最終是一段記憶體資料,因此我們需要對在執行關鍵核心功能部分的記憶體資料進行事先加密,當使用者輸入正確的註冊碼時,這段記憶體資料解密後自然是正確的,能夠執行無誤,而如果是錯誤的呢,則這段記憶體資料自然會是無法執行,一般都會被作業系統報錯並禁止執行,即使偶爾能夠正常執行,它所執行的功能也自然不是原來的功能了.因此,我們不需要對註冊碼進行任何驗證,只需要驗證程式是否執行有錯,就知道註冊碼是否正確了.
在下面一段示例**中,核心功能執行**為一字串陣列,被事先經過了加密,然後被編譯進exe中,當需要使用它時,對它根據輸入進的密碼進行動態解密,這段**能從根本上防止被爆破.
注:因為只是示例,加密演算法是自己隨便定義的,使每位元組的值+1,當然如果在實際中應用時,可以根據喜好換用rsa或des之類的高強度加密演算法了.加密前的關鍵**長度也不必和加密後的長度一樣.
示例**:
#include "stdafx.h"
#include
#include
#include
using namespace std;
int g_nnumber;
void kernelproc( farproc flbaddr, farproc fgtaddr );
int main(int argc, char* argv)
void kernelproc( farproc flbaddr, farproc fgtaddr )
//執行核心**
__a**
cout << "密碼正確!" << endl;
system( "pause" );
/*核心**功能大致c**:
typedef int (*msgbox)( hwnd, lpctstr, lpctstr, uint );
typedef hhandle (*loadlib)( lpctstr );
typedef farproc (*getaddr)( hmodule, lpcstr );
farproc floadlibrary = (loadlib) flbaddr;
farproc fgetprocaddress = (getaddr) fgtaddr;
hmodule hhandle = floadlibrary( "user32.dll" );
farproc fmsgbox = (msgbox) fgetprocaddress( hhandle, "messageboxa" );
fmsgbox( null, null, null, null );
//注:這裡沒有直接使用loadlibrary和getprocaddress函式,因為核心**並不知道這個函式位址,
//這個位址在各台機器和系統平台下均有不同,不方便將之硬編碼
//於是間接使用了傳入的flbaddr位址和fgtaddr位址呼叫.
//核心**彙編碼:
__a***/}
//用seh捕獲錯誤以得知密碼是否正確
catch( ... )
}
Token防爆破? Token繞過
實驗環境 皮卡丘靶場 暴力破解 token防繞過?實驗步驟 檢視頁面原始碼,發現表單中隱藏的input的標籤裡面有個隱藏的token。該token是使用者在開啟頁面的時候,向後台請求乙個token,後台就會產生乙個新的token 當使用者提交賬號和密碼的時候,也會提交token值,後端會先對toke...
爆破格仔店管理軟體
請注意 該動畫內所含廣告與本站無任何關係,為作者個人宣傳,網路交易風險自負 大家好 我是et boy 這個是我的第乙個 教程 當然從最簡單的入手 爆破 乙個格仔店管理軟體 好了下面開始吧 首先是用peid查殼 沒有殼 好od載入 試執行 開啟註冊介面,輸入假註冊碼,記住提示內容 查詢字串 找到提示內...
軟體設計思路
1.手機號登入 一般情況下,使用者的手機號是可能會變化的,不能以手機號作為使用者id 不要使用unid作為業務id,因為識別性不高,如果是自動生成的更可能改變 使用者的手機號作為使用者表的乙個字段,再登入介面來增加一部手機號判斷,此時,介面需要返回真實的userid,後面介面驗證的時候傳遞該user...