160个Crackme007
文章目錄
- 查殼
- Darkde分析程序
- 導入符號
- 分析核心算法
- 寫出注冊機
- 校驗結果
- 分析again按鈕事件
- 校驗步驟
007這個crackme跟006是同一個作者,只不過難度上升了一顆星。先來查一下殼吧
查殼
還是Delphi寫的程序,沒有殼。接下來用Darkde分析一下程序。
Darkde分析程序
右邊這個again按鈕是被隱藏的。然后再來看事件
這里有以下幾個事件:
- Cancella按鈕的點擊事件
- About按鈕的點擊事件
- Registerz按鈕的點擊事件
- Again按鈕的點擊事件
總共四個按鈕事件。我們就從Registerz按鈕的點擊事件開始分析。
導入符號
接下來拖到IDA里,添加所有的Delphi簽名。導出Map文件,導入到OD里,方便接下來的分析。
##分析Register按鈕事件
找到0x442F28的位置,下斷點分析。
函數首先獲取密碼,然后檢測密碼是否為純數字,不是則報錯。但是我們必須讓他報一次錯。因為當密碼不為純數字的時候,他會根據密碼生成一個值,這個值在后面必須要用到。如果密碼為純數字,則這個必須的值恒為零,注冊永遠不會成功。
接著如果輸入的密碼不是純數字,那么則會根據輸入的密碼生成一個值,這個值在后面的核心算法會用到,至于是怎么算的我就不知道了。所以我將這個值固定一下,把第一次輸入的密碼固定為GuiShou,。
接下來獲取用戶名,然后有一個核心的算法,算法通過返回值為1則控件消失,否則不通過。接下來分析核心算法。
分析核心算法
首先獲取用戶名的長度,判斷用戶名長度是否小于等于4。是則報錯。
接下來是個兩層循環,計算的是用戶名的第一位和最后一位的乘積,然后再乘以剛剛用用戶名計算出來的被我固定的值。外層循環變換用戶名最后一位,每次往前移動一位。內層循環變換用戶名第一位,每次往后移動一位。接著將結果保存到eax。
接著將eax對0xA2C2A取模,記為結果1,然后將輸入的密碼除以0x59加上密碼模以0x50再加1的值,記為結果2。然后比較結果1和結果2是否相等。相等則返回1,消失按鈕。不相等則返回0。
寫出注冊機
為了防止最后計算的結果產生溢出,所以我將用戶名固定為5位。代碼如下。
int CalcKey1() {int nKey = 0x1C48;char szName[10] = { 0 };int nCode = 0;int nTemp = 0;printf("請輸入用戶名:");scanf_s("%s", szName, 10);if (strlen(szName)!=5){printf("請輸入五位用戶名\n");return 0;}//根據name字符串計算for (int i = 1; i <= 5; i++){for (int j = 5; j >= 1; j--){nTemp += szName[i - 1] * szName[j - 1] * nKey;}}//取模nTemp = nTemp % 0xA2C2A;//反推codenCode = (0x50 - ((nTemp - 1) * 0x59 % 0x50)) + (nTemp - 1) * 0x59;printf("%d\n", nCode);return 0; }校驗結果
首先輸入用戶名為12345(不固定 但限制長度必須為5),密碼輸入GuiShou(密碼已固定)。然后點擊,提示報錯信息直接點擊確定。
接著將用戶名輸入到注冊機中,然后復制生成的序列號,點擊注冊,可以看到注冊按鈕消失。
分析again按鈕事件
接下來來到0x4430BC這個位置,分析整個again按鈕的點擊事件。這個按鈕事件跟Register完全一樣。
首先是獲取密碼,然后檢測密碼是否為純數字,不是則報錯,然后根據非純數字的密碼計算出一個值。
接著傳入參數,又到了核心的算法函數,這個函數跟之前分析的一模一樣。所以這個crackme到這里就算了完全結束了。最后做一下總結。
校驗步驟
需要相關文件的可以到我的Github下載:https://github.com/TonyChen56/160-Crackme
總結
以上是生活随笔為你收集整理的160个Crackme007的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 160个Crackme006
- 下一篇: 001 FSG 1.33变形壳