juanzi 发表于 2015-4-13 16:27:46

怎样判断 一个CALL 需要几个参数呢


pushXXX
push xxxx
call0x00001
add esp,0x10

这种是不是说明内部还有两个 参数呢?用call 内部代码要怎样判断那两个参数是谁呢

unchenchao 发表于 2015-4-13 16:29:37

pushXXX
push xxxx   
call0x00001
add esp,0x10

0x10 /0x4=CALL要参数个数

unchenchao 发表于 2015-4-13 16:29:50

push 1
push 2
pushXXX
push xxxx   
call0x00001
add esp,0x10

参数个数 0x10/4=4个参数

weiziji 发表于 2015-4-13 16:30:26

你这个CALL是外面平栈的,如果调用需要手工平栈。

weiziji 发表于 2015-4-13 16:30:40

2个办法   
1 看call 外面是否有 add esp, xx
2 看call里面使用 retn xx
然后XX / 4 == 就是 几个参数了
这里的XX 是 16进制的,计算都要 16进制的哦

weiziji 发表于 2015-4-13 16:31:05

放入栈顶 再开4个空间?

如果只有call 内部的代码,那么怎么找到参数呢?

min722922 发表于 2015-4-13 16:31:17

这个我要收藏一下

卩s团团丨 发表于 2015-4-13 16:31:41

不是开辟空间,push的实质是什么,就是把一个值压入栈顶,然后esp自减4,表示这个栈的高度变高了(高度等于ebp-esp),这是一种变相,再比如call的实质是什么,就是push eip,jmp xxxx

在内部,既然已经知道的是外部平衡堆栈,那么就已经知道是4个参数,所以在内部头部下断,od堆栈窗口里,右键转到esp,第二个开始,数四个即可(第一个是eip)
)

juanzi 发表于 2015-4-13 16:32:31

卩s团团丨 发表于 2015-4-13 16:31
不是开辟空间,push的实质是什么,就是把一个值压入栈顶,然后esp自减4,表示这个栈的高度变高了(高度等于e ...

嗯。 那就是 call 进入头部时候,参数已经全部压入堆栈待用了噢?

juanzi 发表于 2015-4-13 16:33:01

weiziji 发表于 2015-4-13 16:30
你这个CALL是外面平栈的,如果调用需要手工平栈。

1 看call 外面是否有 add esp, xx
有时候 可能是开了优化的原因 xx/4 并不一定就是参数个数 就像楼主出的例子 很有可能就是两个参数
但是可能前后平衡的代码合在一起 这就需要仔细观察 可以查看该函数在其它位置的调用作为对比
页: [1] 2
查看完整版本: 怎样判断 一个CALL 需要几个参数呢