160个Crackme029

查壳

在这里插入图片描述

这个Crackme跟027和028是同一个作者,VC6写的,难度为一颗星

分析程序

在这里插入图片描述

同样,根据字符串的错误提示,来到函数头的位置,配合IDA的伪代码分析整个算法,

分析算法

在这里插入图片描述

随便输入一个用户名和序列号,算法的校验过程如下。这个Crackme跟028一样有花指令的干扰,如果想在IDA中看到F5的伪代码,需要手动去除花指令,去除的方法请参考我的Crackme027的分析

在这里插入图片描述

  1. 获取用户名长度 比较是否大于5

在这里插入图片描述

  1. 获取序列号长度 比较是否大于5

在这里插入图片描述

  1. 根据用户名计算,得出结果,算法转换为C++代码如下:

在这里插入图片描述

do
	*username++ ^= index++;                 
while ( *username );
  1. 根据序列号计算,得出结果,算法转换为C++代码如下:

在这里插入图片描述

i = 10;
do
	*Serial_1++ ^= i++;                   
while ( *Serial_1 );

对 没错 两个算法都是直接从IDA的伪代码中拷出来的 直接就能用

  1. 循环比较用户名的计算结果和序列号的计算结果是否相等,根据比较的结果提示跳转与否

在这里插入图片描述

也就是说用户名和序列号必须要满足程序中的等式才能注册成功

写出注册机

这个程序的注册机也比较好写,首先根据用户名计算出中间结果,然后再根据结果反向逆推出注册码,代码如下:

#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
	char username[20] = { 0 };
	char result[20] = { 0 };
	char key[20] = { 0 };
	printf("请输入用户名 必须为全大写:");

	scanf_s("%s", username, 20);
	int usernameLength = strlen(username);
	if (usernameLength <= 5)
	{
		printf("用户名长度必须大于5");
	}
	//计算中间结果
	for (int i=0;i<usernameLength;i++)
	{
		username[i] ^= i+1;
		result[i] = username[i];
	}

	//根据结果逆推注册码

	for (int i = 10; i < usernameLength+10; i++)
	{
		result[i-10] ^= i;
		key[i-10] = result[i-10];
	}

	printf("%s\n", key);
	system("pause");
	return 0;
}

校验结果

输入用户名和计算出来的序列号

在这里插入图片描述

提示正确 破解成功

需要相关文件可以到我的Github下载:https://github.com/TonyChen56/160-Crackme

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼手56

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值