吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: KaQqi

[KeyGenMe] 一个裸奔的递归算法的keygenme

[复制链接]
 楼主| KaQqi 发表于 2019-5-17 18:15
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

梦游枪手 发表于 2019-5-16 22:48
有两个bug说下第一个

这里使用了注册码的前两位来计算真正的注册码,这样子下面的判断不可能为成功,楼 ...

我确实是只用了输入的用户名的前两位,count确实是忘记清零了..
为什么你ida反编译出来的伪代码这么清晰,变量名都跟我原来变量名一样...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

梦游枪手 发表于 2019-5-17 20:02
KaQqi 发表于 2019-5-17 18:15
我确实是只用了输入的用户名的前两位,count确实是忘记清零了..
为什么你ida反编译出来的伪代码这么清晰 ...

但是你计算tablesize的时候用的是注册码的前两位,是写错了吗?伪代码的话,那是我分析后重命名的,方便看
 楼主| KaQqi 发表于 2019-5-18 09:31
梦游枪手 发表于 2019-5-17 20:02
但是你计算tablesize的时候用的是注册码的前两位,是写错了吗?伪代码的话,那是我分析后重命名的,方便 ...

没有写错..就是想只取前两位..
梦游枪手 发表于 2019-5-18 14:33
KaQqi 发表于 2019-5-18 09:31
没有写错..就是想只取前两位..

用前两位注册码算出整个注册码,前两位还要一样。那大概率是无解了。。。
 楼主| KaQqi 发表于 2019-5-18 15:06
梦游枪手 发表于 2019-5-18 14:33
用前两位注册码算出整个注册码,前两位还要一样。那大概率是无解了。。。

前两位没说要一样啊
梦游枪手 发表于 2019-5-18 16:50
KaQqi 发表于 2019-5-18 15:06
前两位没说要一样啊

我表达有误,输入的注册码的前两位算出来的注册码还要跟输入的注册码一致,比方说注册码输入abcdefg,那dfs函数要用ab这两位计算出abcdefg才行(感觉变成碰撞了)。暴力跑了几组key没有符合的,无解了
 楼主| KaQqi 发表于 2019-5-18 18:07
梦游枪手 发表于 2019-5-18 16:50
我表达有误,输入的注册码的前两位算出来的注册码还要跟输入的注册码一致,比方说注册码输入abc ...

要不要看看源码QwQ

[C++] 纯文本查看 复制代码
#include "keygenme2_1b.h"

KeygenMe2_1B::KeygenMe2_1B(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);
	connect(ui.pushButton,SIGNAL(clicked(bool)),this,SLOT(ButtonJudge()));
}

KeygenMe2_1B::~KeygenMe2_1B()
{

}
int n;

int count = 0;
bool data[100][100];
int result[100];
char real_code[10000];
char real_code_position = 0;

void Output()
{
	for(int i = 1;i<=n;i++)
	{
		real_code[real_code_position] = result[i]+'0';
		real_code_position++;
	}
}

bool CanDeployHere(int x,int y)
{
	for(int i = 1;i <= y;i++)
	{
		if(data[x][i] == 1)
			return false;

		if(x-i>= 0 && data[x-i][y-i] == 1)
			return false;
		if(x-i<= n && data[x+i][y-i] == 1)
			return false;
	}
	return true;
}

int Go(int vertical_position)//vertical_position代表行
{
	if(vertical_position > n)
	{
		return 0;
	}
	for(int i = 1;i<=n;i++)
	{
		if(CanDeployHere(i,vertical_position))
		{
			data[i][vertical_position] = true;
			result[vertical_position] = i;
			if(vertical_position == n)
			{
				count++;
				Output();
				data[i][vertical_position] = false;
				continue;
			}
			Go(vertical_position+1);
			data[i][vertical_position] = false;
		}
	}
	result[vertical_position] = 0;
	return 0;
}

int KeygenMe2_1B::ButtonJudge()
{
	QString name1 = ui.lineEdit->text();
	QByteArray ba = name1.toLatin1(); 
	char *name = ba.data();

	QString code = ui.lineEdit_code->text();
	QByteArray ba1 = code.toLatin1();
	char* register_code = ba1.data();

	for (int i = 0;i<strlen(register_code);i++)
	{
		register_code[i] -= '0';
	}
	if(name[0] < '0' || name[0] > '9')
	{
		QMessageBox::warning(this,"warning","You can Only input number.");
		return 0;
	}

	if(name[1] < '0' || name[1] > '9')
	{
		QMessageBox::warning(this,"warning","You can Only input numer.");
		return 0;
	}
	char amount_code = (register_code[0])*92 + (register_code[1]) * 8;
	amount_code %= 10;
	if (amount_code == 0) amount_code = 9;
	n = amount_code;
	Go(1);

	if(strcmp(real_code,register_code) == 0)
	{
		QMessageBox::information(this,"Success!","You win.");
	}
	else
	{
		QMessageBox::warning(this,"warning","failed");
		QMessageBox::warning(this,"warning","Nuclear missile launched.");
		QMessageBox::warning(this,"warning","Iron Curtain Activated");
		QMessageBox::warning(this,"warning","Chronosphere Activated");
		QMessageBox::warning(this,"warning","Lightning Storm Created");
		QMessageBox::warning(this,"warning","Genetic Mutator Activated");
		QMessageBox::warning(this,"warning","Psychic Dominator Activated");
	}
	return 0;
}
梦游枪手 发表于 2019-5-18 19:32
[Asm] 纯文本查看 复制代码
    char amount_code = (register_code[0])*92 + (register_code[1]) * 8;
    amount_code %= 10;
    if (amount_code == 0) amount_code = 9;
    n = amount_code;
    Go(1);
 
    if(strcmp(real_code,register_code) == 0)

就这一段,用的是register_code前两位算amount_code,Go函数根据amount_code计算出real_code,再判断real_code是否等于register_code(这种情况不可能相等),只要把register_code换成name就有解了(前面判断了name的前两位是否为数字,后面却没用到),amount_code也得改成unsigned char,我在调试的时候发现会有负数的情况出现。

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
KaQqi + 3 + 1 我很赞同!

查看全部评分

 楼主| KaQqi 发表于 2019-5-19 16:26
梦游枪手 发表于 2019-5-18 19:32
[mw_shl_code=asm,true]    char amount_code = (register_code[0])*92 + (register_code[1]) * 8;
    am ...

这是一开始手残写错了,后来就想发出来看看大家怎么想23333
xiaowoaini 发表于 2019-7-5 14:02
学习学习。共同
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:禁止回复非技术或与主题无关水贴,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2019-7-24 17:16

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表