我需要帮助从反汇编中反向设计虚拟方法。该代码最初使用Microsoft的Visual C ++编译。有问题的方法如下:
sub_92D110 proc near
xor al, al
retn
sub_92d110 endp
这个方法在很多类之间引用,甚至在一个类的vtable中多次引用。我不确定它的作用;这是否意味着该方法被内联但是调用仍然保持vtable保持其大小?
如果是这样,xor al, al
做了什么?我是否误解了召唤大会或什么?
答案 0 :(得分:11)
这很可能是这样的:
bool someclass::somemethod() {
return false;
}
xor al,al
将eax
的低字节设置为零。eax
作为"返回值"注册寄存器大小的整数值。 int
的函数(如在return 0;
中),因为它只清除低字节(并且没有x86调用约定使用eax
作为输入参数,所以它不是一个带有整数参数的怪异函数,将其低字节归零并返回它。)char
/ unsigned char
(0)或bool
({ {1}});我更倾向于认为它是第二种选择,因为在实践中它更常出现(特别是在#34;空的"方法的基类实现可能由派生类重新定义) )。false
调用约定,除了将__thiscall
指针放在this
中之外,它与ecx
相同,用于"常规&# 34;可变参数的方法和__stdcall
相同;现在,__cdecl
是被调用者清理,这里没有清理可言,这意味着没有争论;另一方面,即使在__stdcall
函数中,被调用的方法也没有清理,所以我们不能排除这种可能性 a priori 。话虽如此,我不认为最后一种选择是可能的。 这个方法在很多类之间引用,甚至在一个类的vtable中多次引用。
这完全正常; VC ++的链接器定期merges unrelated functions that compile to the same machine code(和confusingly calls this "identical COMDAT folding")。
鉴于此过程非常低(它主要查看为各种函数生成的字节并查看它们是否可以重复数据删除),理论上 上面的所有假设都可以保持在一起-it可能是一个不带参数的方法,并在一个vtable槽中返回__cdecl
bool
,而varargs方法在另一个槽中返回false
零。