160个Crackme034拆解KeyFile验证升级版
文章目錄
- 查殼
- 分析程序
- 用戶名算法分析(前14位)
- 序列號算法分析(后4位)
- 算法總結
- 注冊機探索
- 驗證結果
這個Crackme和上一個是同一個作者,保護方式是KeyFile。難度兩顆星
查殼
同樣是匯編寫的,作者偽造了一個Delphi的OEP。
分析程序
這個軟件的KeyFile保護沒有必要用監(jiān)控工具了。驗證直接就在入口處,直接單步往下跟就可以了
首先檢測CRACKME3.KEY這個文件是否存在
然后從文件中讀取0x12個字節(jié),并檢測文件內容是否少于0x12個字節(jié),
那么我們就偽造一個CRACKME3.KEY文件,并且再里面隨便輸18個字母
然后將文件內容放入堆棧,開始計算前14個字節(jié)。
這個文件總共需要18個字節(jié),前14個字節(jié)為用戶名,后4個字節(jié)為序列號。每一部分都有一個算法,下面分析用戶名算法部分
用戶名算法分析(前14位)
用戶名算法的校驗過程如下:
序列號算法分析(后4位)
接下來將0x14個字節(jié)的文件內容壓入堆棧,然后執(zhí)行0040133C這個函數(shù)
這個函數(shù)的作用就算將文件內容右移14位,也就是去掉前14位用戶名的部分,然后將最后四位賦值給eax
最后比較后四位是否等于[0x4020F9],也就是前12位用戶名計算的結果,根據(jù)比較的結果提示是否破解成功
算法總結
總結一下前面的分析,文件內容必須是18個字符,前14位是用戶名,后4位是序列號。序列號必須等于用戶名計算的結果。
注冊機探索
接下來寫出注冊機,代碼如下:
#include <iostream> #include <windows.h> using namespace std;int main() {char username[15] = { 0 };char serial[5] = { 0 };int temp = 0x41;int result = 0;printf("請輸入用戶名,長度必須為14:");scanf_s("%s", username, 15);for (int i = 0; i < 14; i++){username[i] ^= temp;result += username[i];temp++;}result ^= 0x12345678;char* p = (char*)&result;for (int i = 0; i < 4; i++){printf("%c", p[i]);}printf("\n");system("pause");return 0; }驗證結果
隨便輸入一個12位的用戶名,然后把計算出來的序列號復制過去替換后四位,亂碼不需要管,再打開目標程序
破解完成,最后需要相關文件可以到我的Github下載:
https://github.com/TonyChen56/160-Crackme
總結
以上是生活随笔為你收集整理的160个Crackme034拆解KeyFile验证升级版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 160个Crackme033
- 下一篇: 160个Crackme035