CrackMe算法分析案例 | wanao's CrackMe#1-2048
2023-4-6 08:32:32 Author: 0x00实验室(查看原文) 阅读量:34 收藏

熟悉软件操作,发现有注册点。

尝试断下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;

}


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5MDY2MTUyMA==&mid=2247489170&idx=2&sn=e4f12afb292310905dd592dd88570085&chksm=cfd8696df8afe07b162bbcf68105ee17fab7a9bca09a3a6b94efb17ee2e2749eecee907e1694#rd
如有侵权请联系:admin#unsafe.sh