破解練習-CRACKME001

逸聆君發表於2023-02-11

001-註冊演算法分析

一、工具和除錯環境

  • 動態除錯工具:x64dbg
  • 系統環境:win10 1909

二、分析Serial/name的演算法

由於Serial裡面就是一個字串比較,沒有啥演算法,這裡就不詳細說了,大概就是透過搜尋字串Failed,就能定位到關鍵位置,Serial直接可以在棧中觀察到,為:Hello Dude!。所以我們主要分析Serial/name的註冊演算法。

直接使用提示字串驗證,得到錯誤提示如下

那麼我們直接搜尋字串Sorry,得知有兩個地方使用該字串,都設定上斷點,然後重新驗證,成功斷在0x0042F826處,先分析這個,另一個後面再說

斷下之後向上定位到關鍵演算法如下

0042FA87     | 8B45 F0    		| mov eax,dword ptr ss:[ebp-10]      | [ebp-10]:"Please enter your name !" ; 獲取name首地址
0042FA8A     | 0FB600     		| movzx eax,byte ptr ds:[eax]        | ; eax = name[0] 取出name的第一個字元存放在eax中
0042FA8D     | F72D 50174300     | imul dword ptr ds:[431750]         | 00431750:L")"  ; ")" aiscii碼為 0x29  eax = name[0] * 0x29
0042FA93     | A3 50174300       | mov dword ptr ds:[431750],eax      | ; key = name[0] * 0x29
0042FA98     | A1 50174300       | mov eax,dword ptr ds:[431750]      | ; 
0042FA9D     | 0105 50174300     | add dword ptr ds:[431750],eax      |	; key = name[0] * 0x29 * 2

透過演算法key = name[0] * 0x29 * 2算出key後,緊接著拼接得到Serial,格式為:CW-key-CRACKED

三、演算法核心程式碼模擬

char* GetSerial(char* szName)
{
	static char szSerial[60] = {};
	if (strlen(szName) < 4)
	{
		MessageBox(NULL, "Name至少需要4位", "溫馨提示", MB_OK);
		return nullptr;
	}

	int key = szName[0] * 0x29 * 2;
	
	sprintf(szSerial, "CW-%d-CRACKED", key);
	return szSerial;
}