我遇到了以下指示:

mov ecx, [ebp + var_4]
imul ecx, 4
call dword_1423d4[ecx]


有人可以向我解释这可能意味着什么或将我指向正确的方向吗?为什么调用变量?

评论

通过引用从指针数组中调用函数?

@PSS是什么意思?

#1 楼

dword_1423d4是指向32位函数指针的全局数组的指针。

var_4是该数组的索引。 call函数数组。

评论


当值是线性时,它是“ switch()”语句的常见表示形式。 var_4是switch()的参数,dword_1423d4是案例处理程序表。

–彼得·弗里
2013年6月25日17:50

@peterferrie-根据我的经验,通常将switch语句编译为使用jmp而不是调用,但是我想在某些情况下编译器可能会选择后者。

–詹森·格夫纳(Jason Geffner)
2013年6月25日21:53

我同意Jason的观点,由于调用并且没有jmp,因此不太可能(尽管不能保证)成为switch语句。可能是自定义函数分派器或其他东西。

– QAZ
2013年6月26日9:39

也同意@JasonGeffner。我从未见过在x86上使用调用指令实现的switch语句(或实际函数调用之外的任何内容)。

–乔纳森·莱因哈特(Jonathon Reinhart)
13年6月28日在5:41

顺便说一下,@ JasonGeffner,我想几年前BlackHat对您的名字听起来很耳熟。

–乔纳森·莱因哈特(Jonathon Reinhart)
13年6月28日在6:00

#2 楼

马上想到的是访问IAT或IVT的某种类型的虚拟化层。我完全同意先前的回答,即这是对函数指针数组中的函数向量的调用。我也同意,它看起来不像switch语句。这就是使我进入中断向量表/地址表的原因。

评论


您能否在答案中添加更多详细信息?与上面的答案有何不同?目前,这听起来像是对杰森的答案的赞誉。如果您打算这样做,则可以通过单击旁边的upvote按钮来显示您对另一个答案的同意。无需发布单独的答案。

–asheeshr
13年7月14日在2:30



我肯定在他的回答中错过了对中断向量或地址表的引用。

– David Hoelzer
13年7月14日在2:39