我有以下代码:
00401163 > 8D15 49634000 LEA EDX,DWORD PTR DS:[406349] ; see below, 0x406349 is pointing to entered username
00401169 . 52 PUSH EDX ; /String => "myusername"
0040116A . E8 8D020000 CALL <JMP.&kernel32.lstrlenA> ; \lstrlenA
0040116F . 8BE8 MOV EBP,EAX
00401171 . B9 05000000 MOV ECX,5
00401176 . 33F6 XOR ESI,ESI ; ESI = 0
00401178 . 33C0 XOR EAX,EAX
0040117A > 8A0C16 MOV CL,BYTE PTR DS:[ESI+EDX] ; Why is it pointing to 'y' (2nd letter of username) at 1st run in the loop?
0040117D . 8AD9 MOV BL,CL
0040117F . 3298 28634000 XOR BL,BYTE PTR DS:[EAX+406328]
00401185 . 40 INC EAX
00401186 . 83F8 05 CMP EAX,5
00401189 . 881C32 MOV BYTE PTR DS:[EDX+ESI],BL
0040118C . 8888 27634000 MOV BYTE PTR DS:[EAX+406327],CL
00401192 . 75 02 JNZ SHORT crackme.00401196
00401194 . 33C0 XOR EAX,EAX
00401196 > 46 INC ESI
00401197 . 3BF5 CMP ESI,EBP
00401199 .^72 DF JB SHORT crackme.0040117A
如您所见,0x406349包含用户名:
00406349 6D 79 75 73 65 72 6E 61 6D 65 00 00 00 00 00 00 myusername......
有一个循环会遍历输入的用户名的字母。我不明白为什么循环中的第一次运行 (at 0x40117A) 包含用户名的第二个字母而不是第一个字母,因为索引 ( ESI) 是0.
你能帮我理解吗?