【问题标题】:how to get the address of a member function within a class如何获取类中成员函数的地址
【发布时间】:2017-03-17 02:24:08
【问题描述】:

我正在尝试获取成员函数的地址。基本上我正在尝试获取内存中加载的 Windows api 函数和我的函数之间的偏移量。

这是我试图获取的地址:

   NTSTATUS (NTAPI myntquerydirectoryfile)(
        HANDLE hFile,
        HANDLE hEvent,
        PVOID pApcRoutine,
        PVOID pApcContext,
        IO_STATUS_BLOCK* ioStatus,
        PVOID pBuffer,
        ULONG bufferSize,
        FILE_INFORMATION_CLASS infoClass,
        BOOLEAN singleEntry,
        PUNICODE_STRING pFileName,
        BOOLEAN restart
    )
    {

        cout << "my func" << endl;

    };


    typedef  NTSTATUS (*pmyhook)(HANDLE hFile,
        HANDLE hEvent,
        PVOID pApcRoutine,
        PVOID pApcContext,
        IO_STATUS_BLOCK* ioStatus,
        PVOID pBuffer,
        ULONG bufferSize,
        FILE_INFORMATION_CLASS infoClass,
        BOOLEAN singleEntry,
        PUNICODE_STRING pFileName,
        BOOLEAN restart);

    pmyhook = &myntquerydirectoryfile;

【问题讨论】:

  • 你能告诉我们你的尝试吗?
  • 在这里........好吧....这里说我不能发布一些太长的东西。
  • 在这里获得了代码。
  • 只用它的名字。这通过编译器成为它的地址。
  • 那么你将如何从一个类中打印一个函数的地址呢?我尝试为函数指针做一个 typedef,然后将其分配给该类的成员函数。它没有帮助。

标签: c++ hook code-injection malware


【解决方案1】:

此代码快照显示了如何获取类成员函数的地址:

#include <stdio.h>
class A 
{
public:
    void test() 
    {
        // Address of member function test(), is the value of &A::test
        printf("Address of function is: 0x%X\n", &A::test);
    }
};

int main()
{
    A a;
    a.test();
}

【讨论】:

  • 好吧,我试图从类中获取函数测试的地址。但如果我们尝试从 main 打印地址,这实际上是有效的。
  • @jammy47 我不明白为什么这是个问题。请参阅我编辑的答案。如果要获取班级内的地址,只需将该行移入班级即可。
  • 我刚刚检查过,代码有效。我非常感谢今天在这里得到的所有帮助,尤其是来自 Martin Zhai 的帮助。非常感谢。请耐心等待我,因为我是新来的,并尝试学习有关恶意软件和信息安全的一两件事。基本上我想要实现的是通过createremotethread进行代码注入。我创建的类有一个函数,它获取 ntquerydirectoryfile 的地址并尝试替换前 6 个字节。要创建跳转,我需要类内的函数(所以我不能从类中创建对象)和 api 之间的偏移量。
  • 好吧,兄弟,我很乐意这样做,感谢您今天的帮助。只是我无法真正正确地表达我的问题,而您提供的答案并不能完全解决手头的问题。我想我将不得不了解这个网站是如何工作的,然后再试一次。不过还是谢谢。
  • 叹息。 '在班级范围内'没有任何意义,除非您的意思是A::,如本答案中给出的那样。成员函数有一个固定的绝对地址,不依赖于任何范围。你已经被告知过六次了。这个答案给出了正确的解决方案。我不知道你为什么还要进一步讨论。
【解决方案2】:

一般来说是不允许也不推荐的。

void (Class_Name::* FuncPointer)() = &Class_Name::Func_Name;

FuncPointer 将指向类方法。

在 C++ 11 中更好地使用静态函数或 lambda 特性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2018-05-07
    相关资源
    最近更新 更多