學(xué)習(xí)匯編筑累,可以應(yīng)用在逆向果复、外掛等用途材诽,能幫助我們對計算機運行程序本質(zhì)認(rèn)識得更清楚
前置知識
32位系統(tǒng)與64位系統(tǒng)區(qū)別
- 32位操作系統(tǒng)颤枪,是用32個0汗捡、1來表示1個內(nèi)存單元(字節(jié))地址,即內(nèi)存地址范圍用16進(jìn)制表示為0x00000000 ~ 0xEEEEEEEE,共0xFFFFFFFF個字節(jié)扇住,約等于4GB。
- 64位操作系統(tǒng)锄贼,是用64個0女阀、1來表示1個內(nèi)存單元(字節(jié))地址宅荤,即內(nèi)存地址范圍用16進(jìn)制表示為0x00000000 00000000 ~ 0xEEEEEEEE EEEEEEEE,共0xFFFFFFFF FFFFFFFF個字節(jié)浸策,約等于16EB(16000PB)。目前電腦的地址總線數(shù)量不到64位惫确,即使有這么大的內(nèi)存條也不能完全利用。
虛擬內(nèi)存
操作系統(tǒng)會將內(nèi)存中的物理內(nèi)存映射為虛擬內(nèi)存蚯舱。比如變量a的內(nèi)存地址為0x10000001改化,該地址值為虛擬內(nèi)存地址值。
軟件運行本質(zhì)
大小端模式
- 大端模式枉昏,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中兄裂,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中,這樣的存儲模式有點兒類似于把數(shù)據(jù)當(dāng)作字符串順序處理:地址由小向大增加懦窘,而數(shù)據(jù)從高位往低位放稚配;這和我們的閱讀習(xí)慣一致。
- 小端模式道川,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中冒萄,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中,這種存儲模式將地址的高低和數(shù)據(jù)位權(quán)有效地結(jié)合起來尊流,高地址部分權(quán)值高,低地址部分權(quán)值低逻住。
內(nèi)存劃分
- 內(nèi)核區(qū)瞎访,操作系統(tǒng)占用部分內(nèi)存
- 代碼段,編譯后的代碼存放的區(qū)域
- 數(shù)據(jù)段扒秸,全局變量、靜態(tài)變量存放的地方
- 堆
- 棧
棧平衡
x86 32位棧指針寄存器寄存器:esp写烤、ebp渔伯,對應(yīng)的64位棧指針寄存器寄存器為 rsp、rbp锣吼。函數(shù)調(diào)用完成時,esp古徒、ebp會恢復(fù)到調(diào)用前的位置读恃,實現(xiàn)棧平衡。
- Intel 匯編格式
- esp 棧頂指針
- ebp 當(dāng)前調(diào)用函數(shù)的棧底指針
- AT&T 匯編格式
- esp 調(diào)用當(dāng)前函數(shù)的函數(shù)的棧頂指針
- ebp 調(diào)用當(dāng)前函數(shù)的函數(shù)的棧底指針
編程語言的發(fā)展
匯編
匯編的種類
- x86 AT&T 和 Intel 匯編書寫格式區(qū)別
-
x64 AT&T 和 Intel 匯編書寫格式區(qū)別
寄存器
不同架構(gòu)寄存器是不一樣的,1個寄存器的大小就是當(dāng)前系統(tǒng)1個指針的大小萨驶,32位系統(tǒng)4個字節(jié)艇肴,64位系統(tǒng)8個字節(jié)。
-
x64架構(gòu)寄存器再悼,兼容x86
- arm64 架構(gòu)寄存器
通?寄存器
64bit的:x0 ~ x28
32bit的:w0 ~ w28(屬于x0 ~ x28的低32bit)
x0 ~ x7通常拿來存放函數(shù)的參數(shù)冲九,更多的參數(shù)使?堆棧來傳遞
x0通常拿來存放函數(shù)的返回值程序計數(shù)器
pc(Program Counter)
記錄CPU當(dāng)前指令的是哪?條指令
存儲著當(dāng)前CPU正在執(zhí)?的指令的地址
類似于8086匯編的ip寄存器堆棧指針
sp(Stack Pointer)
fp(Frame Pointer),也就是x29鏈接寄存器
lr(Link Register)咖刃,也就是x30
存儲著函數(shù)的返回地址程序狀態(tài)寄存器
cpsr(Current Program Status Register)
spsr(Saved Program Status Register),異常狀態(tài)下使?
x64 Intel匯編指令
權(quán)威參考:Intel白皮書
x64 AT&T 匯編指令
指令與x64 Intel匯編指令一致,只不過書寫格式有所差異
arm64 匯編指令
官方文檔:Arm? Architecture Reference Manual Armv8, for Armv8-A architecture profile
- mov
- ret
- 函數(shù)返回
- 將lr(x30)寄存器的值賦值給pc寄存器
- add
- sub
- cmp
- 將2個寄存器相減
- 相減的結(jié)果會影響cpsr寄存器的標(biāo)志位
- b
- 跳轉(zhuǎn)指令
- 可以帶條件跳轉(zhuǎn)刨肃,?般跟cmp配合使?
- bl
- 帶返回的跳轉(zhuǎn)指令
- 執(zhí)?的操作
- 將下?條指令的地址存儲到lr(x30)寄存器中
- 跳轉(zhuǎn)到標(biāo)記處開始執(zhí)?代碼
- 條件域
- EQ:equal箩帚,相等
- NE:not equal,不相等
- GT:great than紧帕,?于
- GE:greate equal,?于等于
- LT:less than愈案,?于
- LE:less equal鹅搪,?于等于
- 內(nèi)存操作
- load,從內(nèi)存中讀取數(shù)據(jù)
- ldr丽柿、ldur
- ldp(p是pair的簡稱)
- store,往內(nèi)存中寫?數(shù)據(jù)
- str馁筐、stur
- stp
- 零寄存器坠非,??存儲的值是0
- wzr(32bit,Word Zero Register)
- xzr(64bit)
參考資料