怎样判断 一个CALL 需要几个参数呢
pushXXX
push xxxx
call0x00001
add esp,0x10
这种是不是说明内部还有两个 参数呢?用call 内部代码要怎样判断那两个参数是谁呢 pushXXX
push xxxx
call0x00001
add esp,0x10
0x10 /0x4=CALL要参数个数 push 1
push 2
pushXXX
push xxxx
call0x00001
add esp,0x10
参数个数 0x10/4=4个参数 你这个CALL是外面平栈的,如果调用需要手工平栈。 2个办法
1 看call 外面是否有 add esp, xx
2 看call里面使用 retn xx
然后XX / 4 == 就是 几个参数了
这里的XX 是 16进制的,计算都要 16进制的哦 放入栈顶 再开4个空间?
如果只有call 内部的代码,那么怎么找到参数呢? 这个我要收藏一下 不是开辟空间,push的实质是什么,就是把一个值压入栈顶,然后esp自减4,表示这个栈的高度变高了(高度等于ebp-esp),这是一种变相,再比如call的实质是什么,就是push eip,jmp xxxx
在内部,既然已经知道的是外部平衡堆栈,那么就已经知道是4个参数,所以在内部头部下断,od堆栈窗口里,右键转到esp,第二个开始,数四个即可(第一个是eip)
) 卩s团团丨 发表于 2015-4-13 16:31
不是开辟空间,push的实质是什么,就是把一个值压入栈顶,然后esp自减4,表示这个栈的高度变高了(高度等于e ...
嗯。 那就是 call 进入头部时候,参数已经全部压入堆栈待用了噢? weiziji 发表于 2015-4-13 16:30
你这个CALL是外面平栈的,如果调用需要手工平栈。
1 看call 外面是否有 add esp, xx
有时候 可能是开了优化的原因 xx/4 并不一定就是参数个数 就像楼主出的例子 很有可能就是两个参数
但是可能前后平衡的代码合在一起 这就需要仔细观察 可以查看该函数在其它位置的调用作为对比
页:
[1]
2