打開程序
常規注冊界面,打開OD
,隨便找找就看到關鍵字了
沒有殼邏輯也挺簡單的
獲取輸入框,用5
比較輸入內容的長度,小于則跳轉提示密碼長度不夠
否則就進入下一個流程,去獲取序列號,其實可以直接將jnz
換成je
就可以完成暴力破解。
這里主要是要理解一下這個loopd
循環體的內容,直接看著還是有點難理解,動態調試到是能看明白。這里主要是難在了不知道什么時候才會停止循環,看來明天要寫個c
看下反匯編單獨學一下了。還是用IDA
吧,打開IDA
,跳轉到401152
處,按F5
,進入到偽代碼段。
通過這部分稍微就好理解了,序列號的內容為對應用戶名的每一位的ascii
值減去長度
加上位置
,比如假如用戶名總長度為5
,第0
位為A
,則A - 5 → A(65) -5 - 0 = 60 ('<')
,第1
位為B
,B - 5 + 1 → B(66) -4 = 62 ('>')
,用這個就可以寫出注冊機了。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>void generate_key(const char* input, char* output) {int len = strlen(input);for (int i = 0; i < len; i++) {// 核心算法:output[i] = input[i] - (len - i)output[i] = input[i] - (len - i);}output[len] = '\0'; // 添加字符串終止符
}int main() {char username[21]; // 最大20字符+1終止符char serial[21]; // 同樣大小printf("Enter username (5-20 characters): ");if (!fgets(username, sizeof(username), stdin)){perror("Input error");return 1;}// 移除換行符username[strcspn(username, "\n")] = '\0';int len = strlen(username);if (len < 5) {printf("Error: Username must be at least 5 characters\n");return 1;}generate_key(username, serial);printf("Generated Serial: %s\n", serial);return 0;
}
搞定