160个Crackme023
文章目錄
- 查殼
- 分析程序
- 分析條件一
- 分析條件三
- 分析條件二
- 分析條件四
- 寫出注冊機
查殼
目標程序是一個用匯編寫的帶圖形界面的程序,沒有殼
分析程序
直接查找錯誤的字符串,來到錯誤的提示處,可以看到這個cmp就是關鍵比較了
這里會比較eax是否等于0x10,而eax來自于0x403166,所以必須讓0x這個地址的值為0x10才能注冊成功
直接右鍵->查找所有常量
這里有四個地址分別對0x403166進行了+4的操作,只要同時滿足四個條件,就能注冊成功了
分析條件一
首先來分析第一個地址的401093處的代碼
這里首先獲取用戶名,然后判斷用戶名長度是否為零,不為零則對0x403166這個地址執行+4操作,所以這個地方一定會斷下來
分析條件三
為什么先看條件三,因為我之前已經分析完了,這四個位置有一個先后順序的問題,按照順序再來到00401493這個地址
這里會獲取輸入的序列號,然后將序列號保存到0x403188這個地址,這個地址很重要,這個地址也是一定會斷下來的
分析條件二
再來看條件二,這里就是這個程序校驗的算法了,校驗過程如下
分析條件四
這里首先會取出0x403188的結果,然后加上0x9112478,接著比較eax是否為零,為零則403166這個位置加上4,從這里可以得出條件三的算法結果必須為0-0x9112478=0xf6eedb88
寫出注冊機
根據條件三的結果,我們可以直接逆推出注冊機
int CalcKey() {char* name;unsigned long serial = 0xF6EEDB88;unsigned long *p;name = new char[20]{0};cout << "請輸入用戶名:";gets_s(name, strlen(name) - 1);for (int i= 0x10 - 1; i >= 0; i--){p = (unsigned long *)&name[i];serial ^= *p;serial--;}cout <<serial << endl;return 0; }輸入用戶名和計算的序列號,注冊成功,破解完成
需要相關文件的可以到我的Github下載:https://github.com/TonyChen56/160-Crackme
總結
以上是生活随笔為你收集整理的160个Crackme023的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 160个Crackme022之故布疑阵
- 下一篇: Windbg新手入坑指南