CrackMe#71 浮点

晕啊..碰到一个考数学的…

004013EE  |> \DD45 F8       fld     qword ptr [ebp-8]
004013F1  |.  D9FE          fsin
004013F3  |.  DD5D A8       fstp    qword ptr [ebp-58]
004013F6  |.  DD45 F0       fld     qword ptr [ebp-10]
004013F9  |.  D9FE          fsin
004013FB  |.  DD5D A0       fstp    qword ptr [ebp-60]
004013FE  |.  DD45 A8       fld     qword ptr [ebp-58]
00401401  |.  DC4D A0       fmul    qword ptr [ebp-60]               ;  sin*sin
00401404  |.  DF2D 30304000 fild    qword ptr [403030]
0040140A  |.  DEC9          fmulp   st(1), st                        ;  *
0040140C  |.  83EC 08       sub     esp, 8
0040140F  |.  DD1C24        fstp    qword ptr [esp]
00401412  |.  E8 D1000000   call    <jmp.&CRTDLL.floor>
00401417  |.  83C4 08       add     esp, 8
0040141A  |.  DD5D 98       fstp    qword ptr [ebp-68]
0040141D  |.  D9EE          fldz                                     ;  将0.0装入st(0)
0040141F  |.  DC5D 98       fcomp   qword ptr [ebp-68]
00401422  |.  DFE0          fstsw   ax
00401424  |.  9E            sahf
00401425      75 05         jnz     short 0040142C
上面关键算法

输入的用户名由atof转为浮点数 szName  注册码 转为浮点数 szKey
条件是:
非  szName<0 || szName==1000000.0 || szName<1 || szName>10000000000.0
szKey>1 && szKey<10000000000
然后 要
0<sin(szName)*sin(szKey)*1.000000000000000000e+16<1
才算成功
从这里知道 szName szKey 都已经是整数了~
也就是说
szName 为[1,1000000)&(1000000,10000000000)
szKey   为(1,10000000000)
区域中满足
0<sin(szName)*sin(szKey)*1.000000000000000000e+16<1
就OK~
要他们等于0是不可能的~
我们都知道 sin(a*Pi)==0,a为整数
也就是说我们只能需要他们正弦无限靠近0 而且都是区间条件满足的情况下..
然后符合红色式子的条件 就算成功
这就有问题了,怎么编程解决这个问题?
循环?就算输入用户名定了一个区间, 还有注册码的区间…
100亿次啊…
初步常识了未解决:
szEnd=0.999999999999999999999999/1.000000000000000000e+16;
szNameSin=sin(szName);
szKeSin=szEnd/szNameSin;
szKey=asin(szKeSin);
wsprintf(szKeyList,”%d”,szKey);
SetDlgItemText(hDlg,IDC_Serial,szKeyList);
更新一组Key:
411557987
245850922
来自Cronos的解说教程  感谢Cronos

发表评论

邮箱地址不会被公开。 必填项已用*标注