160个Crackme006
文章目錄
- 查殼
- 導(dǎo)入符號
- 分析程序
- 分析Cancella按鈕點擊事件
- 分析關(guān)鍵函數(shù)
- 寫出注冊機
- 驗證結(jié)果
- 分析ok按鈕點擊事件
- 分析關(guān)鍵函數(shù)
- 寫出注冊機
- 校驗結(jié)果
查殼
同樣也是用Delphi寫的,沒有殼。
導(dǎo)入符號
將程序載入到IDA,添加所有的Delphi的簽名,然后導(dǎo)出為map文件,在OD中加載map文件,強大的簽名庫可以減少后面的分析時間。
分析程序
接下來分析一下這個程序,OK那個按鈕被禁用了,這是什么套路?
旁邊還有個help,不過都是英文的,上翻譯。
好,大概了解了。我們的目的就是要讓那兩個按鈕變成隱藏的。
再拖到Darkde4里面查看一下按鈕事件和窗口
從控件窗口可以看到在下面這個控件里有一個OK按鈕 有一個Cancella按鈕,還有一個圖片。我們的目的應(yīng)該就是讓那個圖片顯示出來。
事件按鈕有如下幾個響應(yīng)事件,每個響應(yīng)事件都有對應(yīng)的RVA:
- 代碼變換事件
- OK按鈕點擊事件
- 用戶名變換事件
- Cancella按鈕點擊事件
- About按鈕的點擊事件
那么既然要讓這兩個按鈕變的不可見,就從Cancella這個按鈕的點擊事件開始分析
分析Cancella按鈕點擊事件
找到Cancella按鈕點擊事件對應(yīng)的RVA0x442EA8,隨便輸入一個賬號密碼,下斷分析。
首先會獲取輸入的密碼,然后將密碼轉(zhuǎn)為十進(jìn)制數(shù)。接著獲取用戶名,然后是一個關(guān)鍵函數(shù),這個函數(shù)如果返回值為1,那么就不跳轉(zhuǎn),按鈕就會消失。接下來分析下這個關(guān)鍵函數(shù)。
分析關(guān)鍵函數(shù)
這里直接貼出IDA的分析結(jié)果,如果想要詳細(xì)的過程可以去看我的udd文件。首先對用戶名的做取模運算之后求階乘,然后將每個用戶名的ASCII乘以階乘相加,最后把結(jié)果減去輸入的密碼,如果等于31337就返回1,否則返回零。也就是說,我們只要復(fù)制上面的過程,然后將結(jié)果減去31337,就能得到正確的密鑰。
寫出注冊機
//計算第二個按鈕Cancella所需要的密碼 int CalcKey1() {int key = 0;int nTemp = 0;int num = 0; char username[20] = { 0 };printf("請輸入用戶名,長度必須在六位以上:");scanf_s("%s", username, 20);//檢查長度if (strlen(username)<=5){printf("用戶名長度不滿足 請重新輸入");return 0;}//求階乘num = ((int)username[4]) % 7 + 2;nTemp = num;for (int i=1;i< nTemp;i++){num *= i;}nTemp = num;int result = 0;//求用戶名的ASCII和乘以階乘for (int i=0;i<strlen(username);i++){result += nTemp * username[i];}//取出正確的密碼key = result - 0x7A69;printf("%d\n", key);}驗證結(jié)果
輸入計算的結(jié)果,點擊 我們可以看到右邊的按鈕消失了,并且左邊的OK按鈕也解除了禁用狀態(tài)。
分析ok按鈕點擊事件
接下來來到的位置,來分析OK按鈕的點擊事件。
還是同樣的套路,有一個關(guān)鍵的算法函數(shù),這個函數(shù)返回1,按鈕就消失,否則不成功。
分析關(guān)鍵函數(shù)
整個關(guān)鍵函數(shù)校驗如下,首先取出密碼的最后一位,然后做平方運算,接著乘以當(dāng)前的密碼長度,也就是index,然后對0x19取模,最后加上0x41然后保存結(jié)果,每個結(jié)果對應(yīng)一位用戶名。
寫出注冊機
接下來還原算法寫出注冊機
//計算第一個按鈕OK所需要的密碼 int CalcKey2() {char key[20] = { 0 };char username[20] = { 0 };printf("請輸入注冊碼,長度必須在六位以上:");//輸入密碼scanf_s("%s", key, 20);//檢查長度if (strlen(key) <= 5){printf("密碼長度不滿足 請重新輸入");return 0;}for (int i= strlen(key)-1;i!=-1;i--){username[i] = (key[i] * key[i] * (i + 1)) % 0x19 + 0x41;}printf("%s", username); }校驗結(jié)果
輸入序列號,然后自動生成用戶名,可以看到OK按鈕也跟著消失了。
需要相關(guān)文件的可以到我的Github下載:https://github.com/TonyChen56/160-Crackme
總結(jié)
以上是生活随笔為你收集整理的160个Crackme006的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 160个Crackme004
- 下一篇: 160个Crackme007