- UID
- 28562
注册时间2007-2-21
阅读权限30
最后登录1970-1-1
龙战于野
TA的每日心情 | 奋斗 2023-12-27 21:49 |
---|
签到天数: 85 天 [LV.6]常住居民II
|
楼主 |
发表于 2011-3-27 12:09:58
|
显示全部楼层
本帖最后由 foxjinlin 于 2011-3-27 12:12 编辑
贴上GGLHY大侠的算法分析注解(说得比较透彻哦):
---------------------------------------------------------------------------
004D7DA8 /$ 55 PUSH EBP
004D7DA9 |. 8BEC MOV EBP,ESP
004D7DAB |. 6A 00 PUSH 0
004D7DAD |. 6A 00 PUSH 0
004D7DAF |. 6A 00 PUSH 0
004D7DB1 |. 53 PUSH EBX
004D7DB2 |. 56 PUSH ESI
004D7DB3 |. 8BF1 MOV ESI,ECX
004D7DB5 |. 8955 FC MOV DWORD PTR SS:[EBP-4],EDX
004D7DB8 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004D7DBB |. E8 A0D6F2FF CALL liteserv.00405460
004D7DC0 |. 33C0 XOR EAX,EAX
004D7DC2 |. 55 PUSH EBP
004D7DC3 |. 68 657E4D00 PUSH liteserv.004D7E65
004D7DC8 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
004D7DCB |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
004D7DCE |. 837D FC 00 CMP DWORD PTR SS:[EBP-4],0
004D7DD2 |. 75 09 JNZ SHORT liteserv.004D7DDD
004D7DD4 |. 8BC6 MOV EAX,ESI
004D7DD6 |. E8 C9D1F2FF CALL liteserv.00404FA4
004D7DDB |. EB 6D JMP SHORT liteserv.004D7E4A
004D7DDD |> 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
004D7DE0 |. BA 7C7E4D00 MOV EDX,liteserv.004D7E7C ; ASCII "Try BUYING LiteServe"
004D7DE5 |. E8 52D2F2FF CALL liteserv.0040503C
004D7DEA |. BB 01000000 MOV EBX,1
004D7DEF |> 8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4] ; 用户名
004D7DF2 |. E8 81D4F2FF |CALL liteserv.00405278
004D7DF7 |. 50 |PUSH EAX ; 用户名长度
004D7DF8 |. 8BC3 |MOV EAX,EBX
004D7DFA |. 48 |DEC EAX
004D7DFB |. 5A |POP EDX
004D7DFC |. 8BCA |MOV ECX,EDX
004D7DFE |. 99 |CDQ
004D7DFF |. F7F9 |IDIV ECX
004D7E01 |. 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4] ; 用户名(重复到20位为止)
004D7E04 |. 8A0410 |MOV AL,BYTE PTR DS:[EAX+EDX] ; 依次用户名ASC
004D7E07 |. 8B55 F8 |MOV EDX,DWORD PTR SS:[EBP-8] ; Try BUYING LiteServe
004D7E0A |. 8A541A FF |MOV DL,BYTE PTR DS:[EDX+EBX-1] ; 依次取固定字符串Try BUYING LiteServe每位ASC
004D7E0E |. 32C2 |XOR AL,DL ; XOR
004D7E10 |. 25 FF000000 |AND EAX,0FF
004D7E15 |. 8D55 F4 |LEA EDX,DWORD PTR SS:[EBP-C]
004D7E18 |. E8 DF21F3FF |CALL liteserv.00409FFC ; XOR的结果转成10进制
004D7E1D |. 8B45 F4 |MOV EAX,DWORD PTR SS:[EBP-C] ; 转成的10进制
004D7E20 |. E8 53D4F2FF |CALL liteserv.00405278
004D7E25 |. 8B55 F4 |MOV EDX,DWORD PTR SS:[EBP-C]
004D7E28 |. 8A4402 FF |MOV AL,BYTE PTR DS:[EDX+EAX-1] ; 10进制的个位的ASC
004D7E2C |. 50 |PUSH EAX
004D7E2D |. 8D45 F8 |LEA EAX,DWORD PTR SS:[EBP-8]
004D7E30 |. E8 93D6F2FF |CALL liteserv.004054C8
004D7E35 |. 5A |POP EDX
004D7E36 |. 885418 FF |MOV BYTE PTR DS:[EAX+EBX-1],DL ; 当前10进制的个位替换固定字符串当前所取得位数上的字符
004D7E3A |. 43 |INC EBX
004D7E3B |. 83FB 15 |CMP EBX,15 ; 固定字符串的长度=20(EBX初始为1)
004D7E3E |.^ 75 AF \JNZ SHORT liteserv.004D7DEF
004D7E40 |. 8BC6 MOV EAX,ESI
004D7E42 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
004D7E45 |. E8 AED1F2FF CALL liteserv.00404FF8
依次取用户名20位(不足则重复取用户名直到20为止)每位ASC xor (固定字符串Try BUYING LiteServe)每一位ASC;xor后的结果转10进制,取10进制的个位直至20位,就是注册码了
注意观察用户名在这个循环中的变化,想想看为何004D7DF7处PUSH EAX会来压入用户名长度?为何004D7E3B处会有 CMP EBX,15?
把循环跑完,跑的时候注意看下信息窗口和堆栈、内存数据窗口就明白了!
------------------------------------------------------------------------------ |
|