知乎:逆向驛站
原文連接
CrackMe006 | 難度適中適合練手 |160個CrackMe深度解析(圖文+視頻+註冊機源碼)算法
crackme006,依然是delphi的,並且沒殼子,條線比較清晰,算法也不難,很是適合新入門的來練習.
快過年了,Crackme系列年前就停更在006吧,祝你們新年666 ,年後繼續安全
【環境和工具】微信
win7/xp虛擬機環境函數
CrackMe006(aLoNg3x.1.exe)工具
ollydbg學習
Dededark測試
【學習層次】調試
逆向分析程序驗證流程邏輯code
解密算法,寫註冊機視頻
積累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