160个Crackme044


【软件名称】:Dope2112.1.exe

【软件大小】:178KB

【下载地址】:自行搜索下载

【加壳方式】:无壳

【保护方式】:Name/Serial

【编译语言】:Delphi

【调试环境】:W7 32

【使用工具】:OD + IDA

【破解日期】:2019年5月21日

【破解目的】:纯属兴趣

寻找切入点

在这里插入图片描述

首先搜索关键字符串,根据这个地址对应到IDA可以很快找到函数头部00421B84,从这里开始分析整个算法

算法分析

在这里插入图片描述

随便输入一个用户名和序列号,开始分析整个注册算法

基础校验

在这里插入图片描述

首先是基础校验部分,在IDA中如图,下面开始详细讲解每一步

  1. 获取用户名

在这里插入图片描述
2. 将用户名全部转为小写

在这里插入图片描述

  1. 获取输入的序列号

在这里插入图片描述

  1. 比较用户名长度是否大于等于6

在这里插入图片描述

至此基础校验部分结束,开始计算注册码。真正的注册码分为两部分,首先解释第一部分

第一部分

在这里插入图片描述

在这里插入图片描述

第一部分的算法根据用户名的ASCII值循环六次计算出来一个结果,算法和IDA反汇编出来的伪代码是一致的,这里就不多做说明了。

第二部分

接下来是第二部分,这一部分在IDA反汇编的伪代码中是没有的。

在这里插入图片描述

首先计算出用户名长度乘以0x4A7E的结果,

在这里插入图片描述

接着将计算的结果转为字符串

在这里插入图片描述

然后再将第一部分用户名计算的结果转为字符串

校验部分

在这里插入图片描述

将两个部分的注册码拼接

在这里插入图片描述

接着将输入的序列号和两部分拼接的字符串进行比较,根据比较的结果提示是否注册成功

写出注册机

这个注册机也是好写的不行啊,直接把IDA的代码拷下来稍微改改就行了,代码如下:

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


int main()
{
	char username[20] = { 0 };
	printf("请输入用户名:");
	scanf_s("%s", username, 20);
	int usernameLen = strlen(username);
	if (usernameLen<6)
	{
		printf("用户名长度必须大于等于6");
	}
	//大写转小写
	for (int i=0;i<usernameLen;i++)
	{
		if (username[i]>='A'&&username[i]<='Z')
		{
			username[i] += 32;
		}
	}

	int v13 = 0;
	int TotalSum = 0;
	int i = 0;                                      // i初始化为零
	do
	{
		switch ((username[i- 1]))// 根据username[i]的值给v13赋值
		{
		case 0x61u:
			v13 = 0x18;
			break;
		case 0x62u:
			v13 = 0x25;
			break;
		case 0x63u:
			v13 = 0x42;
			break;
		case 0x64u:
			v13 = 0xC;
			break;
		case 0x65u:
			v13 = 0xD;
			break;
		case 0x66u:
			v13 = 6;
			break;
		case 0x67u:
			v13 = 0x36;
			break;
		case 0x68u:
			v13 = 0x2B;
			break;
		case 0x69u:
			v13 = 0x17;
			break;
		case 0x6Au:
			v13 = 0x2F;
			break;
		case 0x6Bu:
			v13 = 0x13;
			break;
		case 0x6Cu:
			v13 = 0x82u;
			break;
		case 0x6Du:
			v13 = 0x9Bu;
			break;
		case 0x6Eu:
			v13 = 0x92u;
			break;
		case 0x6Fu:
			v13 = 3;
			break;
		case 0x70u:
			v13 = 0x63;
			break;
		case 0x71u:
			v13 = 0x21;
			break;
		case 0x72u:
			v13 = 0x42;
			break;
		case 0x73u:
			v13 = 0x5C;
			break;
		case 0x74u:
			v13 = 0x29;
			break;
		case 0x75u:
			v13 = 0xC7u;
			break;
		case 0x76u:
			v13 = 0x66;
			break;
		case 0x77u:
			v13 = 0x58;
			break;
		case 0x78u:
			v13 = 0xA;
			break;
		case 0x79u:
			v13 = 0x28;
			break;
		case 0x7Au:
			v13 = 0x50;
			break;
		default:
			v13 = 0x5D;
			break;
		}
		TotalSum += v13;                          // 循环累加v13的值
		++i;
		//这里记得超出范围清掉高位
		if (TotalSum>0xFF)
		{
			TotalSum &= 0x00FF;
		}
	} while (i != 6);

	printf("%d-%d\n", TotalSum,0x4A7E*usernameLen);
	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、付费专栏及课程。

余额充值