我有一个大型的 c++ 程序,我找到了一个指向感兴趣对象的指针。我希望能够至少通过构造函数来识别该对象。当对象的构造函数“无处可见”时,我可以使用哪些方法来识别构造函数,即它在程序流程中很远?
识别 C++ 中的结构
逆向工程
拆卸
C++
2021-06-27 17:02:39
2个回答
过去我曾对此有所涉猎,找到构造函数的一种方法是尝试找到此对象的虚拟函数表 (VTable)。
请注意,并非所有类都有虚函数,因此并非所有类都有虚表。
通常,指向 VTable 的指针是对象内存中的第一个值,例如 Object_base_address+0x00
关于 vtables 的更多信息在这里
https://stackoverflow.com/questions/3554909/what-is-vtable-in-c
和这里
https://alschwalm.com/blog/static/2016/12/17/reversing-c -虚拟功能/
另一种方法是通过编写您自己的代码并对其进行逆向工程来探索编译器在为构造函数生成代码时会做什么。
然后可以将这种更好的理解应用于搜索特定功能的更大程序。需要注意的是,代码生成因编译器而异。
对于这种方法,您可以使用https://godbolt.org/,它可以让您直接编译为汇编代码并进行探索。
如果您需要更多信息,请随时询问。
在了解了有关反编译的更多信息后,我想对之前的答案进行一些扩展。C++ 中有两种主要的对象类型(即在 MS Windows 上)。这两个是具有 vtables 的对象和没有 vtables 的对象。
在没有 vtable 的对象中,识别它们肯定更棘手,但从好的方面来说,这些通常是在编译时声明的非常大的结构,或者在函数范围内构造的小结构。所以你可以通过它的构造函数或它在内存中的地址来区分对象。或者至少,没有 vtables 的本地构造对象不会有太多的函数调用。
其它你可能感兴趣的问题