熟悉软件操作,发现有注册点。
尝试断下GetWindowTextA、GetWindowTextW、GetDlgItemTextA、GetDlgItemTextW函数。结果无法断下,因此该输入框获取文本不是通过上述四个函数。
对当前程序环境,进行字符串检索。检索结果如下。
根据字符提示,可以大致分析出当前程序注册所需的注册号形式:
用户名不能为空
用户名不能少于5个字符
序列号错误(此处为关键点,初步预测是账号密码的校验算法附近代码)
尝试对每个序列号错误进行下断操作,直到其中某一个能够断下。
可以明显的看到,有一个跳转在尝试跳过报错函数,如果逻辑上没有执行报错函数,那么是否就能判定,注册码符合要求。那么基本就能锁定,je指令上方的call应该是一个注册码检验函数。
函数内部很简短,函数功能涉及到如下几点。
获取参数字符串
获取字符串所占字节数,根据字节计算字符个数
将字符个数返回
那么我们是否能编写一个注册机,创造对应的用户名密码,生成对应的0xC字符长度的字符串。
#include <iostream>
#include <string>
#include <ctime>
using namespace std;
int main() {
string csUserName;
string csPassWord;
srand(time(NULL));
for (int i = 0; i < 3; i++) {
csUserName += rand() % 5 + '0';
csPassWord += rand() % 5 + '0';
}
cout << "账号:" << csUserName << csUserName << csUserName << csUserName << endl;
cout << "密码:" << csPassWord << csPassWord << csPassWord << csPassWord << endl;
getchar();
return 0;}