160个Crackme033
文章目錄
- 查殼
- 分析程序
- 用戶名算法分析
- 序列號算法分析
- 寫出注冊機
- 校驗結果
這個Crackme的作者是《使用OllyDbg從零開始Cracking》那部教程的作者在教程中使用的配套教程,當初也是看的這篇教程入門的,沒想到會在這里遇見。
查殼
這個程序看著有點像Delphi寫的,但其實是匯編寫的。作者在OEP處故意制造了一個和Delphi一模一樣的入口特征來迷惑查殼器。
分析程序
隨便輸入一個序列號和密碼,根據錯誤提示,來到附近代碼,開始分析算法。這個程序的算法在我跟蹤完了之后發現是由兩個部分組成
首先是一個用戶名的計算函數,然后是一個序列號的計算函數,接著比較兩個函數計算的結果是否相等,相等則提示正確。
用戶名算法分析
首先取出用戶名,然后比較依次取出每一位的ASCII值,比較是否小于0x41,是否大于0x5A,41和5A這兩個ASCII值其實就是大寫的A-Z,如果不在這個區間就會進入sub4013D2這個函數
這個函數的作用也相當簡單
就是把ASCII值減去0x20,也就是轉成大寫字母
整個循環的作用其實就是把用戶名轉為全部大寫,然后就進入4013C2這個函數了
這個函數的作用也很簡單,就是將用戶名每一位的ASCII值進行相加,
之后將用戶名的ASCII值之和0x5678進行異或。這個就是完整的用戶名的算法了。接下來分析序列號部分
序列號算法分析
序列號的計算部分也很簡單,首先取出每一位的ASCII值,然后減去0x30,減去0x30也就意味著將字母轉成數字。
接著用edi乘以0xA,然后用edi再加上序列號,總結為下面的等式:
edi = serial + 0x10 * edi;
看著好像挺復雜的,實際上就是把字符串形式的序列號轉成了十進制形式的序列號
接著再將edi和0x1234進行異或。到此序列號的算法部分就完成了
接著比較兩個部分的結果是否相等
寫出注冊機
這種需要在用戶名和序列號直接通過兩種不同的算法需要等于同一個結果這種模式很像Crackme029。那么這個Crackme的注冊機編寫思路也是一樣,首先根據用戶名計算出中間結果,然后再根據結果反向逆推出注冊碼,代碼如下:
int CalcKey() {char username[20] = { 0 };int result = 0;char serial[20] = { 0 };printf("請輸入用戶名:");scanf_s("%s", username, 20);//計算用戶名的結果for (int i = 0; i < strlen(username); i++){if (username[i] < 0x41 || username[i]>0x5A){username[i] -= 0x20;}result += username[i];}result ^= 0x5678;result ^= 0x1234;printf("%d\n", result);return 0; }校驗結果
輸入用戶名和計算的結果,提示正確,破解完成。
需要相關文件的可以到我的Github下載:https://github.com/TonyChen56/160-Crackme
總結
以上是生活随笔為你收集整理的160个Crackme033的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 160个Crackme032用Proce
- 下一篇: 160个Crackme034拆解KeyF