能力值:
( LV9,RANK:180 )
|
-
-
26 楼
怎了? 不是你想的那样吗?
|
能力值:
( LV9,RANK:490 )
|
-
-
27 楼
不是
ccfer给的应该能用到很多用户名上.
|
能力值:
( LV9,RANK:180 )
|
-
-
28 楼
别伤心了
研发03吧
你在4楼的回帖就差不多了
不知你的思路是怎样, 要用在用户名 ?
你这样写若用其它的方法破, 可能会因为你精确度太高而无法注册成功吧
我这么想
|
能力值:
( LV9,RANK:490 )
|
-
-
29 楼
还有个问题就是浮点数的精度应该考虑进去.
否则一些在理论上正确的注册码会因为很小的误差被拒之门外.
ccfer 好象用的0 0 PI这个通解
|
能力值:
( LV15,RANK:2473 )
|
-
-
30 楼
0,PI,0是理论上的恒等式,与用户名无关
但是实际上我们输入的PI总会有有些误差,某些算式可能会将误差放大,最后用等号来比较浮点数可能无解
|
能力值:
( LV2,RANK:10 )
|
-
-
31 楼
为什么ccfer 的注册码在od中调的时候 注册不成功呢?
|
能力值:
( LV9,RANK:490 )
|
-
-
32 楼
感谢 ccfer sessiondiy 指点.
我也意识到了问题,当初写的时候我只试验了我的名字
petnt
D1A25E42-4C9C7DBD-28E59189-4C9F2160-270E1AD9-4C858FFB
我再改改,完善一下.
|
能力值:
( LV9,RANK:490 )
|
-
-
33 楼
因为有一个常数我用的是内存的checksum,如果你调试的时候下了断点,这个值就会变了.
还有,有硬件断点也不行.
具体代码你自己找找吧.
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
内存的checksum代码 贴出来学习下吧
|
能力值:
( LV9,RANK:490 )
|
-
-
35 楼
和上一版本相同,你参看01的,我放了源码
|
能力值:
( LV15,RANK:2473 )
|
-
-
36 楼
更新版本...
ccfer
CEEB5E22-DAB652C1-CEEB5E22-DAA652C1-CEEB5E22-DAB652C1
|
能力值:
( LV9,RANK:490 )
|
-
-
37 楼
一看注册码的样子就知道出事了,服了ccfer
|
能力值:
( LV15,RANK:2473 )
|
-
-
38 楼
这次找不到通用注册码了
ccfer
11E5DE23-A7C2E366-3552732C-A7C77976-56D8EB40-A7D9342D
|
能力值:
( LV9,RANK:490 )
|
-
-
39 楼
终于可以不更新了...
|
能力值:
( LV9,RANK:490 )
|
-
-
40 楼
用户名变换成三个整数:
for(int i=0;i<nUsize;i++)
{
sum+=m_vuser[i];
}
a=m_vuser[0]^sum;
b=m_vuser[1]^sum;
c=abs(a-b)+(abs(a+b)-abs(a-b))*(m_vuser[2]+m_vuser[3])/sum;
注册码分六组放入数组,并转换成三个 double
for(int k=0;k<6;k++)
{
for(csn="";i<nSsize;i++)
{
if(m_vsn[i]!=0x2d)
{
csn=csn+m_vsn[i];
}
else
{
i++;
break;
}
}
Ai[k]=strtoul(csn,NULL,16)^m_checksum;
}
A=(double *)&Ai[0];
B=(double *)&Ai[2];
C=(double *)&Ai[4];
算法(a,b,c,A,B,C需满足条件)
if(fabs(cos(*A)+(sin(*C)*a-sin(*A)*c)+cos(*B)+cos(*C)-4*sin((*A)/2)*sin((*B)/2)*sin((*C)/2)-1)<=0.000001)
{
if (9/(int)(sin(*B)*c-sin(*C)*b)==0.5)
{
MessageBox("恭喜你,注册成功!");// 此处为假的提示,算法分析中解释
}
}
else
{
MessageBox("注册失败!");
}
算法分析:
假设a,b,c,A,B,C分别是一个三角形对就的角和边(我就这么设计的,看我的a,b,c的取值关系),则第一条if语句是恒等式.用到的数学知识:
cosA+cosB+cosC=1+4sinA/2sinB/2sinC/2.
c*sinA=a*sinC
c*sinB=b*sinC
第二条if语句会触发整数除零异常,在异常处理中我会改变流程和数据,给出成功提示.
所以,最终此crackme变成了已经三角形三边(用户名变换得来),求其三角(注册码变换得来)的的数学问题,求解用到的知识:(后来查了一下,这应该是高中题,题目有点误导大家了)
cos(C) =(a^2+b^2-c^2)/(2ab)
所以注册机可以这样写:
int temp=0xE7D77CDF(checksum);
*C=acos((double)(a*a+b*b-c*c)/(double)(2*a*b));
*B=acos((double)(a*a+c*c-b*b)/(double)(2*a*c));
*A=acos((double)(c*c+b*b-a*a)/(double)(2*c*b));
CString sn;
sn.Format("%08X-%08X-%08X-%08X-%08X-%08X",Ai[0]^temp,Ai[1]^temp,Ai[2]^temp,Ai[3]^temp,Ai[4]^temp,Ai[5]^temp);
OK了,谢谢大家关注
|
能力值:
(RANK:210 )
|
-
-
41 楼
太强了,学习
|
能力值:
( LV9,RANK:490 )
|
-
-
42 楼
LS的虚拟机技术才是强大的
|
能力值:
( LV15,RANK:2473 )
|
-
-
43 楼
我给的那组解不能构成三角形
|
能力值:
( LV9,RANK:180 )
|
-
-
44 楼
petnt的数学一定很强
|
能力值:
( LV9,RANK:490 )
|
-
-
45 楼
呵,在ccfer的眼里是一点漏洞都有不得啊.
我确实没办法证明那是唯一解.
还存在一种可能,就是走到我认为走不到地方.
我只能保证是三角形的时候走不到.
你既然不是三角形也走到了,那有没可能一直走下去而不异常呢?
如果走下去不异常了,那这算法就彻底失败了
|
能力值:
( LV9,RANK:490 )
|
-
-
46 楼
我是利用Google才学到的,说实话,现在小学,初中的数学还能明白一点点,大学的本来就没学好,现在更是一窍不通.
看了草雉京的crackme才知道原来数学可以和crackme联系的很紧。
看了有关拉格朗日的讨论才明白什么叫眼睁睁得看着。
因为即使我把思路理的在清楚,也没有能力去求解。
然后对ccfer和你就特别崇拜。
不但善于看出别人的想法,更重要的是还知道怎么去求解。
再次佩服两位。
外加些许感叹。
|
能力值:
( LV9,RANK:490 )
|
-
-
47 楼
另外:
ccfer可否愿意透漏下你的解法?
是不是第二个浮点变整数的误差被利用了,0.1 - 0.9 空间很大
|
能力值:
( LV13,RANK:760 )
|
-
-
48 楼
不得不承认这一点!看着源代码我都晕,这么复杂
|
能力值:
( LV9,RANK:230 )
|
-
-
49 楼
佩服+学习。。。
|
能力值:
(RANK:500 )
|
-
-
50 楼
关于浮点数x为自变量的算法 哪怕f(x)是不可逆的 只要确定了x的取值范围,
也是可以求解的
当然 如果f(x)可导 即便不知道x的取值范围 也可以求解
所以用浮点数一般情况下是不安全的
|
|
|