jjzjj

c++ - 从 DLL 实例化子类时,vtable 是否正确?

当您在主可执行文件中有一个基类并在DLL中定义了子类(例如,插件)时,当您想要获得一个插件时会发生什么?我正在寻找一篇文章/答案来阐明当你发生什么时加载动态链接库调用DLL的函数返回一个plugin*(它有虚函数)在您的主要可执行代码中使用该插件删除、卸载我正在考虑vtable和其他C++问题。例如,如果您卸载DLL仍然有一些插件正在运行......“代码”会消失吗? 最佳答案 既然你在谈论插件,你一定在做类似LoadLibrary的事情。假设Windows:加载库。您通常会调用LoadLibrary,然后调用GetProcAddr

c++ - 获取具体进程内存空间

我有一个函数指针(void*),我想知道这个函数属于哪个进程。我不知道该怎么做,但我认为可以通过使用某种形式的VirtualQuery技巧来实现。任何帮助将不胜感激。提前致谢澄清:“属于进程”是指函数所在的进程。例如:假设内存中加载了一个可执行文件(test.exe)。该可执行文件包含一个名为SayHello的函数,它位于内存中的0xDEADBEEF处。在一个完全不同的过程中,我怎么知道0xDEADBEEF在test.exe的内存空间中。希望事情已经解决了。澄清2:我相信您熟悉“VTableHook”,其中外部模块在单独的进程中更改VTable指针以指向不同的函数。因此,无论何时调用H

windows - 在 C++ 中 Hook IDispatch v 表

我正在尝试修改系统中已存在的IDispatch接口(interface)的行为。为此,我的计划是在运行时Hook对象v表并修改指针,使其指向自定义Hook方法。如果我能让它工作,我就可以向现有对象添加新方法和属性。不错。首先,我尝试连接到IUnknown的v表(IDispatch从中继承)并且工作正常。但是,尝试更改IDispatch中的条目根本不起作用。什么也没有发生,代码就像没有钩子(Hook)时一样工作。这是代码,很简单,理解起来应该没有问题#include#include#include#pragmacomment(lib,"Ole32.lib")usingnamespaces

windows - 如何检查进程是否被 Hook ?

他们是一种查看应用程序是否被Hook的方法吗?我希望能够查看应用程序是否被Hook,如果是,也许可以查看究竟是什么被Hook?我不确定这是否可能,但我想知道。我只是在寻找一个现有的应用程序来执行此操作以监视某些进程。 最佳答案 Hook函数有很多不同的方法。有些很容易检测,有些则更难。HookShark能够检测出相当多的常见hook方法。它无法检测到的是通过对象实例中的vtable替换Hook。入侵者将动态分配对象开头的vtable指针替换为指向他伪造的vtable的指针,其中要Hook的函数被重定向。外部程序无法检测到这一点,因为

java - C中使用虚方法表的动态调度

我希望找到在C中实现动态调度的提示(最好是好的示例)。我正在学习C,作为练习,我想使用动态分派(dispatch)虚拟方法表从Java转换为C。例如我有一个java代码:abstractclassFoo{publicabstractintval();publicabstractBooleanerror();}classFailextendsFoo{publicintval(){return0;}publicBooleanerror(){returntrue;}}classIntFooextendsFoo{intv;publicIntFoo(intvalue){this.value=v;

c++ - 替代虚函数调用实现?

C++通过虚拟机制支持动态绑定(bind)。但据我了解,虚拟机制是编译器的一个实现细节,标准只是规定了在特定场景下应该发生的行为。大多数编译器通过虚表和虚指针来实现虚机制。这与虚拟指针和表的实现细节无关。我的问题是:除了虚拟指针和虚拟表机制之外,是否有任何编译器以任何其他方式实现虚拟函数的动态分配?据我所见(阅读G++、MicrosoftVisualStudio)通过虚拟表、指针机制实现它。那么实际上还有其他编译器实现吗?任何只有一个虚函数的类的sizeof将是该编译器上的指针(this内的vptr)的大小。那么假设虚拟指针和TBL机制本身是编译器实现,我上面的这个说法是否总是正确的?

c++ - 在 MSVC ABI 中,如何可靠地找到仅给出 (void*) 的 vtable?

这个问题专门针对不可移植的MSVCABI内容。我正在尝试用显然不可移植但不神奇的C++编写与C++的typeid等效的代码。对于ItaniumABI(在Linux/Mac上使用),它非常简单:conststd::type_info&dynamicast_typeid(void*mdo){std::type_info**vptr=*reinterpret_cast(mdo);std::type_info*typeinfo_ptr=vptr[-1];return*typeinfo_ptr;}所以现在我正在查看64位MSVCABI,该死的,我被难住了。对于非常简单的类,即以偏移量0处的vfp

c++ - ELF文件中的虚拟表存放在哪个段,数据段还是其他?

众所周知,虚函数表指针通常存放在一个实例的前4个字节中。但是我很好奇在指定的ELF文件中虚函数表存放在什么地方。我写了下面的程序来测试,我用readelf-sa.out命令来获取ELF文件的符号表,但是找不到“vtable”之类的东西。#include#includeusingnamespacestd;typedefvoid(*fun_pointer)(void);classTest{public:Test(){cout 最佳答案 虚表存放在ELF文件的.rodata段中,对应的段加载到内存中。

c++ - 在 GCC 中替换 "fvtable-gc"

GCCv4.7.1中是否有“fvtable-gc”选项的替代品(GCCv3.x支持)?我想在链接过程中删除未使用的虚函数。fvtable-gcEmitspecialrelocationsforvtablesandvirtualfunctionreferencessothatthelinkercanidentifyunusedvirtualfunctionsandzerooutvtableslotsthatrefertothem.Thisismostusefulwith-ffunction-sectionsand-Wl,--gc-sections,inordertoalsodiscard

c++ - 有什么方法可以转储 g++ 编译程序的类布局

当使用g++编译时,-fdump-class-hierarchy以(或多或少)人类可读的格式导出程序的虚表。但是,生成的文件只包含有关vtable的信息,不有关类布局本身的信息。我想获得我所有程序类布局的综合列表。clang提供了-cc1-fdump-record-layouts参数来实现这一点。可以使用-d1reportAllClassLayout调用MS编译器。是否有任何g++开关可以执行此操作? 最佳答案 如果程序编译时带有调试信息,您可以使用pahole从调试信息中转储struct和vtable布局:g++-ggdb3-cp