gpt4 book ai didi

c++ - 对返回前仅对 EAX 的低字节进行异或运算的虚方法进行逆向工程

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:28 29 4
gpt4 key购买 nike

我需要帮助从反汇编中对虚拟方法进行逆向工程。代码最初是用 Microsoft 的 Visual C++ 编译的。问题方法如下:

sub_92D110    proc near
xor al, al
retn
sub_92d110 endp

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

如果是这样,xor al, al 做了什么?我是不是误解了调用约定之类的东西?

最佳答案

这很可能是这样的:

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

说明

  • xor al,aleax 的低字节设置为零。
  • 所有 x86 调用约定都使用 eax 作为寄存器大小整数值的“返回值”寄存器。
  • 这不能是返回 int 的函数(如 return 0;),因为它只清除低字节(没有 x86 调用约定使用 >eax 作为输入参数,所以它不是一些接受整数参数、将其低字节归零并返回它的奇怪函数。
  • 这给我们留下了一个函数,该函数返回一个字节大小的值,设置为零,因此它可以返回一个 char/unsigned char (0) 或一个bool (false);我更倾向于认为这是第二种选择,因为在实践中它出现得更频繁(尤其是在可能由派生类重新定义的方法的“空”基类实现中)。
  • 它要么不接受任何参数,要么是一个不考虑任何参数的可变参数函数。 VC++/x86 上的 C++ 方法使用 __thiscall 调用约定,除了将 this 指针放在 ecx 之外,与 相同__stdcall 用于“常规”方法,与 __cdecl 用于可变参数相同;现在,__stdcall 是被调用者清理,这里没有清理可言,这意味着没有参数;另一方面,即使在 __cdecl 函数中,被调用方法也没有清理,因此我们不能先验排除这种可能性。话虽如此,我认为最后一个选项不太可能。

This method is referenced between a lot of classes, even multiple times inside of a vtable of one class.

这是完全正常的; VC++的链接器有规律merges unrelated functions that compile to the same machine code (和 confusingly calls this "identical COMDAT folding" )。

鉴于此过程的级别非常低(它本质上是查看为各种函数生成的字节并查看是否可以对它们进行去重),理论上上述所有假设都可能成立—它可能是一种不带参数并在一个 vtable 槽中返回 bool false 的方法,以及在另一个 vtable 槽中返回 char 零的可变参数方法.

关于c++ - 对返回前仅对 EAX 的低字节进行异或运算的虚方法进行逆向工程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45143027/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com