X64|C++逆向之類的內存結構分析

一 普通類的逆向分析

1.空白類

  • 首先寫段測試代碼來看一下空白類的對象大小,不要想固然的認爲空白類的大小就爲0喲,若是真爲0的話,那麼用該類建立的實例怎麼在內存中存儲?因此能夠確定size≠0,測試代碼以下:

class CEmptyClass{函數

public:
    CEmptyClass(){
        printf("CEmptyClass::CEmptyClass()\n");
    }測試

    ~CEmptyClass(){
        printf("CEmptyClass::~CEmptyClass()\n");
    }this

};spa


int _tmain(int argc, _TCHAR* argv[])
{
    CEmptyClass empty;指針

    printf("size = %d\n", sizeof(empty));調試

    return 0;
}對象

輸出結果以下:內存

  • 對上述代碼進行反彙編分析,反彙編代碼以下:

CEmptyClass 構造函數的反彙編以下圖:class

2.包含成員的類

  • 對象的內存是依次由虛函數表指針+成員變量組成(注意字節對齊的問題,在此不講)。在此小節中不涉及虛函數表,樣例代碼以下:

class CTest{
public:
    CTest(){
        m_nVal = 1;
        m_chVal = '1';
        m_fVal = 1.0;
    }
    ~CTest(){
    }test

    // 得到值
    int GetVal(){
        return this->m_nVal;
    }

private:
    int m_nVal;
    char m_chVal;
    float m_fVal;
};

int _tmain(int argc, _TCHAR* argv[])
{
    CTest test;

    // 對象大小
    printf("size = %d\n", sizeof(test));

    // 調用成員函數
    int a = test.GetVal();

    return 0;
}

輸出結果以下:

  • 經過VS2005來調試上述代碼,跳轉到反彙編代碼來觀察類內部的結構及C++類的逆向分析。

下是對CTest構造函數的反彙編分析以下:

  • 調用類成員函數的逆向分析

3.包含虛函數的類

二 多態類的逆向分析

相關文章
相關標籤/搜索