64位軟件逆向技術
寄存器
64位通用寄存器的名稱第一個字母從'E'改為'R',大小擴展到64位,數量增加了8個(R8~R15),擴充了8個128位的XMM寄存器谣光。
函數
- 函數調用約定
- x86應用程序的函數調用有stdcall执虹、__cdecl、Fastcall等方式,但x64應用程序就只有一種寄存器快速調用約定。
- 前四個用寄存器傳遞恕曲,超過四個多余的參數就放在棧里,入棧順序從右到左叉存。
- 前四個參數存放的寄存器是固定的,分別是RCX码俩、RDX、R8歼捏、R9.
- 任何大于8字節(jié)或者不是1字節(jié)、2字節(jié)笨篷、4字節(jié)瞳秽、8字節(jié)的參數必須由引用來傳遞(地址傳遞)
- 所有浮點參數的傳遞都是使用XMM寄存器完成的。(在XMM0率翅、XMM1练俐、XMM2、XMM3)
函數的四個參數雖然使用寄存器來傳遞冕臭,但是棧仍然為這4個參數預留了空間(32字節(jié))腺晾。
且函數執(zhí)行體內一般將參數值填充進預留棧空間內并進行數據填充辜贵。
參數使用的椕醪酰空間由函數調用者負責平衡。
64位環(huán)境下托慨,使用RAX寄存器來保存函數返回值鼻由。(返回值類型由浮點類型使用MMX0寄存器返回)。
結構體
-
參數不超過八字節(jié)
傳遞結構體參數時厚棵,直接將結構體內容放在寄存器里蕉世。通過訪問寄存器高位和低位分別訪問結構體成員。 -
參數超過八字節(jié)
傳遞參數時婆硬,會先將結構內容復制到椇萸幔空間中,再把結構體地址當成函數的參數來傳遞(引用傳遞)彬犯。在函數內部通過“結構體地址+偏移”的方式訪問結構體內容向楼。
數據結構
局部變量
預留棧空間在低地址躏嚎,局部變量空間在高地址蜜自。全局變量
先定義的在低地址,后定義的在高地址卢佣。-
數組
數組從低地址到高地址進行順序排列的重荠。
數組占用大小 :sizeof(類型) * 個數
尋址公式:數組元素的地址 = 數組首地址 + sizeof(數組類型) * 下標
多維數組也可以看成一個一維數組。
二維尋址公式:數組元素地址 = 數組首地址 + sizeof(一維數組類型)*下標1+sizeof(數組類型)*下標2
訪問二維數組特征:
[數組首地址 + n]
[數組收地址 + 寄存器 * n]