首页
社区
课程
招聘
[原创]我的第二个crackme,欢迎破解
发表于: 2010-12-3 15:37 7943

[原创]我的第二个crackme,欢迎破解

2010-12-3 15:37
7943
中等难度吧。主要是分析算法。。。
永远爆破,永远菜鸟。
给出一组: 1234ddsoft
     key :1234

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 544
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
不好意思。刚才的那个加壳了。。汗。。重新上传一份未加壳的。。。
2010-12-3 15:40
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
6004ddsoft
1234
2010-12-3 16:36
0
雪    币: 544
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
exile 大牛都来了。。。Crackme注定被破。。

这个Crackme的算法,主要是突然从某API中想到的。。。

如果加些密码学算法,然后再加线程防爆破应该会更难点。
2010-12-3 16:39
0
雪    币: 65
活跃值: (118)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
输入1234ddsoft
     key :1234
没反映啊
2010-12-3 16:47
0
雪    币: 544
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
这个Crackme算法非常简单,就两三步。
主要是涉及到了一些API,感觉这种方式比较新颖。
我用的操作系统是 XP SP3.  
exile 的注册码也是对的。你再试试。。
2010-12-3 16:53
0
雪    币: 544
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
我自己也逆向了一下,如果对API很熟的话,这个Crackme还是比较简单的。

对文件操作的那部分代码迷惑人的,当然这里也可以写些真正有用的代码。

程序有个新线程,本来想做监视用的,后来又懒得写。
2010-12-3 16:56
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
高啊,还可以根据API来
2010-12-3 17:01
0
雪    币: 65
活跃值: (118)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
我也是用的xp sp3的系统
用你给你的那组key无效~
2010-12-3 17:12
0
雪    币: 205
活跃值: (49)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
算法找到了,但我的C相当的渣,写不出来算所有满足条件的注册码的程序

用户名格式:四个字符+ddsoft
注册码:全数字

用户名做如下计算:
    for(a=0;a<=9;a++)
	{
		b=(int)name[a]+5;
		_asm
		{
			mov eax,b;
			xor eax,0x23;
			and eax,0x0ff;
			mov b,eax;
		}
		b=b+123*a;
		c=b+c;
	}


结果是c,然后密码乘以c如果等于7548378,就过关~
2010-12-5 09:18
0
雪    币: 544
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
楼上的算法分析是对的。源码如下:
CString name;
	GetDlgItem(IDC_EDIT1)->GetWindowText(name);
	int nindex=name.Find(L"ddsoft");
	if (nindex<4)
	{
		return ;
	}
	TCHAR szName[256]={0};
	unsigned sum=0;
	for(int i=0;i<name.GetLength();i++)
	{
		szName[i]=((name[i]+5) ^ 0x23) & 0x00FF;
		sum=sum+szName[i]+123*i;
	}
	HANDLE hThread=(HANDLE)_beginthreadex(NULL,0,myFunc,NULL,CREATE_SUSPENDED,NULL);
	CONTEXT Context;
	Context.ContextFlags=CONTEXT_FULL;

	GetThreadContext(hThread,&Context);
	DWORD sn=Context.Eip;
	unsigned int key=GetDlgItemInt(IDC_EDIT2);
    //创建一个临时文件,将大小设为187个字节
	HANDLE hFile;
	hFile=CreateFile(L"1.txt",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ ,
		NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,NULL);
	if (hFile==INVALID_HANDLE_VALUE)
	{

		return ;
	}
	LARGE_INTEGER li;
	li.QuadPart=187;
	SetFilePointerEx(hFile,li,NULL,FILE_BEGIN);
	SetEndOfFile(hFile);
	GetFileSizeEx(hFile,&li);
	CloseHandle(hFile);
	 if (sn==sum*key*li.QuadPart+677284027)
	 {
		 MessageBox(L"感谢你的注册!\n\n如果不是爆破,就说说算法吧!",L"提示",0x20);
	 }
2010-12-5 19:01
0
雪    币: 36
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢楼主的cm,也拜读了楼主及楼上的分析.
上传的附件:
2010-12-6 02:34
0
雪    币: 36
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
1、这个cm有难度,它并不是每一个用户名都能生成注册码.我是采用生成注册码后再验证筛选的方法.我不明白算法F的为什么这样设计。
2、算法启用一个新建线程的上下文eip作常量参与运算,不错啊。
3、我不用sdk,用的是mfc了,所以有点大。
4、我自己没用逆向,都是楼主及楼上的现成分析。:)
  
2010-12-6 02:54
0
雪    币: 544
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
写得不错。注册机代码发出来参考一下。
2010-12-6 10:53
0
雪    币: 544
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
注册机原理:7548378猜成两个整数的积。A和B。B为输入的注册码。
显然根据我提供的注册码:1234可以知道,需要满足F(name)=6117即可!

将注册码固定为1234来写注册机会比较容易。
因为用户名只需要在第5位以后出现“ddsoft”字符即可。呵呵!从用户名来算注册码是不可能的。
换其他的注册码必须满足被7548378整除。

其他类似的name: XXXXddsoft1
                 key:  1234
PS:发这个原理出来,是想看看大家如何写注册机。谢谢。所以最好帖源码。
2010-12-6 11:09
0
雪    币: 544
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
很显然 7548378=3*2516126,
意味着即使我不公布 1234,大家也可以写其他的注册机。
将key定为3,F(name)=2516126,这样用户名会很长。
当然可以把key用程序算一算,换个大点的。
2010-12-6 11:18
0
雪    币: 198
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
破解这个跟操作系统的关系很大吗?

我好不容易搞出个HWID方面的crackme,

正沾沾自喜呢,...

童鞋们反映无法运行...

2010-12-6 17:10
0
游客
登录 | 注册 方可回帖
返回
//