- UID
- 8671
注册时间2006-2-27
阅读权限40
最后登录1970-1-1
独步武林
TA的每日心情 | 开心 2018-5-6 16:27 |
---|
签到天数: 7 天 [LV.3]偶尔看看II
|
发表于 2006-8-12 22:56:18
|
显示全部楼层
原帖由 Nisy 于 2006-8-12 22:04 发表
五子棋 v2.5b3 简单算法分析 BY:李逍遥
今天女儿要玩五子棋,从网上随便找了个,也不知道是哪年的了(后来看了下是1999年的,晕),挺老。以为是免费的,结果女儿玩了两局跳出提示框,呵呵,太不给我面子。网 ...
明码比较,前天咱都在分析这个软件的算法~呵呵~还没分析得出来。
但思路好像不是那样的,作者应该有预设字符。
先保持怀疑态度。咱预感作者在用户名不到6位的过程中,肯定用了预设符。
如02468...
0045E99F . 55 PUSH EBP
0045E9A0 . 0006 ADD BYTE PTR DS:[ESI],AL
0045E9A2 . 72 65 JB SHORT FIVE.0045EA09
0045E9A4 . 67:6973 74 00>IMUL ESI,DWORD PTR SS:[BP+DI+74],C08B0000
0045E9AC /$ 55 PUSH EBP
0045E9AD |. 8BEC MOV EBP,ESP
0045E9AF |. 81C4 CCFDFFFF ADD ESP,-234
0045E9B5 |. 53 PUSH EBX
0045E9B6 |. 56 PUSH ESI
0045E9B7 |. 57 PUSH EDI
0045E9B8 |. 33C0 XOR EAX,EAX ; EAX清零
0045E9BA |. 8985 CCFDFFFF MOV DWORD PTR SS:[EBP-234],EAX
0045E9C0 |. 33C0 XOR EAX,EAX
0045E9C2 |. 55 PUSH EBP
0045E9C3 |. 68 23EB4500 PUSH FIVE.0045EB23
0045E9C8 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
0045E9CB |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
0045E9CE |. 6A 00 PUSH 0
0045E9D0 |. 8D85 CCFDFFFF LEA EAX,DWORD PTR SS:[EBP-234]
0045E9D6 |. 50 PUSH EAX
0045E9D7 |. B9 3CEB4500 MOV ECX,FIVE.0045EB3C ; name
0045E9DC |. BA 4CEB4500 MOV EDX,FIVE.0045EB4C ; register
0045E9E1 |. A1 64FA4600 MOV EAX,DWORD PTR DS:[46FA64]
0045E9E6 |. 8B18 MOV EBX,DWORD PTR DS:[EAX]
0045E9E8 |. FF13 CALL DWORD PTR DS:[EBX]
0045E9EA |. 8B95 CCFDFFFF MOV EDX,DWORD PTR SS:[EBP-234] ; 用户名
0045E9F0 |. 8D85 D0FDFFFF LEA EAX,DWORD PTR SS:[EBP-230]
0045E9F6 |. B9 FF000000 MOV ECX,0FF
0045E9FB |. E8 3051FAFF CALL FIVE.00403B30
0045EA00 |. 8D95 D0FDFFFF LEA EDX,DWORD PTR SS:[EBP-230] ; 用户名
0045EA06 |. 8D45 9B LEA EAX,DWORD PTR SS:[EBP-65]
0045EA09 |> B1 64 MOV CL,64
0045EA0B |. E8 883EFAFF CALL FIVE.00402898
0045EA10 |. 6A 00 PUSH 0
0045EA12 |. 8D85 CCFDFFFF LEA EAX,DWORD PTR SS:[EBP-234]
0045EA18 |. 50 PUSH EAX
0045EA19 |. B9 60EB4500 MOV ECX,FIVE.0045EB60 ; regno
0045EA1E |. BA 4CEB4500 MOV EDX,FIVE.0045EB4C ; register
0045EA23 |. A1 64FA4600 MOV EAX,DWORD PTR DS:[46FA64]
0045EA28 |. 8B18 MOV EBX,DWORD PTR DS:[EAX]
0045EA2A |. FF13 CALL DWORD PTR DS:[EBX]
0045EA2C |. 8B95 CCFDFFFF MOV EDX,DWORD PTR SS:[EBP-234] ; 试练码
0045EA32 |. 8D85 D0FDFFFF LEA EAX,DWORD PTR SS:[EBP-230]
0045EA38 |. B9 FF000000 MOV ECX,0FF
0045EA3D |. E8 EE50FAFF CALL FIVE.00403B30
0045EA42 |. 8D95 D0FDFFFF LEA EDX,DWORD PTR SS:[EBP-230] ; 试练码
0045EA48 |. 8D85 36FFFFFF LEA EAX,DWORD PTR SS:[EBP-CA]
0045EA4E |. B1 64 MOV CL,64
0045EA50 |. E8 433EFAFF CALL FIVE.00402898
0045EA55 |. 8A45 9B MOV AL,BYTE PTR SS:[EBP-65]
0045EA58 |. 84C0 TEST AL,AL ; 用户名有没有填
0045EA5A |. 74 09 JE SHORT FIVE.0045EA65 ; 没填就跳出错。
0045EA5C |. 80BD 36FFFFFF>CMP BYTE PTR SS:[EBP-CA],6 ; 试练码是否为6位
0045EA63 |. 74 0C JE SHORT FIVE.0045EA71 ; 为6位才有希望
0045EA65 |> C605 60FA4600>MOV BYTE PTR DS:[46FA60],0 ; 否则[46FA60]=0,标志位
0045EA6C |. E9 99000000 JMP FIVE.0045EB0A
0045EA71 |> 8BF0 MOV ESI,EAX ; 试练码为6位跳来这,用户名位数送ESI
0045EA73 |. 81E6 FF000000 AND ESI,0FF
0045EA79 |. 85F6 TEST ESI,ESI ; 对用户名进行检测
0045EA7B |. 7C 22 JL SHORT FIVE.0045EA9F
0045EA7D |. 46 INC ESI ; ESI+1
0045EA7E |. 8D4D 9B LEA ECX,DWORD PTR SS:[EBP-65] ; 用户名,取位数,下面循环用。
0045EA81 |. 8D9D D1FEFFFF LEA EBX,DWORD PTR SS:[EBP-12F]
0045EA87 |> 33C0 /XOR EAX,EAX ; EAX清零,循环开始
0045EA89 |. 8A01 |MOV AL,BYTE PTR DS:[ECX] ; 第一次位数放AL,而后对逐位取用户名
0045EA8B |. BF 0A000000 |MOV EDI,0A ; EDI=0x0A
0045EA90 |. 33D2 |XOR EDX,EDX ; EDX清零
0045EA92 |. F7F7 |DIV EDI ; EDX除以EDI
0045EA94 |. 80C2 30 |ADD DL,30 ; 余数加0x30
0045EA97 |. 42 |INC EDX ; EDX再加1
0045EA98 |. 8813 |MOV BYTE PTR DS:[EBX],DL ; 结果转成字符并排在[EBX]
0045EA9A |. 43 |INC EBX ; EBX+1
0045EA9B |. 41 |INC ECX ; ECX+1
0045EA9C |. 4E |DEC ESI ; ESI-1
0045EA9D |.^ 75 E8 \JNZ SHORT FIVE.0045EA87 ; 向上循环,直到取完用户名
0045EA9F |> 8A45 9B MOV AL,BYTE PTR SS:[EBP-65] ; 循环之后出来,用户名位数送AL
0045EAA2 |. 3C 06 CMP AL,6 ; 比较用户名位数是否为6位
0045EAA4 |. 73 31 JNB SHORT FIVE.0045EAD7 ; 高于/不低于6跳过下面的一个循环
0045EAA6 |. 33C9 XOR ECX,ECX ; 否则接着来下面的一个循环,ECX清零
0045EAA8 |. 8AC8 MOV CL,AL ; CL=AL
0045EAAA |. 41 INC ECX ; ECX+1
0045EAAB |. 83F9 06 CMP ECX,6 ; ECX与6比较
0045EAAE |. 7F 27 JG SHORT FIVE.0045EAD7 ; 大于跳
0045EAB0 |. 8D9C0D D0FEFF>LEA EBX,DWORD PTR SS:[EBP+ECX-130] ; 预设置放EBX
0045EAB7 |> 33C0 /XOR EAX,EAX ; EAX清零
0045EAB9 |. 8A03 |MOV AL,BYTE PTR DS:[EBX] ; 上面的一循环取得的值,逐位放AL
0045EABB |. 83C0 02 |ADD EAX,2 ; EAX+2
0045EABE |. 83E8 30 |SUB EAX,30 ; EAX-30
0045EAC1 |. BE 0A000000 |MOV ESI,0A ; ESI=0x0A
0045EAC6 |. 33D2 |XOR EDX,EDX ; EDX清零
0045EAC8 |. F7F6 |DIV ESI ; EAX除以ESI,和上面的一个循环差不多。
0045EACA |. 80C2 30 |ADD DL,30 ; 余数加30
0045EACD |. 8853 01 |MOV BYTE PTR DS:[EBX+1],DL ; 结果并排在[EBX+1]的位置
0045EAD0 |. 41 |INC ECX
0045EAD1 |. 43 |INC EBX
0045EAD2 |. 83F9 07 |CMP ECX,7 ; ECX位数与7比较
0045EAD5 |.^ 75 E0 \JNZ SHORT FIVE.0045EAB7 ; 不等的话往上循环
0045EAD7 |> C685 D8FEFFFF>MOV BYTE PTR SS:[EBP-128],0
0045EADE |. C605 60FA4600>MOV BYTE PTR DS:[46FA60],1 ; [46FA60]=1,标志位符
0045EAE5 |. B9 06000000 MOV ECX,6 ; ECX=6
0045EAEA |. 8D85 D2FEFFFF LEA EAX,DWORD PTR SS:[EBP-12E] ; 真码进EAX
0045EAF0 |. 8D95 37FFFFFF LEA EDX,DWORD PTR SS:[EBP-C9] ; 试练码
0045EAF6 |> 8A18 /MOV BL,BYTE PTR DS:[EAX] ; 进行循环逐位比较
0045EAF8 |. 3A1A |CMP BL,BYTE PTR DS:[EDX] ; 比较咯。。。
0045EAFA |. 74 09 |JE SHORT FIVE.0045EB05 ; 相等才跳
0045EAFC |. C605 60FA4600>|MOV BYTE PTR DS:[46FA60],0 ; 否则[46FA60]=0,这是标志位
0045EB03 |. EB 05 |JMP SHORT FIVE.0045EB0A ; 然后跳转循环
0045EB05 |> 42 |INC EDX
0045EB06 |. 40 |INC EAX
0045EB07 |. 49 |DEC ECX
0045EB08 |.^ 75 EC \JNZ SHORT FIVE.0045EAF6
0045EB0A |> 33C0 XOR EAX,EAX ; 循环跳出来这
0045EB0C |. 5A POP EDX
0045EB0D |. 59 POP ECX
0045EB0E |. 59 POP ECX
0045EB0F |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
0045EB12 |. 68 2AEB4500 PUSH FIVE.0045EB2A
0045EB17 |> 8D85 CCFDFFFF LEA EAX,DWORD PTR SS:[EBP-234]
0045EB1D |. E8 B64DFAFF CALL FIVE.004038D8
0045EB22 \. C3 RETN
0045EB23 .^ E9 EC47FAFF JMP FIVE.00403314
0045EB28 .^ EB ED JMP SHORT FIVE.0045EB17
0045EB2A . 5F POP EDI
0045EB2B . 5E POP ESI
0045EB2C . 5B POP EBX
0045EB2D . 8BE5 MOV ESP,EBP
0045EB2F . 5D POP EBP
0045EB30 . C3 RETN ; 返回。。。
[ 本帖最后由 野猫III 于 2006-8-12 23:11 编辑 ] |
|