摘要:所以按鈕消失的方法是跟一模一樣的,只是他消失后,不再顯示其他按鈕而已,至此注冊成功,的標題也溫順的變成了了。
作者:逆向驛站
微信公眾號:逆向驛站
知乎:逆向驛站
crackme007,是006的升級版,程序開發者給出的難度是3星,可能是迷惑有點多?個人覺得條線還是比較清晰,難度也不大,依然適合新手準備
【環境和工具】
win7/xp虛擬機環境
CrackMe007(aLoNg3x.2.exe)
ollydbg
Dededark
【學習層次】
逆向分析程序驗證流程邏輯
解密算法,寫注冊機
積累Delphi程序逆向特點經驗
實戰圖文最終效果展示
程序驗證流程邏輯圖
動態分析
1.程序觀察
crackme006的升級版,最終目標是一致的,均是要求給下方的藍色logo無遮蓋的顯示出來,也就是說要給這個區域的控件全部隱藏,程序界面如下圖
同時可見開發crackme的和學習crackme的目標和標準是一致的,path的方式是不被認可的,即不可爆破,crackme若是個美貌女子,則應征服其心,切不可霸王硬上弓。
2.控件ID,事件函數信息
依然老規矩,既然是delphi的程序,我們就先用dededark給控件信息和事件函數信息搜集出來
3.控件ID常量搜索法,打開入手點
程序開始只有一個Register按鈕,對應上圖,其控件ID是2CC,那么我們依然就從2CC常量出發
查找→所有常量→2CC(Register按鈕控件ID),結果如下
跟入第一個,根據之前的對dephi程序逆向的經驗,應該可以一眼看出,這里的反匯編代碼,功能是:dl的值0是隱藏,1是顯示,如下圖
可以看出,若是程序如期執行到這里,則隱藏Register按鈕,并顯示Again按鈕,那么我們在這個代碼的函數塊入口處下斷點,來動態分析這個函數塊的邏輯流程,如下圖
可以看到,這個函數實際就是點擊Register按鈕的事件函數,首先會對code進行驗證,若是純數字則跳到下方,否則彈框報錯,并給[0x445830]賦值,看似多此一舉,實則是必須過程,原因后面會提到,如果輸入的是純數字,則執行以下流程,如圖
在這里我們看到了算法函數,算法函數需要三個參數(用戶名、code、[0x445830]的值),算法函數若是合規,則隱藏Register按鈕,顯示Again按鈕。那么我們就F7跟入算法函數去研究算法
4.分析算法
在分析算法前,需要對[0x445830]這個全局變量值做一個說明
初始值是0
經過動態分析(請自行動手)得出,對它賦值的觸發條件是,需要code輸入至少6個英文字母,然后點擊Regsiter按鈕
輸入AAAAAA,它會被賦值固定值0x1686
既然是這種輸入輸出都可控的全局變量值,我們就不去糾結其算法什么的了,當然如果你想去研究分析,那也是值得提倡得
然而為什么非得多此一舉得對他賦值呢?因為后面得核心算法中,它的值將作為一個乘數,若是0的話,那么算法的最終結果無論如何都會是0,0是無法完成算法合規的,簡單的說,若是這個值是0,則不可能完成注冊,所以要對他進行這種看似多此一舉的隱藏賦值。是不是類似開啟隱藏奶牛關,呵呵!
后面得所有分析中我們都按照,code輸入AAAAAA后[0x445830]被賦值0x1686為準
我們來分析算法,如圖
可見核心算法是
首先要求用戶名要大于4個字符,為了防止溢出,我寫的注冊機就硬性規定為5個字符
根據輸入的用戶名,經過兩次嵌套循環,和[0x445830]的值,即我們控制其值為0x1686,共同計算出一個值,暫時記為nTemp
nTemp = nTemp % 0xA2C2A
第二次輸入的注冊碼要求是純數字,純數字作為10進制的數字型值,記為nCode
則公式是nCode/0x59+nCode%0x50+1 = nTemp
這種不是摘要hash的,是直接可以逆推計算出注冊碼,根據以上分析,寫出逆推注冊碼的源碼,如下
//code輸入AAAAAA給[0x445830]賦的值 int nKey = 0x1686; char szRes[1024] = {0}; char szName[32] = {0}; int nCode = 0; int nTemp = 0; GetDlgItemText(IDC_EDIT1,szName,31); if (strlen(szName)!=5) { MessageBox("請輸入5字符長度的字符串","逆向驛站提示您"); } else { //根據name字符串計算 for (int i =1;i<=5;i++) { for (int j =5;j>=1;j--) { nTemp = nTemp + (int)szName[i-1] * (int)szName[j-1] * nKey; } } } //取模 nTemp = nTemp%0xA2C2A ; //反推code nCode = (0x50 - ((nTemp -1)*0x59 % 0x50))+(nTemp-1) * 0x59 ; sprintf(szRes,"1.把注冊機的五字符長度用戶名輸入nome處 "); sprintf(szRes+strlen(szRes),"2.請在code處輸入AAAAAA,然后點擊Register按鈕,彈框確認關閉即可 "); sprintf(szRes+strlen(szRes),"3.請在code處輸入%d,然后點擊Register按鈕 ", nCode); sprintf(szRes+strlen(szRes),"4.Register按鈕消失,again按鈕出現 "); sprintf(szRes+strlen(szRes),"5.請再次在code處輸入AAAAAA,然后點擊again按鈕,彈框確認關閉即可 "); sprintf(szRes+strlen(szRes),"6.請再次在code處輸入%d,然后點擊again按鈕,按鈕消失,注冊成功 ", nCode); SetDlgItemText(IDC_EDIT2,szRes);
crackme注冊機的完整源碼均在網盤
5.分析Again按鈕事件函數
我們現在已經成功的隱藏了Register按鈕,但是又出來了一個Again按鈕,有了如上的過程作為經驗,我們"依葫蘆畫瓢",對Again按鈕進行分析,結果發現,其實驗證流程完全是重復了一遍Regsiter按鈕,Again按鈕點擊事件逆向代碼如下
可以看到,給[0x445830]賦值的隱藏算法和最后的合規核心算法,均自動顯示出來了中文標簽,這就是習慣做標簽的好處,之所以會顯示出來,那證明跟上方的Regsiter部分的兩個算法均調用的相同的算法函數,參數相同,算法相同,那么結果一定相同了。
所以Again按鈕消失的方法是跟Register一模一樣的,只是他消失后,不再顯示其他按鈕而已,至此注冊成功,Crackme007的標題也溫順的變成了Crackme by "your name"了。
是不是有如開頭所說的征服美女的快感?去網盤中下載,試試吧
文章中涉及軟件、課件、源碼等均在網盤,為避免網盤鏈接失效,公眾號中回復:網盤
歡迎關注微信公眾號:逆向驛站
相關文章
● CrackMe-006精解
● CrackMe-005精解(下)
● CrackMe-005精解(上)
● CrackMe-004精解
● CrackMe-003精解
● CrackMe-002精解
● CrackMe-001精解
標簽:逆向|破解|反匯編|olldbg|滲透測試|病毒分析|網絡安全|區塊鏈
本期標簽:dededark|delphi反匯編|crackme|crackme7|crackme07
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11456.html
摘要:作者逆向驛站微信公眾號逆向驛站知乎逆向驛站上篇說了具體方法,下篇來發逆向分析過程,看看老夫是如何得到上篇的具體方法的準備環境和工具虛擬機環境專用脫殼器學習層次爆破,但是這個作者聲明了,爆破他是不認可的解密流程,寫注冊機積累程序逆向特點經驗詳 作者:逆向驛站微信公眾號:逆向驛站知乎:逆向驛站showImg(https://segmentfault.com/img/bVbnHJT?w=11...
摘要:作者逆向驛站微信公眾號逆向驛站知乎逆向驛站依然是的,而且沒殼子,條線比較清晰,算法也不難,非常適合新入門的來練習快過年了,系列年前就停更在吧,祝大家新年年后繼續準備環境和工具虛擬機環境學習層次逆向分析程序驗證流程邏輯解密算法,寫注冊機積累程 作者:逆向驛站微信公眾號:逆向驛站知乎:逆向驛站showImg(https://segmentfault.com/img/bVbnUo0?w=11...
閱讀 1906·2021-11-22 14:44
閱讀 1672·2021-11-02 14:46
閱讀 3657·2021-10-13 09:40
閱讀 2600·2021-09-07 09:58
閱讀 1586·2021-09-03 10:28
閱讀 1658·2019-08-29 15:30
閱讀 976·2019-08-29 15:28
閱讀 1469·2019-08-26 12:20