首页
社区
课程
招聘
[原创]crackme9
发表于: 2010-4-28 17:40 56341

[原创]crackme9

2010-4-28 17:40
56341
收藏
免费 7
支持
分享
最新回复 (111)
雪    币: 472
活跃值: (52)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
51
004024F5  |.  53            |PUSH EBX                              ;  NameMD5_4
004024F6  |.  51            |PUSH ECX                              ;  KEY,固定KEY有任意对应的EBX?
004024F7  |.  56            |PUSH ESI                              ;  还是EBX可以任意,对ESI解码不影响(没看懂?!)?
004024F8  |.  E8 F3EDFFFF   |CALL crackme9.004012F0                ;  这个是XTEA吗?没找到对应的版本,还是楼主自己改了?
我没看懂这个算法,不是要EBX和ECX去解吗? EBX不是NameMD5的前8位?如果ECX与EBX无关,那就有解了
2010-5-3 19:31
0
雪    币: 202
活跃值: (57)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
52
把我分析了80%的结果贴出来:

crackme算法流程:



算法分析:

1、superdic核心算法:

算法:

20个字节为一组,用后4个字节解密前16个字节,算法不详细分析了。

解法:

void GetKey20(char *value, char *key)
{
	int i, j;
	int temp[20];
	int odd[16];
	
	for(i = 0; i < 16; i++)
	{
		if(isdigit(value[i]))
		{
			temp[i] = value[i] - 0x16;
		}
		else if(isupper(value[i]))
		{
			temp[i] = value[i] - 0x41;
		}
		else if(islower(value[i]))
		{
			temp[i] = value[i] - 0x3D;
		}

		if(temp[i] - 4 * i >= 0)
		{
			temp[i] -= 4 * i;
			odd[i] = 1;
		}
		else
		{
			temp[i] = 4 * i - temp[i];
			odd[i] = 0;
		}
	}

	for(i = 0; i < 4; i++)
	{
		temp[16 + i] = 0;
		for(j = 3; j >= 0; j--)
		{
			temp[16 + i] *= 2;
			temp[16 + i] += odd[4 * i + j];
		}
	}

	for(i = 0; i < 20; i++)
	{
		if((temp[i] >= 0) && (temp[i] <= 0x19))
		{
			key[i] = temp[i] + 0x41;
		}
		else if((temp[i] >= 0x1A) && (temp[i] <= 0x23))
		{
			key[i] = temp[i] + 0x16;
		}
		else if((temp[i] >= 0x24) && (temp[i] <= 0x3D))
		{
			key[i] = temp[i] + 0x3D;
		}
	}
}


输入MD5码,就可以得出前20位和中间20位的注册码。

2、压缩算法

将相邻的2个字节压缩为一个字节。

算法:

int Zip(unsigned char *value, int valueLen, unsigned char *key)
{
	int i; 
	int pair;
	unsigned char K1, K2;

	pair = valueLen / 2;

	for(i = 0; i < pair; i++)
	{
		K1 = value[i * 2];
		if(isalpha(K1))
		{
			K1 = toupper(K1);
		}
		K1 += 0xD0;
		if(K1 > 9)
		{
			K1 += 0xF9;
		}

		K2 = value[i * 2 + 1];
		if(isalpha(K2))
		{
			K2 = toupper(K2);
		}
		K2 += 0xD0;
		if(K2 > 9)
		{
			K2 += 0xF9;
		}

		key[i] = (K1 << 4) | K2;
	}

	return pair;
}


解法:

int UnZip(unsigned char *strIn, int strLen, unsigned char *strOut)
{
	int i;
	unsigned char K1, K2;
	
	for(i = 0; i < strLen; i++)
	{
		K1 = (strIn[i] >> 4) & 0xF;
		if(K1 > 9)
		{
			K1 -= 0xF9;
			K1 -= 0xD0;
		}
		else
		{
			K1 -= 0xD0;
		}

		K2 = strIn[i] & 0xF;
		if(K2 > 9)
		{
			K2 -= 0xF9;
			K2 -= 0xD0;
		}
		else
		{
			K2 -= 0xD0;
		}

		strOut[i * 2] = K1;
		strOut[i * 2 + 1] = K2;
	}

	return strLen * 2;
}


