【逆向工具】IDA使用3-全局變量、數組、結構體

全局變量

測試代碼

全局變量既能夠是某對象函數建立,也能夠是在本程序任何地方建立。全局變量是能夠被本程序全部對象或函數引用。下面這段代碼中將int、float、char變量定義在main函數以外。數組

// 變量.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"

//全局變量
// 整型
int a_nNum = 22;

// 浮點型
float fNum = 2.5;

// 字符型
char ch = 'A';

int main()
{
    // 整型
    int nNum = 1;

    printf("int %d ,int %d, float %f ,char %c", a_nNum, nNum, fNum, ch);

    return 0;
}

VS反彙編結果

IDA反彙編結果

局部變量標識區只有ver_8一個變量,而全局變量則集中保存在.data區域。IDA幫咱們識別出變量的類型,byte、dword,雙擊變量能夠看到數據的定義。app

雙擊全局變量能夠進入全局變量存放區,根據右鍵顯示的數據能夠修更名稱。函數

數組

測試代碼

#include "stdafx.h"

int main()
{
    int nArr[5] = { 1,2,3,4,5 };
    int n = 2;
    nArr[n] = 20;

    return 0;
}

VS反彙編結果

當在函數內定義數組時候,若是沒有其餘聲明,該數組即爲局部變量,擁有局部變量的全部特性,數組中的數據在內存中的存儲是線性連續的,其數據排列順序由低地址到高地址。數組名稱表示該數組的首地址。工具

這是數組在內存中的數據分佈的樣子測試

IDA反彙編結果

數組中的各項元素均爲同一類型的數據,而局部變量賦值時的類型都不相同。根據此特徵便可判斷局部變量不是數組中的元素。在尋址的過程當中,數組不一樣於局部變量,不會由於被賦予了常量值而使用常量傳播。3d

在IDA中反彙編代碼中,能夠看出連續使用了5個4字節的內存地址,依次賦值整型數據一、二、三、四、5。雙擊標號「var_18」定位到標號定義處,在IDA下單擊此標號,按鍵盤上的「*」或者右鍵【Array】將連續的變量定義爲數組。code

新建一個數組定義,大小設置爲5對象

回到反彙編視圖,選取"var_18「並使用快捷鍵"N」鍵將標號從新命名爲「nAarray」,程序中全部用到該數組標號的地方將所有被修改。blog

IDA中F5後可看到的源代碼,這款靜態分析工具果然是牛逼。內存

結構體

測試代碼

#include "stdafx.h"

//定義結構體
struct MyStruct
{
    int nNum;
    float fNum;
    char chA;

};

void Print(MyStruct stc) 
{
    printf("int %d , y %f , z %c",stc.nNum,stc.fNum,stc.chA);
}

int main()
{
        //結構體初始化
    MyStruct stc = { 1,2.2,'A' };
    stc.fNum = 5.5;
    Print(stc);
    return 0;
}

VS反彙編結果

IDA反彙編結果

在反彙編結果中,初始化賦值整型變量、浮點型變量、字符型變量,而函數體內浮點型變量是賦值了第二次的。熟記結構體中全部變量都共享一片內存的特性,在反彙編中識別出結構體則在於三個變量一塊兒傳入了堆棧。逆向過程當中更主要是靠猜,不對的話咱們再改回來。並且改以前必定要有想法,知道本身要作什麼。

爲了使反彙編更利於逆向中的閱讀,咱們首先在結構體窗口點擊【insert】鍵插入一個結構體

選擇結構體的ends部分,點擊快捷鍵【d】,增長結構體變量

00000001 struc_1         ends

增長三個變量,使用快捷鍵【n】將三個變量更名。這裏要注意基礎數據類型都爲DD,不然有可能致使數據類型不匹配出現兩個結構體問題。

00000000 struc_5         struc ; (sizeof=0x4, mappedto_25)
00000000 nNum            dd?
00000001 fNum            dd?
00000003 chA               dd?
00000004 struc_5         ends

回到反彙編窗口,雙擊變量。到 stack of sub_xxx(局部堆棧) 窗口下將變量轉換成結構體類型
可使用快捷鍵【alt+Q】,轉換成指定結構體。

使用結構體解析變量後,能夠看到反彙編窗口中變量以結構體形式顯示。F5大法後還原高度仿真的僞C代碼