知乎:逆向驛站
原文鏈接
CrackMe006 | 難度適中適合練手 |160個CrackMe深度解析(圖文+視頻+註冊機源碼)
crackme006,依然是delphi的,而且沒殼子,條線比較清晰,算法也不難,非常適合新入門的來練習.
快過年了,Crackme系列年前就停更在006吧,祝大家新年666 ,年後繼續
準備
【環境和工具】
win7/xp虛擬機環境
CrackMe006(aLoNg3x.1.exe)
ollydbg
Dededark
【學習層次】
逆向分析程序驗證流程邏輯
解密算法,寫註冊機
積累Delphi程序逆向特點經驗
實戰圖文
最終效果展示
程序驗證流程邏輯圖
動態分析
1.程序觀察
旁邊既然有個help,我們當然要看了,四個彈框,有實際信息價值的是頭兩個,如圖
大體意思是,這個crackme的最終目標是隱藏ok和cancella按鈕來觀看完整的Ringzero logo。
2.控件ID,事件函數信息
依然老規矩,既然是delphi的程序,我們就先用dededark給控件信息和事件函數信息蒐集出來
3.控件ID常量搜索法,打開入手點
程序開始是ok按鈕是禁用狀態,cancella按鈕是可以點擊的,那麼我們就從cancella入手,兩個方向,你可以去找cancellaclick事件的函數入手,也可以從cancella控件ID入手,我這裏選擇後者,因爲最終目的是cancella要被隱藏起來,無論如何一定會用到控件ID
查找→所有常量→2D0(cancella按鈕控件ID),結果如下
一共有四個地方用到了這個控件ID,我們分別跟入查看哪個是我們想找的隱藏這個控件的反彙編代碼,從上至下依次如下
找到了入手點,我們開始上下閱讀函數塊,發現這正是cancellaclick事件函數
4.分析Cancellaclick中算法
在Cancellaclick函數入口處下斷點,然後用戶名輸入123456,註冊碼輸入654321,然後開始動態調試分析,F8步過分析如下圖
F7跟如算法call仔細分析,如下圖
這種不是摘要hash的,是直接可以逆推計算出註冊碼,根據以上算法的反彙編分析,寫出逆推註冊碼的源碼,如下
char szName1[128] = {0};
char szCode[128] ={0} ;
char szRes[256] ={0} ;
int nKey = 0 ;
int nlen = 0;
int nTemp = 0 ;
GetDlgItemText(IDC_EDIT1,szName1,128);
nlen = strlen(szName1);
if (nlen<=5 || nlen >10 || szName1[0] == 0x30)
{
MessageBox("請輸入6-10字符長度的字符串,而且第一位不能是0!","逆向驛站提示您");
return ;
}
/************************************************************************/
/* cancella點擊事件算法,可隱藏cancella按鈕,根據輸入name推code */
/************************************************************************/
nKey = ((int)szName1[4])%7+2 ;
nTemp = nKey ;
//階乘
for (int i=1;i<nTemp;i++)
{
nKey = nKey * i;
}
nTemp = nKey ;
nKey = 0 ;
//求和
for (int j =0;j<nlen ;j++)
{
nKey = nKey + nTemp * ((int)szName1[j]);
}
//得出正確code
nKey = nKey - 0x7a69 ;//nKey值就是code應該輸入的值
例如我們輸入的用戶名是123456,逆推註冊碼計算如下
"123456"的第五個字符是"5",asc碼是53,即十六進制0x35
除以7餘數是4,再加2是6
6的階乘是6 * 5* 4* 3 2 1,等於720 ,即十六進制的0x2D0
123456每個字符的asc碼相加是0x31+0x32+0x33+0x34+0x35+0x36,結果是0x135
0x135 乘以0x2D0是0x36510
0x36510比註冊碼的十六進制形態大0x7A69
即註冊碼是0x36510-0x7A69 = 0x2EAA7 ,即十進制是191143
算出了註冊碼,我們來測試一下,如下動圖
Cancella按鈕消失
5.分析OK按鈕中算法
有了如上的過程作爲經驗,我們"依葫蘆畫瓢",來進行ok按鈕中的算法分析,依然是okClick事件入口下斷,F8動態分析,結果如下
F7跟如算法call仔細分析,如下圖
分析後發現,這個算法是根據已經算出的註冊碼,再次要求用戶名合規,算法並不難,而且很敏感的看到0x41,0x41對應的asc字符是大寫字母A,而0x41加上的數字的取值範圍是0-0x19,即十進制0-25,那一看就知道,就是26個大寫字母範圍內了,這時候你可以變態的暴力枚舉也行,當然這個也是可以逆推出來,我們還是選擇逆推吧。源碼如下
/************************************************************************/
/* ok點擊事件算法,可隱藏ok按鈕,根據code推name */
/************************************************************************/
sprintf(szCode,"%d",nKey);
nlen =strlen(szCode);
szName1[nlen]='\0';
//循環處理後,szName1就是要求的name
for (int k =nlen-1;k>=0;k--)
{
szName1[k] = ((int)szCode[k] * (int)szCode[k] * (k+1))%0x19+0x41;
}
sprintf(szRes,"1.請在code處輸入%d,然後點擊cancella按鈕\r\n\r\n", nKey);
sprintf(szRes+strlen(szRes),"2.cancella按鈕消失後,請在name處輸入%s,然後點擊ok按鈕\r\n\r\n", szName1);
sprintf(szRes+strlen(szRes),"3.ok按鈕消失,註冊成功");
SetDlgItemText(IDC_EDIT2,szRes);
我們剛輸入的註冊碼是191143,逆推出用戶名應該是"BXDEUG",驗證如下動圖
OK按鈕消失,至此全部搞定, 是不是感覺不難,去網盤中下載,試試吧
補充知識點
再CancellaClick事件算法中,有個階乘計算,函數內部反彙編代碼如下,可以作爲知識點積累,下次看到這個第一時間就能反應過來,提高效率,逆向的老手往往是這種知識碎片很多,而且腦部搜索算法很精準
最後,喜歡這裏的請推薦給你身邊的朋友吧(滲透測試、逆向破解、病毒分析、信息安全等)
文章中涉及軟件、課件、源碼等均在網盤,爲避免網盤鏈接失效,公衆號中回覆:網盤
歡迎關注微信公衆號:逆向驛站
相關文章
本期標籤:dededark|delphi反彙編|crackme|crackme6|crackme06