160个Crackme031之一元二次方程
文章目錄
- 查殼
- 設計思路
- 算法分析
- 第一部分
- 第二部分
- 寫出注冊機
- 校驗結果
查殼
這個Crackme和030是同一個作者,也是VB程序。雖然難度顯示是問號,充其量也就一星
設計思路
這個Crackme和上一個算法幾乎一樣,作者又故技重施了一次。所以我們先來捋一遍Crackme30的校驗過程,再看這個會相對輕松。
作者首先準備了一個正確的序列號和一個密鑰,然后用密鑰去加密這個正確的序列號,得到密文,也就是結果;然后用同樣的密鑰去加密用戶輸入的序列號,得到結果。最后去比較正確的序列號加密的結果和用戶輸入的序列號加密的結果。如圖:
根據異或的特性,直接用正確結果去異或密鑰,就能得到正確的序列號,相當于解一個一元一次方程。那么這一次的Crackme有兩個密鑰,作者對序列號進行了兩次加密,這就相當于解一個一元二次方程了。直接來看這個程序的算法
算法分析
這個序列號被加密了兩次,所以分為兩個部分,先來看第一個部分,先隨便輸入一個序列號123456789
第一部分
獲取序列號長度,轉成int之后將序列號長度作為循環次數
然后開始逐個取出序列號的每一個字符
然后取出硬編碼字符串的字符,也就是前面說的密鑰,這是第一個密鑰,數字4
然后再將序列號的ASCII值和密鑰的ASCII值進行異或
然后將異或后的結果保存到[epb-0x38]
然后開始新一輪循環
我們直接在[ebp-0x38]就能看到這部分的計算結果,這個部分的計算結果還要用于跟第二個密鑰進行異或
第二部分
首先還是獲取第一部分的結果的長度,作為循環次數,然后你會看到[402D8D]這個地址有一個cmp [ebp-0x8],4,這個4其實是密鑰長度
然后從第一部分的計算結果中開始逐個取字符
然后從硬編碼的字符串中取一個字符,也就是這部分的密鑰,密鑰就是數據窗口的02 00 00 00,長度為4
然后用第一部分計算的結果和密鑰進行異或,5是我們第一部分的計算結果的第一位,32是2的ASCII值
異或完成之后開始下一輪循環,循環結束之后會得到最終結果
最后用最終結果和硬編碼的字符串進行比較,根據比較的結果提示注冊成功與否
寫出注冊機
來總結一下剛才的分析過程,用輸入的序列號和密鑰1進行異或,得到結果。然后再將結果和密鑰2進行異或,得到最終結果。然后將最終結果和字符串進行比對。
那么我們就能利用字符串和兩個密鑰,進行兩次異或操作,就能拿到正確的序列號了。這個可以手工計算也可以寫個注冊機實現。最后,貼上代碼:
#include <iostream> #include <windows.h> using namespace std;int main() {char serial[16] = { 0 };char result[15] = { "VeiajeEjbavwij" };char key1[16] = { "200020002000200" };char key2 = '4';for (int i = 0; i < 14; i++){serial[i] = result[i] ^ key2;}for (int i = 0; i < 14; i++){serial[i] = serial[i] ^ key1[i];}printf("%s\n", serial);system("pause");return 0; }校驗結果
填入計算出來的序列號,提示密碼正確 破解完成。
需要相關文件的可以到我的Github下載:https://github.com/TonyChen56/160-Crackme
總結
以上是生活随笔為你收集整理的160个Crackme031之一元二次方程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 160个Crackme030之一元一次方
- 下一篇: 160个Crackme032用Proce