1. 程式人生 > >逆向分析c++ vector向量

逆向分析c++ vector向量

vector

測試源碼

#include<stdio.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <list>
#include <map>
using namespace std;

struct MyVector
{
    struct MyVector* pSelf;
    int* pDataStart;
    int* pDataEnd;
    int* pBufEnd;
};

void testVector() {
    // 動態數組,數據存儲在堆內存中
    // 當元素發生改變之後,會動態增加內存。
    vector<int> vecObj;
    vecObj.push_back(1);
    vecObj.push_back(2);
    vecObj.push_back(3);
    vecObj.pop_back();
    vecObj.push_back(4);

    // 遍歷vector
    for (size_t i = 0; i < vecObj.size(); i++)
    {
        printf("vecObj[%d] = %d", i, vecObj[i]);
    }
    // 遍歷vector
    vector<int>::iterator iter = vecObj.begin();
    while (iter != vecObj.end())
    {// iter.operator!=(vecObj.end())
        int n = *iter;
        printf("vecObj i = %d", n);

        int main()
{
    testVector();
    getchar();
    return 0;
}

2.編譯
3.去掉隨機基址(為了容易查找)
技術分享圖片
改為0
技術分享圖片
4.用ida打開 找到 main函數中調用函數
技術分享圖片

技術分享圖片
5.選擇地址用od 載入查看
技術分享圖片
技術分享圖片
技術分享圖片
6.call非常多 只看關鍵的找到 向量的構造函數 與對象基址 找東西用ida 調試用od
技術分享圖片
技術分享圖片
7。運行到下斷處 數據跟隨
技術分享圖片
果然 是cc
技術分享圖片
8。運行構造函數
初始化 (stl對象都有一個特點 第一個總是一個指針指向自己)
技術分享圖片
指向自己
技術分享圖片
技術分享圖片
運行push_back(1)
技術分享圖片
技術分享圖片
進去看看 果然
技術分享圖片
技術分享圖片
那其它倆個字段呢 慢慢來 再push幾個 試試
push 3 個
技術分享圖片
技術分享圖片
再pop一個看看
技術分享圖片
技術分享圖片
沒變 只是第三個字段減小了 而最後一個不變
再push 一個 發現第三個就了最後一個還是不變
技術分享圖片
進入看看
技術分享圖片
原來pop內存不變只是 索引減小
那都表示什麽 呢

第三個 表示為最後一個元素地址 第四個為緩沖區的最後一個元素地址

自己定義一個結構體去解析它
技術分享圖片

逆向分析c++ vector向量