CrackMe#42.LV6

今天这个Cm是LV6 难度不错  因为用到了浮点数~~搞了我一天…最后LV6的最后一个算法没有完全逆出来!

/*************************************************

0044C1F6  |.  DB3C24        fstp    tbyte ptr [esp]
0044C1F9  |.  9B            wait
0044C1FA  |.  B8 03000000   mov     eax, 3                           ;  3!
0044C1FF  |.  E8 ECF6FCFF   call    0041B8F0
0044C204  |.  D805 50C34400 fadd    dword ptr [44C350]               ;  512.+5.
0044C20A  |.  D9FA          fsqrt                                    ;  开根号
0044C20C  |.  E8 F365FBFF   call    00402804                         ;  求余弦
0044C211  |.  DB7D B8       fstp    tbyte ptr [ebp-48]
0044C214  |.  9B            wait
0044C215  |.  D905 54C34400 fld     dword ptr [44C354]               ;  1
0044C21B  |.  DC45 E8       fadd    qword ptr [ebp-18]               ;  9+…
0044C21E  |.  D9FA          fsqrt                                    ;   开根号
0044C220  |.  D9E0          fchs                                     ;  正负求反
0044C222  |.  DB6D B8       fld     tbyte ptr [ebp-48]               ;  8经过算法后的值
0044C225  |.  DEC1          faddp   st(1), st                        ;  9+1求反+8经过算法的值
0044C227  |.  DB7D AC       fstp    tbyte ptr [ebp-54]               ;  保存 -3.8963…
0044C22A  |.  9B            wait
0044C22B  |.  D905 58C34400 fld     dword ptr [44C358]               ;  3!
0044C231  |.  DC4D D8       fmul    qword ptr [ebp-28]               ;  3*7
0044C234  |.  D805 54C34400 fadd    dword ptr [44C354]               ;  3*7+1
0044C23A  |.  D9ED          fldln2                                   ;  加载LN2
0044C23C  |.  D9C9          fxch    st(1)                            ;  与LN2交换

0044C23E  |.  D9F1          fyl2x                                    ;  求L2X
0044C240  |.  DB6D AC       fld     tbyte ptr [ebp-54]
0044C243  |.  DEC1          faddp   st(1), st
0044C245  |.  DB7D A0       fstp    tbyte ptr [ebp-60]               ;  [ebp-54]+l2x (-3.89+…)
0044C248  |.  9B            wait
0044C249  |.  D905 5CC34400 fld     dword ptr [44C35C]               ;  2.
0044C24F  |.  DC45 D0       fadd    qword ptr [ebp-30]               ;  6+2
0044C252  |.  D9FA          fsqrt                                    ;  求根号
0044C254  |.  DB6D A0       fld     tbyte ptr [ebp-60]
0044C257  |.  DEE1          fsubrp  st(1), st                        ;  反减出栈  st(1)-st
0044C259  |.  D905 58C34400 fld     dword ptr [44C358]               ;  3
0044C25F  |.  DC4D C8       fmul    qword ptr [ebp-38]               ;  3*5 (9 8 7 6 5)
0044C262  |.  D835 5CC34400 fdiv    dword ptr [44C35C]               ;  2.  (15/2)
0044C268  |.  DEC1          faddp   st(1), st                        ;  7.5+ -3.633….
0044C26A  |.  DB2D 60C34400 fld     tbyte ptr [44C360]               ;  37.
0044C270  |.  DEC1          faddp   st(1), st                        ;  +0.37. (3.866+0.37.)
0044C272  |.  D80D 6CC34400 fmul    dword ptr [44C36C]               ;  *1000.
0044C278  |.  DD5D F0       fstp    qword ptr [ebp-10]               ;  入栈保存 4236.257654…
0044C27B  |.  9B            wait
0044C27C  |.  DD45 F0       fld     qword ptr [ebp-10]               ;  出栈
0044C27F  |.  E8 9065FBFF   call    00402814                         ;  保存整数入栈~~
0044C284  |.  8945 98       mov     dword ptr [ebp-68], eax          ;  eax==0x215
0044C287  |.  8955 9C       mov     dword ptr [ebp-64], edx          ;  edx==0
0044C28A  |.  DF6D 98       fild    qword ptr [ebp-68]               ;  浮点加载整数

/********************************************************

算法中带有严重缺憾,估计是浮点运算不过关的缘故!要好好补补浮点算法了!~

for (szNumber1=0;szNumber1<10;szNumber1++)

{

if (szList[0]>20)

{

break;

}

szList[0]=szNumber1;

for (szNumber2=0;szNumber2<10;szNumber2++)

{

szList[1]=szNumber2;

for (szNumber3=0;szNumber3<10;szNumber3++)

{

szList[2]=szNumber3;

for (szNumber4=0;szNumber4<10;szNumber4++)

{

szList[3]=szNumber4;

for (szNumber5=0;szNumber5<10;szNumber5++)

{

szList[4]=szNumber5;

szSum[1]=szList[1];//*szList[1]*szList[1];

szSum[1]*=szList[1];

szSum[1]*=szList[1];

szSum[1]+=szA;//5

szSum[1]=sqrt(szSum[1]);

szSum[1]=cos(szSum[1]);

szSum[0]=szList[0]+1;

szSum[0]=-sqrt(szSum[0]);

szSumEnd=szSum[0]+szSum[1];

szSum[2]=szList[2]*szC+1;//3

szAAA=szSum[2];

//szSum[2]=log(szSum[2])*log(2);

__asm

{

fld szAAA

fldln2

fxch st(1)

fyl2x

fstp szAAA

}

szSum[2]=szAAA;

szSumEnd+=szSum[2];

szSum[3]=szList[3]+2;

szSum[3]=sqrt(szSum[3]);

szSumEnd=szSum[3]-szSumEnd;

szSum[4]=szList[4]*szC;//3.

szSum[4] /=szD;//2.

szSumEnd+=szSum[4];

szSumEnd+=szMin;

szSumEnd*=szMax;

//***********************************************

//***********************************************

szSumList=szSumEnd;

if (szSumEnd-szSumList>=0.5)

{

szSumList+=1;

}

//******************************************************

ChechBox解图:

DownMe:KeyGen

PS:C算法和DASM的一样..但是运行起来有算法结果不一样…估计是那里的0.001值漏了…浮点编程硬伤.

发表评论

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