3、easychm的算法。

详细分析参考sessiondiy 31楼回复中的引用。几点更正:查询表范围0~ox3F而不是0~0x39。使用7-8位 + 0-6位,而不是15-14 + 0~13位。

算法:

查询表:

unsigned char S0[0x100] =
"\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80"
"\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80"
"\x80\x80\x80\x3A\x80\x3B\x3C\x80\x80\x80\x3D\x3E\x80\x3F\x80\x80"
"\x80\x80\x00\x01\x02\x03\x04\x05\x06\x07\x80\x80\x80\x80\x80\x80"
"\x80\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x80\x10\x11\x12\x13\x14\x80"
"\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x80\x80\x80\x80\x80"
"\x80\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x80\x2B\x2C\x2D"
"\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x80\x80\x80\x39\x80"
"\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80"
"\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80"
"\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80"
"\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80"
"\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80"
"\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80"
"\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80"
"\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80";

unsigned char PosOfS0(unsigned char chr)
{
	int i;
	
	for(i = 0; i < 0x100; i++)
	{
		if(chr == S0[i])
		{
			return i;
		}
	}

	return i;
}

int Encode0(unsigned char *in, int len, unsigned char *out)
{
	int i, j;
	
	for(i = 0, j = 0; i < len; i += 3, j += 4)
	{
		out[j] = ((in[i] & 0xC0) >> 2) | ((in[i + 1] & 0xC0) >> 4) | ((in[i + 2] & 0xC0) >> 6);
		out[j] = PosOfS0(out[j]);

		out[j + 1] = PosOfS0(in[i] & 0x3F);
		out[j + 2] = PosOfS0(in[i + 1] & 0x3F);
		out[j + 3] = PosOfS0(in[i + 2] & 0x3F);
	}

	return j;
}


解法:

int Decode0(unsigned char *in, int len, unsigned char *out)
{
	int i, j;
	unsigned char key;

	for(i = 0, j = 0; i < len; i += 4, j += 3)
	{
		key = S0[in[i]];

		out[j] = ((key << 2) & 0xC0) | S0[in[i + 1]];
		out[j + 1] = ((key << 4) & 0xC0) | S0[in[i + 2]];
		out[j + 2] = ((key << 6) & 0xC0) | S0[in[i + 3]];
	}

	return j; 
}


4、XTEA算法

跟网上的有些差异。楼主改过了。Delta成可变参数,对称变换细节变了。

算法:

void XTEAEncipher(unsigned int num_rounds, unsigned int v[2], unsigned int const k[4], unsigned int delta)
{
	unsigned int i;
    unsigned int v0, v1, sum;
	
	v0=v[0];
	v1=v[1];
	sum = 0;

	for (i=0; i < num_rounds; i++) 
	{
        v0 += ((v1 << 4) ^ (v1 >> 5)) + (v1 ^ sum) + k[sum & 3];
    	sum += delta;
        v1 += ((v0 << 4) ^ (v0 >> 5)) + (v0 ^ sum) + k[(sum >> 11) & 3];
	}
    
	v[0]=v0; 
	v[1]=v1;
}


解法:

void XTEADecipher(unsigned int num_rounds, unsigned int v[2], unsigned int const k[4], unsigned int delta) 
{
    unsigned int i;
    unsigned int v0, v1, sum;
	
	v0=v[0];
	v1=v[1];
	sum = delta * num_rounds;
    
	for (i=0; i < num_rounds; i++) 
	{
        v1 -= ((v0 << 4) ^ (v0 >> 5)) + (v0 ^ sum) + k[(sum >> 11) & 3];
        sum -= delta;
        v0 -= ((v1 << 4) ^ (v1 >> 5)) + (v1 ^ sum) + k[sum & 3];
    }
    
	v[0]=v0; 
	v[1]=v1;
}


5、查表算法

这个复杂,用到了3张表。一张奇数表,一张偶数表,一张混合表。

算法分析:

输入串作为2进制流对表进行查询:

