熟悉软件操作,发现有注册点。
尝试断下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;
}
原文始发于微信公众号(0x00实验室):CrackMe算法分析案例 | wanao's CrackMe#1-2048
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论