2017-03-17 126 views
0

我試圖獲取成員函數的地址。基本上我試圖獲得加載在內存中的窗口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; 
+0

你能告訴我們你試過了什麼嗎? – 1201ProgramAlarm

+0

它在這裏..............好....它說在這裏我不能發佈一些事情太長。 – jammy47

+0

在此處獲得了代碼。 – jammy47

回答

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(); 
} 
+0

嗯,即時通訊試圖從類內獲取功能測試的地址。但是,如果我們試圖從main打印地址,實際上會起作用。 – jammy47

+0

@ jammy47我不明白爲什麼這是一個問題。請看我編輯的答案。如果你想在課堂中獲得地址,只需將該行移入課程中即可。 –

+0

我剛查過,代碼有效。我非常感謝今天在這裏收到的所有幫助,特別是Martin Zhai。非常感謝。只需要忍受我在這裏新的工作,並試圖學習一些關於惡意軟件和信息安全的事情。基本上我試圖實現的是通過createremotethread進行代碼注入。 ive創建的類有一個函數,它獲取ntquerydirectoryfile的地址並嘗試替換前6個字節。爲了創建跳轉,我需要在類內的函數(所以我不能將對象移出類)和api之間的偏移量。 – jammy47

0

在一般情況下,它是不允許的,不建議。

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

FuncPointer將指向類方法。

更好地使用靜態函數或C++ 11中的lambda功能。

相關問題