LEA EDX,DWORD PTR DS:[406349] //地址进edx
PUSH EDX //这里edx为:406349,该地址指向一个字符串
//我们假定这个串就是"rageliu"吧
//显然这里入栈是做为下面lstrlenA()的参数
CALL <JMP.&kernel32.lstrlenA> //lstrlenA()函数取上面串长度,结果7在EAX
MOV EBP,EAX //-----------@到这句的时候我有下面的疑问
当到了最后的MOV EBP,EAX这句的时候(这句还没有执行),EDX居然变为了40634A,
也就是说CALL <JMP.&kernel32.lstrlenA> 执行后edx加了1,lstrlenA()函数为什么会使edx增加了1呢???
------解决方案--------------------------------------------------------
我的系统是 xp/sp2, 下面是 kernel32!lstrlenA 函数的主要部分:
7C80BDB6 > 6A 08 PUSH 8
7C80BDB8 68 F0BD807C PUSH kernel32.7C80BDF0
7C80BDBD E8 0467FFFF CALL kernel32.7C8024C6
7C80BDC2 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
7C80BDC5 85C0 TEST EAX,EAX
7C80BDC7 0F84 68A80200 JE kernel32.7C836635
7C80BDCD 8365 FC 00 AND DWORD PTR SS:[EBP-4],0
7C80BDD1 8D50 01 LEA EDX,DWORD PTR DS:[EAX+1] ;* 这里给 edx 设置值
7C80BDD4 8A08 MOV CL,BYTE PTR DS:[EAX]
7C80BDD6 40 INC EAX
7C80BDD7 84C9 TEST CL,CL
7C80BDD9 ^75 F9 JNZ SHORT kernel32.7C80BDD4
7C80BDDB 2BC2 SUB EAX,EDX ;* 依此计算字符串长度
7C80BDDD 834D FC FF OR DWORD PTR SS:[EBP-4],FFFFFFFF
7C80BDE1 E8 1B67FFFF CALL kernel32.7C802501
7C80BDE6 C2 0400 RETN 4
由于上面的取当前字符后给 EAX 增 1 了, 所以, 遇到了结束字节 00 时, EAX 指向了 00 的下一个字符. 为了使得长度准确, 同样起始地址 (EDX) 也要增 1, 所以才有 lea edx, [eax+1]. 当然了, 也可以有其它的计算方法, 只是 ms 选择了这个方法而已.