两段简单的验证参数的反汇编代码,但是在计算了下堆栈中参数的位置,发现不太对,可能是我理解有问题,请各位指点下。谢谢。
1:
push ebp
mov ebp , esp
push ebx
mov ebx , [ebp + arg_c] //arg_c=14h
push esi
push edi
xor edi , edi
cmp ebx , edi
jnz loc_7caaaaaa
这段代码注释说是验证第6个参数是否为空,但是ebp+14h后应该指向的第四个参数啊!
2:
push ebp
mov ebp, esp
sub esp, 414h
push ebx
push esi
xor esi, esi
push edi
cmp [ebp+arg_0], esi //arg_0=8,判断4号串地址是否为空
mov edi, ds:__imp_wcslen
mov ebx, 411h
jz short loc_7517FCED
这个更夸张,怎么会是第四个参数呢?
我理解的堆栈:
低地址《------------------------------------高地址
|ebp|ret|参数1|参数2|参数3|参数4|参数5|参数6|
不知道哪里错了,请各位指点下,谢谢了!
------解决方案--------------------------------------------------------
1.就arg_c=14h来说,是第六个堆栈参数,但是前面两个堆栈参数是ebp与ebx,所以,的确是逻辑意义上所说的第四参。
2.arg_0=8,判断4号串地址是否为空,为什么是第四参?不知道,也许前面有两个的参数类型是word的呢?有点乱,不求甚解啦。搞反汇编不用弄得这么清楚我觉得。
------解决方案--------------------------------------------------------
2:
push ebp
mov ebp, esp
sub esp, 414h
push ebx
push esi
xor esi, esi
push edi
cmp [ebp+arg_0], esi //arg_0=8,判断4号串地址是否为空
mov edi, ds:__imp_wcslen
mov ebx, 411h
jz short loc_7517FCED
这个更夸张,怎么会是第四个参数呢?
------------------------------------------
这个是指向第一个参数。
------解决方案--------------------------------------------------------
楼主理解的没有错,这是我模拟的一个函数堆栈情况:
ebp ==> > /0013FF80
ebp +4 > |00401020 返回到 B.00401020 来自 B.00401000
ebp +8 > |00000001 //下面为参数
ebp +C > |00000002
ebp +10 > |00000003
ebp +14 > |00000004
ebp +18 > |00000005
ebp +1C > |00000006
ebp +20 > ]0013FFC0