基本流程:
(1)查表:
从奇数表第0位开始,如果当前处理的2进制位为0,则查奇数表,否则查偶数表,每次查表结果作为下次查表的索引,直到查表结果大于0x100, 该结果-0x100作为查表结果。
(2)查询完毕后,用查询结果对3张表进行置换。置换规则见算法。
(3)返回(1)

算法:

表初始化:

unsigned int Sodd[0x100]; /* 奇数表 */
unsigned int Seven[0x100]; /* 偶数表 */
unsigned char Smix[0x201]; /* 混合表 */


void ResetTables()
{
	int i;
	
	for(i = 1; i <= 0x200; i++)
	{
		Smix[i] = (i - 1) / 2;
	}

	for(i = 0; i <= 0xFF; i++)
	{
		Sodd[i] = 2 * i + 1;
		Seven[i] = 2 * i + 2;
	}
}


获取结果,表混淆,加密:

void ExchangeTables(unsigned int index)
{
	unsigned int i;
	unsigned char S, SS;
	unsigned int temp;

	i = index + 0x100;
	do
	{
		S = Smix[i];
		if(S == 0)
		{
			break;
		}
		SS = Smix[S];
		
		if(Sodd[SS] == S)
		{
			temp = Seven[SS];
			Seven[SS] = i;
		}
		else
		{
			temp = Sodd[SS];
			Sodd[SS] = i;
		}

		if(Sodd[S] == i)
		{
			Sodd[S] = temp;
		}
		else
		{
			Seven[S] = temp;
		}

		Smix[i] = SS;
		Smix[temp] = S;

		i = SS;

	} while(i != 0);
}

unsigned int GetCode(unsigned char *in, int len, int *index, int *pos)
{
	unsigned char value;
	unsigned int code;

	value = in[*index % len];
	code = 0;
	while(code <= 0xFF)
	{
		if(*pos == 8)
		{
			(*index)++;
			value = in[*index % len];
			*pos = 0;
		}

		if(BitTest[*pos] & value)
		{
			/* 查偶数表 */

			code = Seven[.code];
		}
		else
		{
			/* 查奇数表 */

			code = Sodd[.code];
		}

		(*pos)++;
	}

	code -= 0x100;

	ExchangeTables(code);

	return code;
}

void Encode1(unsigned char *in, int len, unsigned char *out, int limit)
{
	int i, j;
	unsigned int code;
	int pos;

	i = 0;
	pos = 0;
	j = 0;
	code = GetCode(in, len, &i, &pos);
	while((j < limit) && (code != 0x100))
	{
		out[j] = code;
		code = GetCode(in, len, &i, &pos);
		j++;
	}
}


解法:我还没写出代码来,不过应该是根据输入先做表混淆,然后根据奇偶表得出解密2进制流。总之,这步是有解的。

还没有分析的算法:

查表结果倒数8位的处理,CRC32。

也不知道下次什么什么时候再有时间玩了。

另外:楼主,你自己能做出注册机来吗?就我自己目前的流程分析,要做出注册机来,必须得知道,XTEA 32轮密钥攻击算法,而且是在知道SMC明文的情况下。如果不知道SMC明文,整个Crackme相当于给出XTEA密文,要求求解明文,而且明文的CRC32还要为指定的值,这个没解?
上传的附件:
  • 1.JPG (69.76kb,180次下载)
2010-5-3 19:46
0
雪    币: 202
活跃值: (57)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
53
楼主,看看我分析的过程中有没有遗漏。如果你自己能造出注册机来,嘿嘿,我想给我时间,我也能。

