打开程序
常规注册界面,打开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;
}
搞定