能力值:
( LV2,RANK:10 )
|
-
-
2 楼
我成功了,呵呵!
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
[QUOTE=飞天蜈蚣;719068]我成功了,呵呵! [/QUOTE]
恭喜恭喜
|
能力值:
( LV6,RANK:90 )
|
-
-
4 楼
好一朵美丽的xx花
|
能力值:
( LV6,RANK:90 )
|
-
-
5 楼
似乎作者是想说明VMP也不是很难
到最后是个数学问题,不知我跟对了没,我写个小程序跑跑验证下
|
能力值:
( LV6,RANK:90 )
|
-
-
6 楼
贴下自己的分析,请大家看看是不是正确的,怎么求不出正确的注册码啊
004011E1 > /8A81 40304000 MOV AL,BYTE PTR DS:[ECX+403040] ; 假码处理过程
004011E7 . |2C 30 SUB AL,30
004011E9 . |3E:88044D 503>MOV BYTE PTR DS:[ECX*2+403050],AL ; 得到假码的数值
004011F1 . |3E:DF044D 503>FILD WORD PTR DS:[ECX*2+403050]
004011F9 . |41 INC ECX
004011FA . |3BCF CMP ECX,EDI
004011FC .^\75 E3 JNZ SHORT 004011E1
004011FE . 90 NOP ; 假码放入00403050
004011FF . 90 NOP
00401200 . 90 NOP
00401201 . 90 NOP
00401202 . 90 NOP
00401203 . 33F6 XOR ESI,ESI
00401205 . 33C9 XOR ECX,ECX
00401207 > 3E:8A044D 503>MOV AL,BYTE PTR DS:[ECX*2+403050] ; 假码处理,6次方
0040120F . F7E0 MUL EAX
00401211 . F6244D 503040>MUL BYTE PTR DS:[ECX*2+403050]
00401218 . F7E0 MUL EAX
0040121A . 03F0 ADD ESI,EAX
0040121C . 41 INC ECX
0040121D . 33C0 XOR EAX,EAX
0040121F . 3BCF CMP ECX,EDI
00401221 .^ 75 E4 JNZ SHORT 00401207 ; 每位的6次方累加到esi
00401223 . 8935 A0304000 MOV DWORD PTR DS:[4030A0],ESI ; esi放入4030a0
00401229 . 90 NOP
0040122A . 90 NOP
0040122B . 90 NOP
0040122C . 90 NOP
0040122D . 90 NOP
0040122E . 90 NOP
0040122F . 90 NOP
00401230 . 90 NOP
00401231 . 90 NOP
00401232 . 90 NOP
00401233 . 90 NOP
00401234 . 90 NOP
00401235 . C705 70304000>MOV DWORD PTR DS:[403070],0A ; 累加值要等于0186A0
然后就用c写了个小程序跑下。一直没结果。编程上应该没啥问题,那就是分析错了,请各位指点下。
#include<iostream.h>
void main()
{
int sum,temp,i,n;
for (i=222222;i<999999;i++)
{
temp=i,sum=0;
while(temp!=0)
{
n=temp%10;
sum=sum+(n*n*n*n*n*n);
temp=temp/10;
}
if (sum==100000)
{
cout<<"num is "<<i<<endl;
}
}
}
|
能力值:
( LV9,RANK:200 )
|
-
-
7 楼
/*
mars's mars2.exe
寻找一个6位数,满足
(1)各个位上的数字在2~9之间;
(2)各个位上的数字的6次方的和=该数本身。
*/
#include <stdio.h>
int pow6(int x)
{
int y = x * x;
y *= x;
y *= y;
return y;
}
int main()
{
int a[6], b, c;
for (a[0]=2; a[0]<=9; a[0]++)
{
for (a[1]=2; a[1]<=9; a[1]++)
{
for (a[2]=2; a[2]<=9; a[2]++)
{
for (a[3]=2; a[3]<=9; a[3]++)
{
for (a[4]=2; a[4]<=9; a[4]++)
{
for (a[5]=2; a[5]<=9; a[5]++)
{
b = pow6(a[0])+pow6(a[1])+pow6(a[2])+
pow6(a[3])+pow6(a[4])+pow6(a[5]);
c = a[0] + a[1]*10 + a[2]*100 +
a[3]*1000 + a[4]*10000 + a[5]*100000;
if (b==c)
{
printf("%d\n", b); /* print out 548834 */
}
}
}
}
}
}
}
return 0;
}
|
能力值:
( LV6,RANK:90 )
|
-
-
8 楼
原来是等于自己本身啊,分析错了
感谢asdfslw的指点,我再仔细看看对注册码处理的那一段
对自己的代码改动下,很乱的说,呵呵。而且扩展性,重用性很差
#include<iostream.h>
void main()
{
int sum,temp,i,n;
for (i=222222;i<999999;i++)
{
temp=i,sum=0;
while(temp!=0)
{
n=temp%10;
sum=sum+(n*n*n*n*n*n);
temp=temp/10;
}
if (sum==i)
{
cout<<"num is "<<i<<endl;
}
}
}
我觉得用while语句获取各位上的数字更为方便,而且代码简洁,100位的也没关系
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
。。老是大牛呀
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
最近在看C++ Template,用Template写了个注册算法,编译时进行模板展开进行运算,耗时
未知,仅测试了 100~999 内 d2^3+d1^3+d0^3=n 的结果。
template <int n, int i>
struct get_digit{
static int value(){
//return get_digit<(n/10), i - 1>::value();
return m_value;
}
static int const m_value = get_digit<n/10, i-1>::m_value;
};
template <int n>
struct get_digit<n, 0>{
static int const value(){
return m_value;
}
static int const m_value = n%10;
};
template <int n, int i>
struct power{
static int value(){
return n*power<n, i-1>::value();
}
};
template <int n>
struct power<n, 0>{
static int const value(){
return 1;
}
};
template <int n>
struct check{
static bool value(){
const int sum =
power<get_digit<n, 5>::m_value, 6>::value() +
power<get_digit<n, 4>::m_value, 6>::value() +
power<get_digit<n, 3>::m_value, 6>::value() +
power<get_digit<n, 2>::m_value, 6>::value() +
power<get_digit<n, 1>::m_value, 6>::value() +
power<get_digit<n, 0>::m_value, 6>::value()
;
return sum == n;
}
};
template <int a, int b>
struct find{
static int value(){
return find<a, a>::value() != -1 ? a : find<a+1, b>::value();
}
};
template <int a>
struct find<a, a>{
static int value(){
return check<a>::value() ? a : -1;
}
};
void main()
{
cout << (find<100000, 999999>::value()) << endl;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
我明白了,
0040127B . DB05 A0304000 FILD DWORD PTR DS:[4030A0] ; 将数压栈,装入ST0
00401281 . D8D9 FCOMP ST(1) ; 实数比较:ST(0)-ST(i),设置标志位,执行一次出栈操作
00401283 . DFE0 FSTSW AX ; 将FPU状态字保存到AX,检查非屏蔽浮点异常
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
一直跟到6位数每一位的6次方的和
往下就看不懂了……
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
<script>
var sum=0;
for(var a=2;a<=9;a++){
suma=Math.pow(a,6);
for(var b=2;b<=9;b++){
sumb=Math.pow(b,6);
for(var c=2;c<=9;c++){
sumc=Math.pow(c,6);
for(var d=2;d<=9;d++){
sumd=Math.pow(d,6);
for(var e=2;e<=9;e++){
sume=Math.pow(e,6);
for(var f=2;f<=9;f++){
sumf=Math.pow(f,6);
sum=suma+sumb+sumc+sumd+sume+sumf;
if(sum>234567 && sum<987654){
if(a*100000+b*10000+c*1000+d*100+e*10+f==sum)
document.write(sum+"<br>");
}
sum=0;
}
}
}
}
}
}
</script>
|
能力值:
( LV6,RANK:90 )
|
-
-
14 楼
0040119D . 6A 64 PUSH 64 ; /Count = 64 (100.)
0040119F . 68 40304000 PUSH 403040 ; |Buffer = mars2.00403040
004011A4 . 68 95010000 PUSH 195 ; |ControlID = 195 (405.)
004011A9 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
004011AC . E8 6F010000 CALL 00401320 ; \GetDlgItemTextA
004011B1 . 83F8 06 CMP EAX,6 ; 取假码,等于六位
004011B4 . 0F85 41010000 JNZ 004012FB ; mars2.004012FB
004011BA . 33FF XOR EDI,EDI
004011BC > 80BF 40304000>CMP BYTE PTR DS:[EDI+403040],32 ; 在2~9之间的数字
004011C3 . 0F8C 32010000 JL 004012FB ; mars2.004012FB
004011C9 . 80BF 40304000>CMP BYTE PTR DS:[EDI+403040],39
004011D0 . 0F8F 25010000 JG 004012FB ; mars2.004012FB
004011D6 . 47 INC EDI
004011D7 . 48 DEC EAX
004011D8 .^ 75 E2 JNZ SHORT 004011BC ; mars2.004011BC
004011DA . 90 NOP
004011DB . 90 NOP
004011DC . 90 NOP
004011DD . 90 NOP
004011DE . 90 NOP
004011DF . 33C9 XOR ECX,ECX
004011E1 > 8A81 40304000 MOV AL,BYTE PTR DS:[ECX+403040]
004011E7 . 2C 30 SUB AL,30
004011E9 . 3E:88044D 503>MOV BYTE PTR DS:[ECX*2+403050],AL ; 假码放入00403050处
004011F1 . 3E:DF044D 503>FILD WORD PTR DS:[ECX*2+403050]
004011F9 . 41 INC ECX
004011FA . 3BCF CMP ECX,EDI
004011FC .^ 75 E3 JNZ SHORT 004011E1 ; mars2.004011E1
004011FE . 90 NOP
004011FF . 90 NOP
00401200 . 90 NOP
00401201 . 90 NOP
00401202 . 90 NOP
00401203 . 33F6 XOR ESI,ESI
00401205 . 33C9 XOR ECX,ECX ; ecx做循环器
00401207 > 3E:8A044D 503>MOV AL,BYTE PTR DS:[ECX*2+403050] ; 把放入内存的假码依次放入al
0040120F . F7E0 MUL EAX
00401211 . F6244D 503040>MUL BYTE PTR DS:[ECX*2+403050]
00401218 . F7E0 MUL EAX
0040121A . 03F0 ADD ESI,EAX
0040121C . 41 INC ECX
0040121D . 33C0 XOR EAX,EAX
0040121F . 3BCF CMP ECX,EDI ; 每个数字六次方累加放入esi
00401221 .^ 75 E4 JNZ SHORT 00401207 ; mars2.00401207
00401223 . 8935 A0304000 MOV DWORD PTR DS:[4030A0],ESI ; 运算结果放入4030a0
00401229 . 90 NOP
0040122A . 90 NOP
0040122B . 90 NOP
0040122C . 90 NOP
0040122D . 90 NOP
0040122E . 90 NOP
0040122F . 90 NOP
00401230 . 90 NOP
00401231 . 90 NOP
00401232 . 90 NOP
00401233 . 90 NOP
00401234 . 90 NOP
00401235 . C705 70304000>MOV DWORD PTR DS:[403070],0A
0040123F . DB05 70304000 FILD DWORD PTR DS:[403070]
00401245 . C705 80304000>MOV DWORD PTR DS:[403080],186A0
0040124F . DB05 80304000 FILD DWORD PTR DS:[403080] ; 假码逆序放入st2~st7
00401255 . DCCF FMUL ST(7),ST
00401257 . D8F1 FDIV ST,ST(1) ; st7为200000
00401259 . DCCE FMUL ST(6),ST
0040125B . D8F1 FDIV ST,ST(1)
0040125D . DCCD FMUL ST(5),ST
0040125F . D8F1 FDIV ST,ST(1)
00401261 . DCCC FMUL ST(4),ST
00401263 . D8F1 FDIV ST,ST(1)
00401265 . DCCB FMUL ST(3),ST ; 通过乘除运算得到正确的位数以便后门累加运算
00401267 . D80D 90304000 FMUL DWORD PTR DS:[403090] ; st0清零
0040126D . D8C2 FADD ST,ST(2)
0040126F . D8C3 FADD ST,ST(3)
00401271 . D8C4 FADD ST,ST(4)
00401273 . D8C5 FADD ST,ST(5)
00401275 . D8C6 FADD ST,ST(6)
00401277 . D8C7 FADD ST,ST(7) ; 累加到st0中。295323,即用st0保存假码
00401279 . DDC7 FFREE ST(7)
0040127B . DB05 A0304000 FILD DWORD PTR DS:[4030A0] ; 把内存中六次方累加值放入st0
00401281 . D8D9 FCOMP ST(1) ; 假码要和累加值相等
00401283 . DFE0 FSTSW AX
00401285 . 9B WAIT
00401286 . 9E SAHF
00401287 . 7A 72 JPE SHORT 004012FB ; mars2.004012FB
利用浮点寄存器st。很神奇,呵呵。刚刚又跟了一遍。总是这样,三天打渔,两天晒网,要改要改
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
555555,我还不知道浮点运算符的含义,就跟到注册码的位数和取值范围就不行了。。。
|
|
|