太累了,要是这个Crackme有解,以后有时间再玩。
2010-5-3 19:53
0
雪    币: 295
活跃值: (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
54
ls 的大侠 分析的好详细啊  学习了
2010-5-3 20:48
0
雪    币: 926
活跃值: (387)
能力值: (RANK:500 )
在线值:
发帖
回帖
粉丝
55
to:tyroneking
我觉得你能弄出那个半成品SN 应该会知道 ECX与EBX是无关的。 能让S大都夸其强大的  很少有哦。我也在这赞一下

to:egogg
"另外:楼主,你自己能做出注册机来吗?"   我觉得你这问题问得也很奇怪。
我自己写的东西,我肯定能做出注册机了。
看你前面的分析 也能足见你的基本功还是很扎实的。

不过你 “如果你自己能造出注册机来,嘿嘿,我想给我时间,我也能。”
句话,我不太相信.

在我没给出一组真正注册成功的 key之前,我想你不能。

因为tyroneking给出的已经是我认为最好的结果了。
2010-5-3 21:06
0
雪    币: 472
活跃值: (52)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
56
下面写是用VB.net(其它语言少用,望谅解,凑合着看吧)写的 奇、偶、混合表的解法
  Public Function r查表(ByVal Code As String) As String
        Me.InitTable() '奇、偶、混合表初始化
        Me.KeyStr = Code '待解密
        Me.KeyB = "" '结果两进制串
        Me.InitTable() '初始表 奇、偶、混合表
        For i As Integer = 1 To KeyStr.Length / 2 + 1
            If i > KeyStr.Length / 2 Then
                '加结束符 &H100
                Me.rFindOddEvenTable(CInt("&H100"))
            Else
                '逆KEY
                Me.rFindOddEvenTable(CInt("&H" & KeyStr.Substring(i * 2 - 2, 2)))
            End If
        Next
        Dim Str结果 As String = "6B796F21" ''前缀,与算法无关,CM中用 
        Do While KeyB.Length Mod 8 <> 0 '补足8位
            KeyB &= "0"
        Loop

        'KeyB 是rFindOddEvenTable中的结果
        '  每8位二进制  倒序 就是 结果了
        For i As Integer = 0 To Me.KeyB.Length \ 8 - 1
            Dim b As String = KeyB.Substring(8 * i, 8)
            b = Me.Reverse(b)
            Str结果 &= BIN_to_HEX(b) '二进制转16进制
        Next
        Return Str结果
    End Function

    Sub InitTable()
        Dim i As Integer = 1
        TableDbl(0) = 0
        TableEven(0) = 0
        TableOdd(0) = 0
        Do
            TableDbl(i) = (i - 1) \ 2
            i += 1
        Loop While i <= &H200
        i = 0
        Do
            TableEven(i) = 2 * i + 2
            TableOdd(i) = 2 * i + 1
            i += 1
        Loop While i <= &HFF
    End Sub

    ''解查表
    Function rFindOddEvenTable(ByVal Findvalue As Integer) As Boolean
        'Dim value As Long = 0
        Dim t As Integer = Findvalue
        Findvalue += &H100
        Dim KeyA As String = ""
        Do
            Dim find As Boolean = False
            If Findvalue = 0 Then Exit Do
            For i As Integer = 0 To Me.TableEven.GetLength(0) - 1 '查偶表
                If Me.TableEven(i) = Findvalue Then
                    find = True
                    Findvalue = i
                    'value = value * 2 + 1 
                    KeyA = KeyA & "1"
                    Exit For
                End If
            Next
            If Findvalue = 0 Then Exit Do
            For i As Integer = 0 To Me.TableOdd.GetLength(0) - 1 '查奇表
                If Me.TableOdd(i) = Findvalue Then
                    find = True
                    Findvalue = i
                    'value = value * 2
                    KeyA = KeyA & "0"
                    Exit For
                End If
            Next
            If find = False Then
                Return False
            End If
        Loop
        KeyB &= Me.Reverse(KeyA) '倒
        Me.Odd_Even_Calc(t) '奇、偶、混合表处理
        Return True 'Return value <= &HFF
    End Function
    '字符串倒序
    Function Reverse(ByVal original As String) As String
        Dim arr As Char() = original.ToCharArray
        Array.Reverse(arr)
        Return New String(arr)
    End Function
    '奇、偶、混合表处理
    Sub Odd_Even_Calc(ByVal value As Integer)
        value += 256
        Dim result As Integer = 0
        Dim v4 As Integer = 0
        Dim v3 As Integer = 0
        Do
            result = TableDbl(value)
            If result = 0 Then Exit Do
            v4 = TableDbl(result)
            v3 = TableOdd(v4)
            If result = v3 Then
                v3 = TableEven(v4)
                TableEven(v4) = value
            Else
                TableOdd(v4) = value
            End If

            If value = TableOdd(result) Then
                TableOdd(result) = v3
            Else
                TableEven(result) = v3
            End If

            TableDbl(value) = v4
            TableDbl(v3) = result
            value = v4
        Loop While value <> 0
    End Sub


        v1 -= ((v0 << 4) ^ (v0 >> 5)) + (v0 ^ sum) + k[(sum >> 11) & 3];
sum -= delta ;这里有个Not 吧?
v0 -= ((v1 << 4) ^ (v1 >> 5)) + (v1 ^ sum) + k[sum & 3];


里面不是用到delta吗,一时没想明白,为什么无关?
2010-5-3 21:59
0
雪    币: 202
活跃值: (57)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
57
里面不是用到delta吗,一时没想明白,为什么无关?

我也想不明白,这个delta取的是not StrToInt(MD5)是个跟用户名有关的量。要想正确解XTEA,需要的那个Key必须从(SMC密文, SMC明文, UserName)来得到。

humourkyo  :
如果不给出正确的SMC明文。那还不如就找个现在无法破解加密算法,加密一段SMC,那谁甭想破解出来。这个Crackme的算法用在实际的保护中,SMC是不可能不公开的。还有就是,你的注册机中是否用到了XTEA的密钥求解算法?我对这个问题很感兴趣。
2010-5-3 22:12
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
58
插个话.
我想你们都没注意到为何kyo在前面
要故意比对MD5的前/后      [前面不对是没关系的 ]
要用来固定delta
2010-5-3 23:41
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
59
好久不来坛子冒泡泡了   顺便膜拜下egogg  还有S大。。。
2010-5-3 23:48
0
雪    币: 472
活跃值: (52)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
60
原来是这样,还是S大强呀,只知道第一个通过就行了,第二个不用验证,还想提示说是不是楼主搞错了呢
让楼主复杂的算法搞的前面没多想了,误区呀误区。
2010-5-3 23:50
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
61
报告楼上,  看来我猜错了. 他并没这么做.
你最好验证一下

----------------
他确实没这么做
2010-5-3 23:55
0
雪    币: 926
活跃值: (387)
能力值: (RANK:500 )
在线值:
发帖
回帖
粉丝
62
我所说的无关是 最后的key跟用户名是无关的 而tyroneking也确实是这么问的。
不知道你们怎么理解的。
另外本来我不想说的,程序里有一个细节 跟最后注册成功的机器码是有关系的 可能很多人没注意到。

而根据那个细节是有可能推出正确的机器码 然后再推出密钥也是有可能的。

我估计我说的“你不能”,刺激了egogg这位朋友,而我没别的意思,只是觉得你很有可能会忽略那个细节。

再有一点,没有哪个人证明我最后那个算法是无法破解的吧。

本来已经睡下了,后来想了想还是爬起来了。不过明天很有可能又要迟到了,才半个周期就又三次了
2010-5-3 23:59
0
雪    币: 472
活跃值: (52)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
63
等待发现细节吧,那个delta还是MD5!
天色已晚,兄弟们早睡早起吧!
2010-5-4 00:19
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
64
嘿嘿我又来挖洞了

kyo从没说过怎么显示成功, 在18楼也说:
   如果真能输入sn构成一个缓冲区溢出 弹出一个成功的框之类的信息 也算弄出了注册码。

SN 最长可输入700个byte, tyroneking目前只用到552 bytes
不知 tyroneking 可否将程序码编码写回 SN 里. (一个用最少的byte弹出OK的代码)
因为这CM中途用 XTEA 解码后的东西(此时为16进制码)会先放到 405E24 , 如下 :
00402341  |.  BF 245E4000   mov     edi, 00405E24
00402346  |.  C1E9 02       shr     ecx, 2
00402349  |.  F3:A5         rep     movsd


如此最后的SMC只要解出一条 jmp 405Exx 就自然会弹出 'OK' 了.

OD的Data窗口一行显示16个byte, 他SMC前三行的后8个Byte是一样的.
很难想出原代码是写什么风格.
没原Key没明码没Delta个人认为不宜蛋疼下去. 不知此方法是否符合 ?
虽然还是难, 但至少有可能.
2010-5-4 01:51
0
雪    币: 926
活跃值: (387)
能力值: (RANK:500 )
在线值:
发帖
回帖
粉丝
65
就像海风所说  写crackme的乐趣不在于难度多大
而在于有多少人玩。

我就是随便写着给大家玩的。我不从保护什么软件,因为我不喜欢写什么软件,就算写也是自用。
也没仔细思考过 如何才能 在有key的情况下 也不让破解者爆破 或者找出SN。
我想前者应该很难做,后者还是有可能实现的。

另外 想玩的  想挑战的请继续。   嫌困难玩不下去的 也无可厚非。

给出成功的抓图:
上传的附件:
2010-5-4 10:03
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
66
大家放松点吧.
请问kyo
你可以用别的Name产生一组序号而有同样的效果吗?

而 Disable 是你讲的注册成功的意思吗?
所以你说 :
另外本来我不想说的,程序里有一个细节 跟最后注册成功的机器码是有关系的 可能很多人没注意到。而根据那个细节是有可能推出正确的机器码 然后再推出密钥也是有可能的。
2010-5-4 10:25
0
雪    币: 926
活跃值: (387)
能力值: (RANK:500 )
在线值:
发帖
回帖
粉丝
67
可以啊

另外 这个注册成功的name不是success  而是其他的。

任何一个name 注册成功都会先清除其name然后 SetDlgItemText为success

然后灰化那三个东东。
2010-5-4 10:47
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
68
无法学习 只能膜拜
因为我的问题可能刚好是楼上几位的问题.
等别人的提问我再来捡现成的
Delta
2010-5-4 10:49
0
雪    币: 926
活跃值: (387)
能力值: (RANK:500 )
在线值:
发帖
回帖
粉丝
69
__asm
   {
   mov eax,DWORD PTR DS:[********]
   push 0
   push eax
   CALL DWORD PTR DS:[********]    //灰化edit1
   mov eax,DWORD PTR DS:[********]
   push 0
   push eax
   CALL DWORD PTR DS:[********]   //灰化edit2
   mov eax,DWORD PTR DS:[********]
   push 0
   push eax
   call DWORD PTR DS:[********]  //灰化按钮

   mov eax,DWORD PTR DS:[********]
   push 0
   push 3e8h
   push eax
   CALL DWORD PTR DS:[********]  //清空edit1

   mov eax,DWORD PTR DS:[********]
   push 737365h
   push 63637573h
   push esp
   push 3e8h
   push eax
   CALL DWORD PTR DS:[********]  //设置成功标志
   }

产生*******的值 就在那个细节里
2010-5-4 10:50
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
70
对于68h长度的这段密文进行XTEA分组解码,同时要满足伪造明文的CRC碰撞基本不太可能
所以我觉得你的思路是可以的,但是很难找到能过了CRC那关的第二组明文
2010-5-4 13:39
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
71
确实如此
其实这题我最好奇的是不同的delta他如何造出一支key来解出同样的明文 (而密文是固定的)
膜拜之
2010-5-4 17:06
0
雪    币: 926
活跃值: (387)
能力值: (RANK:500 )
在线值:
发帖
回帖
粉丝
72
你的问题就是 有明文  也有密文如何来求key的问题。

这个问题如果解决不了,就算我给出SN ,破解者也许能爆破之 但却不可能再给出另外一组SN。
2010-5-4 20:17
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
73
你65楼那张图是某个Name的正确序号 , 或你修改过图(序号部份) ?
因为刚刚我很小心的输入, 但我发现第1关就不对了.
2010-5-4 20:59
0
雪    币: 926
活跃值: (387)
能力值: (RANK:500 )
在线值:
发帖
回帖
粉丝
74
序号很长的  图里面显示的只是 后面一半  呵呵
2010-5-4 21:02
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
75
to s:
我看那序号用到名字的md5来解码的,你不知道正确名字的话,解出来的内容也没意义了
2010-5-4 21:45
0
游客
登录 | 注册 方可回帖
返回
//