首页
社区
课程
招聘
[原创]CrackMe02 by petnt(算法公布在40楼)
发表于: 2009-2-26 05:17 15015

[原创]CrackMe02 by petnt(算法公布在40楼)

petnt 活跃值
12
2009-2-26 05:17
15015
收藏
免费 7
支持
分享
最新回复 (54)
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
26
怎了? 不是你想的那样吗?
2009-2-26 23:41
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
27
不是
ccfer给的应该能用到很多用户名上.
2009-2-26 23:43
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
28
别伤心了
研发03吧

你在4楼的回帖就差不多了
不知你的思路是怎样, 要用在用户名 ?
你这样写若用其它的方法破, 可能会因为你精确度太高而无法注册成功吧
我这么想
2009-2-26 23:48
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
29
还有个问题就是浮点数的精度应该考虑进去.
否则一些在理论上正确的注册码会因为很小的误差被拒之门外.

ccfer 好象用的0 0 PI这个通解
2009-2-26 23:57
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
30
0,PI,0是理论上的恒等式,与用户名无关
但是实际上我们输入的PI总会有有些误差,某些算式可能会将误差放大,最后用等号来比较浮点数可能无解
2009-2-27 08:59
0
雪    币: 358
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
为什么ccfer 的注册码在od中调的时候 注册不成功呢?
2009-2-27 09:49
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
32
感谢 ccfer sessiondiy 指点.
我也意识到了问题,当初写的时候我只试验了我的名字

petnt
D1A25E42-4C9C7DBD-28E59189-4C9F2160-270E1AD9-4C858FFB

我再改改,完善一下.
2009-2-27 12:45
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
33
因为有一个常数我用的是内存的checksum,如果你调试的时候下了断点,这个值就会变了.
还有,有硬件断点也不行.
具体代码你自己找找吧.
2009-2-27 12:49
0
雪    币: 358
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
内存的checksum代码 贴出来学习下吧
2009-2-27 14:06
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
35
和上一版本相同,你参看01的,我放了源码
2009-2-27 15:07
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
36
更新版本...
ccfer
CEEB5E22-DAB652C1-CEEB5E22-DAA652C1-CEEB5E22-DAB652C1
2009-2-27 21:36
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
37
一看注册码的样子就知道出事了,服了ccfer
2009-2-27 21:50
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
38
这次找不到通用注册码了
ccfer
11E5DE23-A7C2E366-3552732C-A7C77976-56D8EB40-A7D9342D
2009-2-28 01:37
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
39
终于可以不更新了...
2009-2-28 09:10
0
雪    币: 485
活跃值: (12)
能力值: ( 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了,谢谢大家关注
2009-2-28 11:21
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
41
太强了,学习
2009-2-28 11:31
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
42
LS的虚拟机技术才是强大的
2009-2-28 11:42
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
43
我给的那组解不能构成三角形
2009-2-28 12:01
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
44
petnt的数学一定很强
2009-2-28 12:33
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
45
呵,在ccfer的眼里是一点漏洞都有不得啊.
我确实没办法证明那是唯一解.
还存在一种可能,就是走到我认为走不到地方.
我只能保证是三角形的时候走不到.
你既然不是三角形也走到了,那有没可能一直走下去而不异常呢?

如果走下去不异常了,那这算法就彻底失败了
2009-2-28 12:38
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
46
我是利用Google才学到的,说实话,现在小学,初中的数学还能明白一点点,大学的本来就没学好,现在更是一窍不通.
看了草雉京的crackme才知道原来数学可以和crackme联系的很紧。
看了有关拉格朗日的讨论才明白什么叫眼睁睁得看着。
因为即使我把思路理的在清楚,也没有能力去求解。
然后对ccfer和你就特别崇拜。
不但善于看出别人的想法,更重要的是还知道怎么去求解。

再次佩服两位。
外加些许感叹。
2009-2-28 12:52
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
47
另外:
ccfer可否愿意透漏下你的解法?

是不是第二个浮点变整数的误差被利用了,0.1 - 0.9 空间很大
2009-2-28 13:00
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
48
  不得不承认这一点!看着源代码我都晕,这么复杂
2009-2-28 13:05
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
49
佩服+学习。。。
2009-2-28 13:53
0
雪    币: 926
活跃值: (382)
能力值: (RANK:500 )
在线值:
发帖
回帖
粉丝
50
关于浮点数x为自变量的算法   哪怕f(x)是不可逆的  只要确定了x的取值范围,
也是可以求解的

当然 如果f(x)可导  即便不知道x的取值范围 也可以求解

所以用浮点数一般情况下是不安全的
2009-3-2 10:42
0
游客
登录 | 注册 方可回帖
返回
//