首先用插件 超级字符串 得到如图所示位置:
00444F60 /. 55 PUSH EBP
00444F61 |. 8BEC MOV EBP,ESP
00444F63 |. 6A 00 PUSH 0
00444F65 |. 33C0 XOR EAX,EAX
00444F67 |. 55 PUSH EBP
00444F68 |. 68 EA4F4400 PUSH cm.00444FEA
00444F6D |. 64:FF30 PUSH DWORD PTR FS:[EAX]
00444F70 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
00444F73 |. 803D 49784400>CMP BYTE PTR DS:[447849],0
00444F7A |. 74 13 JE SHORT cm.00444F8F
00444F7C |. A1 906C4400 MOV EAX,DWORD PTR DS:[446C90]
00444F81 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]
00444F83 |. BA FC4F4400 MOV EDX,cm.00444FFC ; 正确
00444F88 |. E8 07D0FFFF CALL cm.00441F94
00444F8D |. EB 11 JMP SHORT cm.00444FA0
00444F8F |> A1 906C4400 MOV EAX,DWORD PTR DS:[446C90]
00444F94 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]
00444F96 |. BA 0C504400 MOV EDX,cm.0044500C ; 错误
00444F9B |. E8 F4CFFFFF CALL cm.00441F94
00444FA0 |> 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
00444FA3 |. A1 906C4400 MOV EAX,DWORD PTR DS:[446C90]
00444FA8 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]
00444FAA |. E8 9DCFFFFF CALL cm.00441F4C
00444FAF |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00444FB2 |. BA 0C504400 MOV EDX,cm.0044500C ; 错误
00444FB7 |. E8 B4ECFBFF CALL cm.00403C70
00444FBC |. 75 0C JNZ SHORT cm.00444FCA
00444FBE |. B8 1C504400 MOV EAX,cm.0044501C ; 再来
00444FC3 |. E8 88FBFFFF CALL cm.00444B50
00444FC8 |. EB 0A JMP SHORT cm.00444FD4
00444FCA |> B8 2C504400 MOV EAX,cm.0044502C ; 谢谢
00444FCF |. E8 7CFBFFFF CALL cm.00444B50
00444FD4 |> 33C0 XOR EAX,EAX
00444FD6 |. 5A POP EDX
00444FD7 |. 59 POP ECX
00444FD8 |. 59 POP ECX
00444FD9 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
00444FDC |. 68 F14F4400 PUSH cm.00444FF1
00444FE1 |> 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
00444FE4 |. E8 F7E8FBFF CALL cm.004038E0
00444FE9 \. C3 RETN
知道00444F7A为关键跳转:
向上看知道内存00447849为关键地址决定对错。
然后对00447849设置内存断点 重新调试
断在此处:
004450A2 . C605 49784400 00 MOV BYTE PTR DS:[447849],0
004450A9 . 83FE 04 CMP ESI,4 ; 用户名大于4位
004450AC . 0F8E A3000000 JLE cm.00445155
004450B2 . 83FF 08 CMP EDI,8 ; 密码为8位
004450B5 . 0F85 9A000000 JNZ cm.00445155
004450BB . 33C0 XOR EAX,EAX
004450BD . 55 PUSH EBP
通过分析得知ESI为用户名个数,EDI为密码个数
说明用户名必须大于4为 密码必须为8位 否则。。。。
然后往下看 经过这里:
00445135 . 48 DEC EAX
00445136 .^ 75 EA JNZ SHORT cm.00445122
00445138 > 81F2 08088419 XOR EDX,19840808
0044513E . 3B55 F4 CMP EDX,DWORD PTR SS:[EBP-C]
00445141 . 74 09 JE SHORT cm.0044514C
00445143 . C605 49784400 00 MOV BYTE PTR DS:[447849],0
0044514A . EB 10 JMP SHORT cm.0044515C
0044514C > C605 49784400 01 MOV BYTE PTR DS:[447849],1
00445153 . EB 07 JMP SHORT cm.0044515C
00445155 > C605 49784400 00 MOV BYTE PTR DS:[447849],0
0044515C > 8B83 D8020000 MOV EAX,DWORD PTR DS:[EBX+2D8]
00445162 . 8A15 48784400 MOV DL,BYTE PTR DS:[447848]
00445168 . 8B08 MOV ECX,DWORD PTR DS:[EAX]
0044516A . FF51 5C CALL DWORD PTR DS:[ECX+5C]
注意看0044514C这里终于修改了00447849的内容:到这里表示成功了。。。。
所以这个比较为关键0044513E . 3B55 F4 CMP EDX,DWORD PTR SS:[EBP-C]
其实走到这里就出现明码了。。。
算法就不说了 已经分析得很明白了。