CALL 指令前缺少参数

逆向工程 调用约定 争论
2021-06-21 21:02:19

我正在逆向用 C++ 编写的开源 Windows 应用程序。我在反汇编器中找到了我试图了解其行为的所需功能。

在代码中,该函数定义如下:

void ProtocolGame::sendUseItem(const Position& position, int itemId, int stackpos, int index)
{
    OutputMessagePtr msg(new OutputMessage);
    msg->addU8(Proto::ClientUseItem);
    addPosition(msg, position);
    msg->addU16(itemId);
    msg->addU8(stackpos);
    msg->addU8(index);
    send(msg);
}

如您所见,该函数有 4 个参数,但在汇编代码中它只推送 2 个参数。见下图。

在此处输入图片说明

这个 CALL 过程是怎么回事?它不应该有 4 个参数吗?

1个回答

似乎它有 4 个参数,并且它们是通过堆栈传递的,但是需要在 E42D6A 之上进行更多的反汇编行来确保。那些 mov 和 lea 指令是否让您感到困惑?如果您希望连续有 4 条推送指令,那么让我让您失望:编译器可以在推送指令之间插入任意数量的指令。让我再次让您失望:推指令不是编译器通过堆栈传递参数的唯一方式。