C 反彙編學習筆記(二)

2022-09-05 19:09:11 字數 2819 閱讀 3682

chinese:

1、位址 指標 引用

c++中位址標號用16進製表示,取乙個變數位址使用&操作符,只有變數才存在記憶體位址,常量沒有位址(不包括const定義的偽常量)

指標是一種資料型別,用於儲存各種資料型別在記憶體中的位址。指標變數也可以取出位址,所以會出現多級指標。

c++中引用不可以單獨定義,定義的時候必須初始化。引用表示乙個變數的別名,對它的任何操作,本質都是在操作它所表示的變數。

2、指標和位址的區別

指標是變數,用於儲存變數位址;位址是常量,是記憶體標號。

指標可修改,可以再次儲存其他的變數位址;位址不可修改。

指標可以對其執行取位址操作得到位址;位址不可執行取位址操作。

指標包含對儲存位址的解釋資訊;位址無法解釋資料。

3、各型別指標的工作方式

通過c++的反彙編指令進行描述

// c++ code:

int nvar = 0x12345678;

;為位址賦值4位元組資料12345678h

movdword ptr [ebp-10h], 12345678h

// c++

code:

int *pnvar = &nvar;

leaecx, [ebp-10h]

movdword ptr [ebp-14h], ecx

// c++

code:

char *pcvar = (char*)&nvar

;lea

edx, [ebp-10h]

movdword ptr [ebp-18h], edx

// c++

code:

short *psnvar = (short*)&nvar

;lea

eax, [ebp-10h]

movdword ptr [ebp-1ch], eax

// c++

code:

printf(

"%08x

", *pnvar);

;取出pnvar中儲存的位址值並放入ecx中

movecx, dword ptr [ebp-14h]

movedx, dword ptr [ecx]

;printf函式呼叫部分略

// c++

code:

printf(

"%08x

", *pcvar);

;取出pcvar中儲存的位址值並放入eax中

moveax, dword ptr [ebp-18h]

;從eax儲存的位址中,以1位元組方式讀取資料,存入ecx中

movsx

ecx, byte ptr [eax]

// c++

code:

printf(「%08x

", *psnvar);

;取出psnvar中儲存的位址並放入edx中

mov edx, dword ptr [ebp-1ch]

;從edx儲存的位址中,以2位元組的方式讀取資料,存入eax中

movsx eax, word ptr [edx]

可見指標型別會按照指標型別對位址資料進行解釋。去內容操作一般分為兩個步驟,先取出指標中儲存的位址資訊,然後針對這個位址取內容,也就是乙個間接定址的過程,這也是識別指標的重要依據。

4、了解引用的內部工作原理

實際上引用型別就是指標型別,只不過它用於存放位址的記憶體空間對使用者而言是隱藏的。

// c++ code

int nvar = 0x12345678;

mov dword ptr [ebp-4

], 12345678h

// c++ code

int &nvartype = nvar;

;取出變數nvar的位址放入eax中

lea eax, [ebp-4];

將變數nvar的位址存入位址ebp-8處,這個ebp-8處便是引用型別nvartype的位址

;從這條彙編語句中可以得出結論,引用型別在記憶體中是占有一席之地的

mov dword ptr [ebp-8] eax;

//呼叫函式add,add的引數為int引用型別,將變數nvar作為引數傳遞

add(nvar);

;取出變數nvar的位址放入ecx

lea ecx, [ebp-4];

將ecx作為引數入棧,也就是傳遞變數nvar的位址作為引數

push ecx;

;函式呼叫的指令略

call @ilt+15 (add) (00401014

)add esp, 4

引用型別的儲存方式和指標是一樣的,都是使用記憶體空間存放位址。引用只是通過編譯器實現定址,而指標需要手動定址。

引用型別也可以作為函式的引數型別和返回型別使用。因為引用實際上就是指標,所以它同樣會在引數傳遞時產生乙份拷貝。

// c++ code

void

add(int

&nvar)

;取出引數nvar中的內容放入eax中

mov eax, dword ptr [ebp+8];

對eax執行取內容操作

movecx, dword ptr [eax]

add ecx, 1

mov edx, dword ptr [ebp+8

]mov

dword ptr [edx], ecx

ret

從彙編**中可以看出,引用型別的引數也佔記憶體空間,其中儲存的資料是乙個位址值。取出這個位址中的資料並加1,再將+1後的結果放回。因此,在反彙編下,沒有引用這種資料型別。

C 反彙編學習筆記(一)

chinese c 整數與浮點數的儲存方式 1 整數型別 無符號整數的所有位都用來表示數值,有符號整數的最高位是符號位,其餘位以補碼格式儲存。補碼規則就是用0減去這個數的絕對值 取反加一 首先我們知道x x 反碼 0xffffffff,因此x x 反碼 1 0,因此x 補碼 0 x x 反碼 1。補...

學習筆記 2011 07 03 反彙編

include using namespace std int main 00c514e6 jmp main 27h 0c514a7h int a 0 00c514e8 mov dword ptr a 0 return 0 00c514ef xor eax,eax 00c514f1 pop edi ...

彙編學習筆記 對抗反彙編實驗2019092801

使用相連的jz和jnz指令跳轉到緊接著jnz指令的call指令的第二個位元組。call指令實際上無效。驗證ida在反彙編時會識別出call指令。作業系統 windows 7 安裝於virtualbox中的虛擬機器 編輯器 sublime text 3 編譯器 masm32 除錯 反彙編工具 olly...