gpt4 book ai didi

decompiling - 反编译的 __thiscall 表达式是指向函数的指针吗?

转载 作者:行者123 更新时间:2023-12-04 04:57:34 25 4
gpt4 key购买 nike

我正在使用 IDA Pro 6.3 对 Win32 .dll 进行静态分析,并且正在使用 Hex-Rays 反编译器和 IDA 反汇编器。我想了解这条线的作用。

v4 = (*(int (__thiscall **)(int, int))(*(_DWORD *)dword_10087418 + 4))(dword_10087418, v11);

它的格式类似于函数调用。当在子例程调用中使用指向函数的指针时,这是反编译代码的样子吗?

谢谢。

最佳答案

这很可能是 C++,而不是普通的 C。这正是 Visual C++ 生成的虚拟方法调用的样子。我会说:

  • dword_10087418是一个指向对象的指针。它是全局变量或静态变量,而不是局部变量。
  • 该对象有一个虚方法表,代码正在调用该表中的第二个函数。
  • 假设 Hex-Rays 已正确识别函数参数,则被调用的函数采用一个 32 位参数。返回类型不清楚。
  • C++ 调用很可能非常简单,类似于 SomeClass::Instance->func(arg) .

  • 如果您不熟悉 C++ 对象布局,您应该阅读 C++ Under the Hood , Reversing: Secrets of Reverse EngineeringInside the C++ Object Model . IDA Pro Book 也有一个关于该主题的简短部分。

    如果你想要一个简短的总结,请继续阅读。请记住,所有这些都是 MSVC 的实现细节,其他编译器的做法不同,他们可以随意更改。 (另外,我通过不提及虚拟/多重继承来简化事情)。当一个类使用虚函数时,编译器会建立一个包含该类中所有此类函数的表,并将指向该表的指针作为该类每个对象的第一个隐藏成员。然后,从表中调用虚函数就像这样简单:
    mov ecx, esi   ; pretend that esi contains a pointer 
    ; to the object whose method is being called
    ; also known as "this"
    ; __thiscall functions expect to find this pointer in ecx
    ; and all later arguments on the stack
    mov edx, [ecx] ; get the vtable address
    push edi ; set up some integer-sized argument
    call [edx + 4] ; call the second function in the vtable

    这基本上就是这行代码所做的:
    (*(int (__thiscall **)(int, int))(*(_DWORD *)dword_10087418 + 4))(dword_10087418, v11)
    ^-----------------------^
    dereference pointer to get the address of the vtable
    (it's the first piece of data in the object)
    ^-----------------------------^
    add 4 bytes to get address of the second function
    ^------------------------------------------------------------------------------------^
    cast that pointer to a particular function pointer and call it
    (cast is invisible in assembler code, so it's just a call)

    请注意,由于成员函数需要访问 this ,编译器也必须通过它。这是一个在 C++ 中看不到的细节,但是 this被视为函数的附加参数 - 因此您会看到两个参数,但该函数只接受一个参数(MSVC 的 thiscall 约定要求 this 指针传入 ecx )。 IDA 不会费心隐藏那个指针,因为那会让人感到困惑。

    更多建议:获取 ms_rtti 为 IDA 编写脚本并运行它以查找 DLL 中的虚方法表,然后搜索对 dword_10087418 的其他引用。查看写入了哪些值 - 您应该能够确定哪个 vtable 与该对象相关联,然后确定正在调用哪个函数。

    如果您为类和相关虚表定义 stub 结构类型,然后告诉 IDA 指针使用该结构类型,则可以使 Hex-Rays 以更具可读性的方式显示代码。

    关于decompiling - 反编译的 __thiscall 表达式是指向函数的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16576824/

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