反向设计一个虚拟方法,该方法仅在返回之前对EAX的低字节进行异或

时间:2017-07-17 11:25:49

标签: c++ assembly x86 reverse-engineering

我需要帮助从反汇编中反向设计虚拟方法。该代码最初使用Microsoft的Visual C ++编译。有问题的方法如下:

sub_92D110    proc near
xor al, al
retn
sub_92d110    endp

这个方法在很多类之间引用,甚至在一个类的vtable中多次引用。我不确定它的作用;这是否意味着该方法被内联但是调用仍然保持vtable保持其大小?

如果是这样,xor al, al做了什么?我是否误解了召唤大会或什么?

1 个答案:

答案 0 :(得分:11)

这很可能是这样的:

bool someclass::somemethod() {
    return false;
} 

解释

  • xor al,aleax的低字节设置为零。
  • 所有x86通话约定都使用eax作为"返回值"注册寄存器大小的整数值。
  • 这不能是返回int的函数(如在return 0;中),因为它只清除低字节(并且没有x86调用约定使用eax作为输入参数,所以它不是一个带有整数参数的怪异函数,将其低字节归零并返回它。)
  • 这给我们留下了一个函数,它返回一个字节大小的值,设置为零,因此它可以返回char / unsigned char(0)或bool({ {1}});我更倾向于认为它是第二种选择,因为在实践中它更常出现(特别是在#34;空的"方法的基类实现可能由派生类重新定义) )。
  • 它不需要参数,也不是可变参数,它不会查看任何参数。 VC ++ / x86上的C ++方法使用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零。